)]}'
{"nova/api/openstack/placement/handlers/allocation_candidate.py":[{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"a7b4d8873d770eefccb4a767543a94d0325ee0c1","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    \"type\": \"object\","},{"line_number":34,"context_line":"    \"properties\": {"},{"line_number":35,"context_line":"        \"resources\": {"},{"line_number":36,"context_line":"            \"type\": \"string\""},{"line_number":37,"context_line":"        },"},{"line_number":38,"context_line":"    },"},{"line_number":39,"context_line":"    \"required\": ["}],"source_content_type":"text/x-python","patch_set":2,"id":"7f231b9d_792663bd","line":36,"updated":"2017-06-19 18:50:27.000000000","message":"Should we add traits in here now, since we know we will need them? Or do that in a later microversion?","commit_id":"32bb05370e055607c2e223af875de5332279e776"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1c898eab2863c8c3b8e7278a3b8891c2ab512069","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    \"type\": \"object\","},{"line_number":34,"context_line":"    \"properties\": {"},{"line_number":35,"context_line":"        \"resources\": {"},{"line_number":36,"context_line":"            \"type\": \"string\""},{"line_number":37,"context_line":"        },"},{"line_number":38,"context_line":"    },"},{"line_number":39,"context_line":"    \"required\": ["}],"source_content_type":"text/x-python","patch_set":2,"id":"7f231b9d_9c4fed33","line":36,"in_reply_to":"7f231b9d_792663bd","updated":"2017-06-19 19:01:20.000000000","message":"Later microversion...","commit_id":"32bb05370e055607c2e223af875de5332279e776"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"a7b4d8873d770eefccb4a767543a94d0325ee0c1","unresolved":false,"context_lines":[{"line_number":43,"context_line":"}"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def _transform_allocation_requests(alloc_reqs):"},{"line_number":47,"context_line":"    \"\"\"Turn supplied list of AllocationRequest objects into a list of dicts of"},{"line_number":48,"context_line":"    resources involved in the allocation request. The returned results is"},{"line_number":49,"context_line":"    intended to be able to be used as the body of a PUT"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f231b9d_192bef30","line":46,"updated":"2017-06-19 18:50:27.000000000","message":"Would it make more sense to have this and the next 2 methods be methods of their respective objects? Then here just call each\u0027s to_dict() method (or whatever name we give them).","commit_id":"32bb05370e055607c2e223af875de5332279e776"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1c898eab2863c8c3b8e7278a3b8891c2ab512069","unresolved":false,"context_lines":[{"line_number":43,"context_line":"}"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def _transform_allocation_requests(alloc_reqs):"},{"line_number":47,"context_line":"    \"\"\"Turn supplied list of AllocationRequest objects into a list of dicts of"},{"line_number":48,"context_line":"    resources involved in the allocation request. The returned results is"},{"line_number":49,"context_line":"    intended to be able to be used as the body of a PUT"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f231b9d_fc714179","line":46,"in_reply_to":"7f231b9d_192bef30","updated":"2017-06-19 19:01:20.000000000","message":"This is how all other handlers do things, so I\u0027d prefer to keep it consistent.","commit_id":"32bb05370e055607c2e223af875de5332279e776"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"5d9650e1cc1b7ce9561e7dc8ab7fec84b9afb4a7","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            {\u0027exc\u0027: exc})"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    filters \u003d {}"},{"line_number":150,"context_line":"    if \u0027resources\u0027 in req.GET:"},{"line_number":151,"context_line":"        resources \u003d util.normalize_resources_qs_param(req.GET[\u0027resources\u0027])"},{"line_number":152,"context_line":"        filters[\u0027resources\u0027] \u003d resources"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5f201791_7121afb4","line":150,"range":{"start_line":150,"start_character":4,"end_line":150,"end_character":30},"updated":"2017-06-21 17:14:12.000000000","message":"Is this check necessary, given the schema requires that it be in the request?","commit_id":"e5e5a10075532840cd3db68e73d3c3ef5b7889d3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"95b54f962067020d5a91e65a14cdd5f8a37052ed","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            {\u0027exc\u0027: exc})"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    filters \u003d {}"},{"line_number":150,"context_line":"    if \u0027resources\u0027 in req.GET:"},{"line_number":151,"context_line":"        resources \u003d util.normalize_resources_qs_param(req.GET[\u0027resources\u0027])"},{"line_number":152,"context_line":"        filters[\u0027resources\u0027] \u003d resources"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5f201791_a72ca547","line":150,"range":{"start_line":150,"start_character":4,"end_line":150,"end_character":30},"in_reply_to":"5f201791_7121afb4","updated":"2017-06-21 17:53:38.000000000","message":"yup, will remove. copy/paste...","commit_id":"e5e5a10075532840cd3db68e73d3c3ef5b7889d3"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"5d9650e1cc1b7ce9561e7dc8ab7fec84b9afb4a7","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            {\u0027error\u0027: exc})"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    response \u003d req.response"},{"line_number":164,"context_line":"    response.body \u003d encodeutils.to_utf8("},{"line_number":165,"context_line":"        jsonutils.dumps("},{"line_number":166,"context_line":"            _transform_allocation_candidates("},{"line_number":167,"context_line":"                candidates,"},{"line_number":168,"context_line":"            ),"},{"line_number":169,"context_line":"        ),"},{"line_number":170,"context_line":"    )"},{"line_number":171,"context_line":"    response.content_type \u003d \u0027application/json\u0027"},{"line_number":172,"context_line":"    return response"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f201791_8c69cebf","line":170,"range":{"start_line":164,"start_character":0,"end_line":170,"end_character":5},"updated":"2017-06-21 17:14:12.000000000","message":"I know you love your rambling indentations, but this would be much clearer as:\n\n    data \u003d  _transform_allocation_candidates(candidates)\n    json_data \u003d jsonutils.dumps(data)\n    response.body \u003d encodeutils.to_utf8(json_data)","commit_id":"e5e5a10075532840cd3db68e73d3c3ef5b7889d3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"95b54f962067020d5a91e65a14cdd5f8a37052ed","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            {\u0027error\u0027: exc})"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    response \u003d req.response"},{"line_number":164,"context_line":"    response.body \u003d encodeutils.to_utf8("},{"line_number":165,"context_line":"        jsonutils.dumps("},{"line_number":166,"context_line":"            _transform_allocation_candidates("},{"line_number":167,"context_line":"                candidates,"},{"line_number":168,"context_line":"            ),"},{"line_number":169,"context_line":"        ),"},{"line_number":170,"context_line":"    )"},{"line_number":171,"context_line":"    response.content_type \u003d \u0027application/json\u0027"},{"line_number":172,"context_line":"    return response"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f201791_8721a950","line":170,"range":{"start_line":164,"start_character":0,"end_line":170,"end_character":5},"in_reply_to":"5f201791_8c69cebf","updated":"2017-06-21 17:53:38.000000000","message":"sure, will do.","commit_id":"e5e5a10075532840cd3db68e73d3c3ef5b7889d3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5e4289d963c3473ef8da8fc7e28772e6d2c214e4","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    }"},{"line_number":110,"context_line":"    \"\"\""},{"line_number":111,"context_line":"    return {"},{"line_number":112,"context_line":"        ps.resource_provider.uuid: {"},{"line_number":113,"context_line":"            \u0027resources\u0027: {"},{"line_number":114,"context_line":"                psr.resource_class: {"},{"line_number":115,"context_line":"                    \u0027capacity\u0027: psr.capacity,"},{"line_number":116,"context_line":"                    \u0027used\u0027: psr.used,"},{"line_number":117,"context_line":"                } for psr in ps.resources"},{"line_number":118,"context_line":"            }"},{"line_number":119,"context_line":"        } for ps in p_sums"},{"line_number":120,"context_line":"    }"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_b8d00321","line":119,"range":{"start_line":112,"start_character":0,"end_line":119,"end_character":9},"updated":"2017-06-23 15:59:55.000000000","message":"Just a thought: it might be neat if ProviderSummary had a to_dict method that did this part of the work.  (Though looking through nova.objects.resource_provider, it kinda appears that maybe this is \"not done\" for some reason.)\n\nSimilar comment applies to the other methods like this one.","commit_id":"b6442abc9030fc05f3a81c67fa62888b5e6d30cc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5e4289d963c3473ef8da8fc7e28772e6d2c214e4","unresolved":false,"context_lines":[{"line_number":150,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":151,"context_line":"    schema \u003d _GET_SCHEMA_1_8"},{"line_number":152,"context_line":"    try:"},{"line_number":153,"context_line":"        jsonschema.validate(dict(req.GET), schema,"},{"line_number":154,"context_line":"                            format_checker\u003djsonschema.FormatChecker())"},{"line_number":155,"context_line":"    except jsonschema.ValidationError as exc:"},{"line_number":156,"context_line":"        raise webob.exc.HTTPBadRequest("}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_b8d123fe","line":153,"range":{"start_line":153,"start_character":28,"end_line":153,"end_character":32},"updated":"2017-06-23 15:59:55.000000000","message":"Why the shallow copy?  Is jsonschema.validate destructive?  Or is req.GET somehow not a real dict?","commit_id":"b6442abc9030fc05f3a81c67fa62888b5e6d30cc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"98b73d0a21cc27014e4dfcb95d8f679fa27bc327","unresolved":false,"context_lines":[{"line_number":150,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":151,"context_line":"    schema \u003d _GET_SCHEMA_1_8"},{"line_number":152,"context_line":"    try:"},{"line_number":153,"context_line":"        jsonschema.validate(dict(req.GET), schema,"},{"line_number":154,"context_line":"                            format_checker\u003djsonschema.FormatChecker())"},{"line_number":155,"context_line":"    except jsonschema.ValidationError as exc:"},{"line_number":156,"context_line":"        raise webob.exc.HTTPBadRequest("}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_c3e070fd","line":153,"range":{"start_line":153,"start_character":28,"end_line":153,"end_character":32},"in_reply_to":"5f201791_b8d123fe","updated":"2017-06-23 16:17:56.000000000","message":"Yeah, good ol\u0027 webob. req.GET is not a real dict.","commit_id":"b6442abc9030fc05f3a81c67fa62888b5e6d30cc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5e4289d963c3473ef8da8fc7e28772e6d2c214e4","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            {\u0027exc\u0027: exc})"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    filters \u003d {}"},{"line_number":161,"context_line":"    if \u0027resources\u0027 in req.GET:"},{"line_number":162,"context_line":"        resources \u003d util.normalize_resources_qs_param(req.GET[\u0027resources\u0027])"},{"line_number":163,"context_line":"        filters[\u0027resources\u0027] \u003d resources"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    try:"},{"line_number":166,"context_line":"        candidates \u003d rp_obj.AllocationCandidates.get_by_filters("},{"line_number":167,"context_line":"            context, filters"},{"line_number":168,"context_line":"        )"},{"line_number":169,"context_line":"    except exception.ResourceClassNotFound as exc:"},{"line_number":170,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":171,"context_line":"            _(\u0027Invalid resource class in resources parameter: %(error)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_78acab33","line":168,"range":{"start_line":161,"start_character":0,"end_line":168,"end_character":9},"updated":"2017-06-23 15:59:55.000000000","message":"Looks like this will raise ValueError if filters \u003d\u003d {} (i.e. \u0027resources\u0027 not in req.GET, or malformed/empty).  Do you want to translate that to HTTPBadRequest?\n\n[Later] Actually, looks like \u0027resources\u0027 is required by the schema, so `if \u0027resources\u0027 in req.GET` should be redundant.  Still need to handle `filters \u003d {}`, though, because normalize_resources_qs_param will accept `resources\u003d` (i.e. empty).","commit_id":"b6442abc9030fc05f3a81c67fa62888b5e6d30cc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"98b73d0a21cc27014e4dfcb95d8f679fa27bc327","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            {\u0027exc\u0027: exc})"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    filters \u003d {}"},{"line_number":161,"context_line":"    if \u0027resources\u0027 in req.GET:"},{"line_number":162,"context_line":"        resources \u003d util.normalize_resources_qs_param(req.GET[\u0027resources\u0027])"},{"line_number":163,"context_line":"        filters[\u0027resources\u0027] \u003d resources"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    try:"},{"line_number":166,"context_line":"        candidates \u003d rp_obj.AllocationCandidates.get_by_filters("},{"line_number":167,"context_line":"            context, filters"},{"line_number":168,"context_line":"        )"},{"line_number":169,"context_line":"    except exception.ResourceClassNotFound as exc:"},{"line_number":170,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":171,"context_line":"            _(\u0027Invalid resource class in resources parameter: %(error)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_43ec60f2","line":168,"range":{"start_line":161,"start_character":0,"end_line":168,"end_character":9},"in_reply_to":"5f201791_78acab33","updated":"2017-06-23 16:17:56.000000000","message":"Yeah, ed brought that point up on an earlier patch. Will correct.","commit_id":"b6442abc9030fc05f3a81c67fa62888b5e6d30cc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5e4289d963c3473ef8da8fc7e28772e6d2c214e4","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    response \u003d req.response"},{"line_number":175,"context_line":"    response.body \u003d encodeutils.to_utf8("},{"line_number":176,"context_line":"        jsonutils.dumps("},{"line_number":177,"context_line":"            _transform_allocation_candidates("},{"line_number":178,"context_line":"                candidates,"},{"line_number":179,"context_line":"            ),"},{"line_number":180,"context_line":"        ),"},{"line_number":181,"context_line":"    )"},{"line_number":182,"context_line":"    response.content_type \u003d \u0027application/json\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_78502b5e","line":179,"range":{"start_line":177,"start_character":45,"end_line":179,"end_character":12},"updated":"2017-06-23 15:59:55.000000000","message":"Why the line breaks?  (And the comma after \u0027candidates\u0027? This ain\u0027t a tuple.)","commit_id":"b6442abc9030fc05f3a81c67fa62888b5e6d30cc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"98b73d0a21cc27014e4dfcb95d8f679fa27bc327","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    response \u003d req.response"},{"line_number":175,"context_line":"    response.body \u003d encodeutils.to_utf8("},{"line_number":176,"context_line":"        jsonutils.dumps("},{"line_number":177,"context_line":"            _transform_allocation_candidates("},{"line_number":178,"context_line":"                candidates,"},{"line_number":179,"context_line":"            ),"},{"line_number":180,"context_line":"        ),"},{"line_number":181,"context_line":"    )"},{"line_number":182,"context_line":"    response.content_type \u003d \u0027application/json\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_23bde4d7","line":179,"range":{"start_line":177,"start_character":45,"end_line":179,"end_character":12},"in_reply_to":"5f201791_78502b5e","updated":"2017-06-23 16:17:56.000000000","message":"Done","commit_id":"b6442abc9030fc05f3a81c67fa62888b5e6d30cc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1f0f5adee6ad462f64423c350f0f2d3791211af5","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            _(\u0027Invalid query string parameters: %(exc)s\u0027) %"},{"line_number":158,"context_line":"            {\u0027exc\u0027: exc})"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    resources \u003d util.normalize_resources_qs_param(req.GET[\u0027resources\u0027])"},{"line_number":161,"context_line":"    filters \u003d {"},{"line_number":162,"context_line":"        \u0027resources\u0027: resources,"},{"line_number":163,"context_line":"    }"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    try:"},{"line_number":166,"context_line":"        candidates \u003d rp_obj.AllocationCandidates.get_by_filters("},{"line_number":167,"context_line":"            context, filters"},{"line_number":168,"context_line":"        )"},{"line_number":169,"context_line":"    except exception.ResourceClassNotFound as exc:"},{"line_number":170,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":171,"context_line":"            _(\u0027Invalid resource class in resources parameter: %(error)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f201791_0e2fa83f","line":168,"range":{"start_line":160,"start_character":0,"end_line":168,"end_character":9},"updated":"2017-06-23 20:27:26.000000000","message":"This will still raise ValueError if req.GET[\u0027resources\u0027] is \u0027\u0027 (empty string).  That\u0027s not caught by the schema validation.\n\nhttp://paste.openstack.org/show/613551/","commit_id":"e5551f90fc8fc3bb629fb8cbde2cb10dbc65cc5f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e19f741d8dc26364568e7398fbafca84ac70074a","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            _(\u0027Invalid query string parameters: %(exc)s\u0027) %"},{"line_number":158,"context_line":"            {\u0027exc\u0027: exc})"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    resources \u003d util.normalize_resources_qs_param(req.GET[\u0027resources\u0027])"},{"line_number":161,"context_line":"    filters \u003d {"},{"line_number":162,"context_line":"        \u0027resources\u0027: resources,"},{"line_number":163,"context_line":"    }"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    try:"},{"line_number":166,"context_line":"        candidates \u003d rp_obj.AllocationCandidates.get_by_filters("},{"line_number":167,"context_line":"            context, filters"},{"line_number":168,"context_line":"        )"},{"line_number":169,"context_line":"    except exception.ResourceClassNotFound as exc:"},{"line_number":170,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":171,"context_line":"            _(\u0027Invalid resource class in resources parameter: %(error)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f201791_31464951","line":168,"range":{"start_line":160,"start_character":0,"end_line":168,"end_character":9},"in_reply_to":"5f201791_0e2fa83f","updated":"2017-06-23 21:02:20.000000000","message":"Thanks, addressed by https://review.openstack.org/#/c/477019/1 at the front of the series.","commit_id":"e5551f90fc8fc3bb629fb8cbde2cb10dbc65cc5f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6b0bf23d9049ccf4a3799d1bbc1be688f3e15ccf","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    }"},{"line_number":132,"context_line":"    \"\"\""},{"line_number":133,"context_line":"    return {"},{"line_number":134,"context_line":"        \u0027allocation_requests\u0027: _transform_allocation_requests("},{"line_number":135,"context_line":"            alloc_candidates.allocation_requests,"},{"line_number":136,"context_line":"        ),"},{"line_number":137,"context_line":"        \u0027provider_summaries\u0027: _transform_provider_summaries("},{"line_number":138,"context_line":"            alloc_candidates.provider_summaries,"},{"line_number":139,"context_line":"        ),"},{"line_number":140,"context_line":"    }"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"@wsgi_wrapper.PlacementWsgify"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f201791_e4e9bbe2","line":140,"range":{"start_line":134,"start_character":0,"end_line":140,"end_character":1},"updated":"2017-06-28 12:17:56.000000000","message":"trailing commas/parens","commit_id":"2f5c9be5ea8c8c9f004ea1452a395ae48ab4b767"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3430c8e1a3e8e694fdd42d390f90d7f2098aa4bb","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    \"\"\""},{"line_number":133,"context_line":"    return {"},{"line_number":134,"context_line":"        \u0027allocation_requests\u0027: _transform_allocation_requests("},{"line_number":135,"context_line":"            alloc_candidates.allocation_requests,"},{"line_number":136,"context_line":"        ),"},{"line_number":137,"context_line":"        \u0027provider_summaries\u0027: _transform_provider_summaries("},{"line_number":138,"context_line":"            alloc_candidates.provider_summaries,"},{"line_number":139,"context_line":"        )}"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f201791_5e6832f3","line":136,"range":{"start_line":135,"start_character":0,"end_line":136,"end_character":10},"updated":"2017-06-28 18:26:24.000000000","message":"here","commit_id":"1f470e7e4bb3afd2ce598f747ec5c795654f0865"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3430c8e1a3e8e694fdd42d390f90d7f2098aa4bb","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            alloc_candidates.allocation_requests,"},{"line_number":136,"context_line":"        ),"},{"line_number":137,"context_line":"        \u0027provider_summaries\u0027: _transform_provider_summaries("},{"line_number":138,"context_line":"            alloc_candidates.provider_summaries,"},{"line_number":139,"context_line":"        )}"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"@wsgi_wrapper.PlacementWsgify"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f201791_de7322e6","line":139,"range":{"start_line":138,"start_character":0,"end_line":139,"end_character":10},"updated":"2017-06-28 18:26:24.000000000","message":"here","commit_id":"1f470e7e4bb3afd2ce598f747ec5c795654f0865"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"61596fd61395f8748cd856a97cbfb3cab02fde9b","unresolved":false,"context_lines":[{"line_number":35,"context_line":"_GET_SCHEMA_1_10 \u003d {"},{"line_number":36,"context_line":"    \"type\": \"object\","},{"line_number":37,"context_line":"    \"properties\": {"},{"line_number":38,"context_line":"        \"resources\": {"},{"line_number":39,"context_line":"            \"type\": \"string\"}},"},{"line_number":40,"context_line":"    \"required\": [\"resources\"],"},{"line_number":41,"context_line":"    \"additionalProperties\": False}"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_757d1b1b","line":39,"range":{"start_line":38,"start_character":7,"end_line":39,"end_character":31},"updated":"2017-06-30 07:00:33.000000000","message":"OK matches 1.4:\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/nova/api/openstack/placement/handlers/resource_provider.py#n79\n\ngood","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"61596fd61395f8748cd856a97cbfb3cab02fde9b","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \"properties\": {"},{"line_number":38,"context_line":"        \"resources\": {"},{"line_number":39,"context_line":"            \"type\": \"string\"}},"},{"line_number":40,"context_line":"    \"required\": [\"resources\"],"},{"line_number":41,"context_line":"    \"additionalProperties\": False}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_629fa350","line":40,"updated":"2017-06-30 07:00:33.000000000","message":"So filtering is required? I guess it doesn\u0027t make sense to not filter for what this is used for, unlike GET /resource_providers.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"273a7e733dc4a6354a5964c5984738a7e9146e75","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \"properties\": {"},{"line_number":38,"context_line":"        \"resources\": {"},{"line_number":39,"context_line":"            \"type\": \"string\"}},"},{"line_number":40,"context_line":"    \"required\": [\"resources\"],"},{"line_number":41,"context_line":"    \"additionalProperties\": False}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_aa3d82bc","line":40,"in_reply_to":"3f1d235d_5f06b188","updated":"2017-06-30 15:28:25.000000000","message":"Yes, planning that for later.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"958c99ff1e07fa1410b2d105ebec43b811c092fe","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \"properties\": {"},{"line_number":38,"context_line":"        \"resources\": {"},{"line_number":39,"context_line":"            \"type\": \"string\"}},"},{"line_number":40,"context_line":"    \"required\": [\"resources\"],"},{"line_number":41,"context_line":"    \"additionalProperties\": False}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_5f06b188","line":40,"in_reply_to":"3f1d235d_629fa350","updated":"2017-06-30 13:40:12.000000000","message":"I thought the proposed spec was accepting other attributes, like uuid and required ? I guess you\u0027re planning that for later then ? Fine by me.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"61596fd61395f8748cd856a97cbfb3cab02fde9b","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    /allocations/{consumer_uuid} HTTP request, so therefore we return a list of"},{"line_number":49,"context_line":"    JSON objects that looks like the following:"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    ["},{"line_number":52,"context_line":"        {"},{"line_number":53,"context_line":"            \"allocations\": ["},{"line_number":54,"context_line":"                {"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_f5048bc8","line":51,"range":{"start_line":51,"start_character":3,"end_line":51,"end_character":5},"updated":"2017-06-30 07:00:33.000000000","message":"I\u0027m not quite sure why the top-level element is a list of dicts.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e19cb3710018dc7d06e7ab23e483e23b84de6753","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    /allocations/{consumer_uuid} HTTP request, so therefore we return a list of"},{"line_number":49,"context_line":"    JSON objects that looks like the following:"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    ["},{"line_number":52,"context_line":"        {"},{"line_number":53,"context_line":"            \"allocations\": ["},{"line_number":54,"context_line":"                {"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_ca279e12","line":51,"range":{"start_line":51,"start_character":3,"end_line":51,"end_character":5},"in_reply_to":"3f1d235d_f5048bc8","updated":"2017-06-30 15:33:20.000000000","message":"Keep in mind that a single allocation can be against multiple resource providers.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"61596fd61395f8748cd856a97cbfb3cab02fde9b","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    {"},{"line_number":86,"context_line":"       RP_UUID_1: {"},{"line_number":87,"context_line":"           \u0027resources\u0027: {"},{"line_number":88,"context_line":"              \u0027DISK_GB\u0027: 4,"},{"line_number":89,"context_line":"              \u0027VCPU\u0027: 2"},{"line_number":90,"context_line":"           }"},{"line_number":91,"context_line":"       },"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_35bfa3fc","line":88,"range":{"start_line":88,"start_character":25,"end_line":88,"end_character":26},"updated":"2017-06-30 07:00:33.000000000","message":"This doesn\u0027t match the actual value, which is a dict with keys \u0027capacity\u0027 and \u0027used\u0027. Could be fixed up afterward.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"273a7e733dc4a6354a5964c5984738a7e9146e75","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    {"},{"line_number":86,"context_line":"       RP_UUID_1: {"},{"line_number":87,"context_line":"           \u0027resources\u0027: {"},{"line_number":88,"context_line":"              \u0027DISK_GB\u0027: 4,"},{"line_number":89,"context_line":"              \u0027VCPU\u0027: 2"},{"line_number":90,"context_line":"           }"},{"line_number":91,"context_line":"       },"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_0aa59604","line":88,"range":{"start_line":88,"start_character":25,"end_line":88,"end_character":26},"in_reply_to":"3f1d235d_35bfa3fc","updated":"2017-06-30 15:28:25.000000000","message":"Good catch. Copy/paste error, sorry. Will fix up.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"958c99ff1e07fa1410b2d105ebec43b811c092fe","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    {"},{"line_number":86,"context_line":"       RP_UUID_1: {"},{"line_number":87,"context_line":"           \u0027resources\u0027: {"},{"line_number":88,"context_line":"              \u0027DISK_GB\u0027: 4,"},{"line_number":89,"context_line":"              \u0027VCPU\u0027: 2"},{"line_number":90,"context_line":"           }"},{"line_number":91,"context_line":"       },"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_7ff04d91","line":88,"range":{"start_line":88,"start_character":25,"end_line":88,"end_character":26},"in_reply_to":"3f1d235d_35bfa3fc","updated":"2017-06-30 13:40:12.000000000","message":"What Matt said.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"61596fd61395f8748cd856a97cbfb3cab02fde9b","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    allocation requests and provider summaries."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    {"},{"line_number":117,"context_line":"        \u0027allocation_requests\u0027: \u003cALLOC_REQUESTS\u003e,"},{"line_number":118,"context_line":"        \u0027provider_summaries\u0027: \u003cPROVIDER_SUMMARIES\u003e,"},{"line_number":119,"context_line":"    }"},{"line_number":120,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_b5b5f3f0","line":117,"range":{"start_line":117,"start_character":32,"end_line":117,"end_character":46},"updated":"2017-06-30 07:00:33.000000000","message":"So this is a list of dicts with a single \u0027allocations\u0027 key which maps to a list of dicts for allocation requests. Seems this one could be flattened so we could have:\n\n{\n   \u0027allocation_requests\u0027: [\n       {\n           \"resource_provider\": {\n               \"uuid\": $rp_uuid,\n           }\n           \"resources\": {\n               $resource_class: $requested_amount, ...\n           },\n       }, ...\n    ],\n   \u0027provider_summaries\u0027: {\n       RP_UUID_1: {\n           \u0027resources\u0027: {\n              \u0027DISK_GB\u0027: 4,\n              \u0027VCPU\u0027: 2\n           }\n       },\n       RP_UUID_2: {\n           \u0027resources\u0027: {\n              \u0027DISK_GB\u0027: 6,\n              \u0027VCPU\u0027: 3\n           }\n       }\n    }\n}","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"07167bf4c5b401a0a28d29710c352bb59ed6861e","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    allocation requests and provider summaries."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    {"},{"line_number":117,"context_line":"        \u0027allocation_requests\u0027: \u003cALLOC_REQUESTS\u003e,"},{"line_number":118,"context_line":"        \u0027provider_summaries\u0027: \u003cPROVIDER_SUMMARIES\u003e,"},{"line_number":119,"context_line":"    }"},{"line_number":120,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_0a8356ce","line":117,"range":{"start_line":117,"start_character":32,"end_line":117,"end_character":46},"in_reply_to":"3f1d235d_4abcaedb","updated":"2017-06-30 15:34:02.000000000","message":"The scheduler needs to view them as non-opaque because it needs to weigh them. But once it has done that, it can take two of them as alternates, and after that, the cell conductor can consider them to be opaque when trying to claim for the reschedule. Right?\n\nThe opacity is important only for the non-scheduler could-be-older service that just needs to claim for the retry.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"273a7e733dc4a6354a5964c5984738a7e9146e75","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    allocation requests and provider summaries."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    {"},{"line_number":117,"context_line":"        \u0027allocation_requests\u0027: \u003cALLOC_REQUESTS\u003e,"},{"line_number":118,"context_line":"        \u0027provider_summaries\u0027: \u003cPROVIDER_SUMMARIES\u003e,"},{"line_number":119,"context_line":"    }"},{"line_number":120,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_4abcaedb","line":117,"range":{"start_line":117,"start_character":32,"end_line":117,"end_character":46},"in_reply_to":"3f1d235d_b5b5f3f0","updated":"2017-06-30 15:28:25.000000000","message":"That is how I originally did things. But then I realized that the PUT /allocations/{consumer_uuid} HTTP request body structure looked like this:\n\n {\n   \"allocations\": {\n     \"resource_provider\": {\n       \"uuid\": \u003cUUID\u003e,\n     }\n     \"resources\": {\n       \"DISK_GB\": 100, ...\n     }\n   },\n   \"project_id\": \u003cUUID\u003e,\n   \"user_id\": \u003cUUID\u003e,\n }\n\nso I just decided to make those sections exactly what the HTTP request body should be (minus the project and user ID of course, since that\u0027s not known). Essentially making these opaque blobs that should be passable pretty much as-is to PUT /allocations/{consumer_uuid}\n\nThis concept of an opaque blob is what dansmith and I discussed on the etherpad and spec.\n\nThat said, you\u0027ll note that the claim patch following this one actually treats the returned allocation_requests list of things not as opaque blobs but rather unpacks them and searches through them to find the first allocation request that contains the resource provider UUID that the scheduler selected. So... in short, I could go either way.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"61596fd61395f8748cd856a97cbfb3cab02fde9b","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    {"},{"line_number":117,"context_line":"        \u0027allocation_requests\u0027: \u003cALLOC_REQUESTS\u003e,"},{"line_number":118,"context_line":"        \u0027provider_summaries\u0027: \u003cPROVIDER_SUMMARIES\u003e,"},{"line_number":119,"context_line":"    }"},{"line_number":120,"context_line":"    \"\"\""},{"line_number":121,"context_line":"    return {"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_350203b6","line":118,"range":{"start_line":118,"start_character":30,"end_line":118,"end_character":50},"updated":"2017-06-30 07:00:33.000000000","message":"So this is a dict, keyed by resource provider uuid, to a dict keyed by \u0027resources\u0027 which are the resource classes available for that provider.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"273a7e733dc4a6354a5964c5984738a7e9146e75","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    {"},{"line_number":117,"context_line":"        \u0027allocation_requests\u0027: \u003cALLOC_REQUESTS\u003e,"},{"line_number":118,"context_line":"        \u0027provider_summaries\u0027: \u003cPROVIDER_SUMMARIES\u003e,"},{"line_number":119,"context_line":"    }"},{"line_number":120,"context_line":"    \"\"\""},{"line_number":121,"context_line":"    return {"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_ea45ba18","line":118,"range":{"start_line":118,"start_character":30,"end_line":118,"end_character":50},"in_reply_to":"3f1d235d_350203b6","updated":"2017-06-30 15:28:25.000000000","message":"And will have traits in the future as well.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"54cef180af65b0ca25b2dcb44c03556d72f28c3e","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":139,"context_line":"    schema \u003d _GET_SCHEMA_1_10"},{"line_number":140,"context_line":"    try:"},{"line_number":141,"context_line":"        jsonschema.validate(dict(req.GET), schema,"},{"line_number":142,"context_line":"                            format_checker\u003djsonschema.FormatChecker())"},{"line_number":143,"context_line":"    except jsonschema.ValidationError as exc:"},{"line_number":144,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":145,"context_line":"            _(\u0027Invalid query string parameters: %(exc)s\u0027) %"},{"line_number":146,"context_line":"            {\u0027exc\u0027: exc})"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    resources \u003d util.normalize_resources_qs_param(req.GET[\u0027resources\u0027])"},{"line_number":149,"context_line":"    filters \u003d {\u0027resources\u0027: resources}"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_41a82c1e","line":146,"range":{"start_line":140,"start_character":4,"end_line":146,"end_character":25},"updated":"2017-06-30 02:10:53.000000000","message":"nit, we can use this directly https://github.com/openstack/nova/blob/master/nova/api/openstack/placement/util.py#L173. But can be done a later cleanup","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"273a7e733dc4a6354a5964c5984738a7e9146e75","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":139,"context_line":"    schema \u003d _GET_SCHEMA_1_10"},{"line_number":140,"context_line":"    try:"},{"line_number":141,"context_line":"        jsonschema.validate(dict(req.GET), schema,"},{"line_number":142,"context_line":"                            format_checker\u003djsonschema.FormatChecker())"},{"line_number":143,"context_line":"    except jsonschema.ValidationError as exc:"},{"line_number":144,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":145,"context_line":"            _(\u0027Invalid query string parameters: %(exc)s\u0027) %"},{"line_number":146,"context_line":"            {\u0027exc\u0027: exc})"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    resources \u003d util.normalize_resources_qs_param(req.GET[\u0027resources\u0027])"},{"line_number":149,"context_line":"    filters \u003d {\u0027resources\u0027: resources}"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_cacf9e7d","line":146,"range":{"start_line":140,"start_character":4,"end_line":146,"end_character":25},"in_reply_to":"3f1d235d_41a82c1e","updated":"2017-06-30 15:28:25.000000000","message":"Done. Cool, I didn\u0027t know about that function! :)","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"958c99ff1e07fa1410b2d105ebec43b811c092fe","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    except exception.ResourceClassNotFound as exc:"},{"line_number":154,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":155,"context_line":"            _(\u0027Invalid resource class in resources parameter: %(error)s\u0027) %"},{"line_number":156,"context_line":"            {\u0027error\u0027: exc})"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    response \u003d req.response"},{"line_number":159,"context_line":"    trx_cands \u003d _transform_allocation_candidates(cands)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_ff045d7d","line":156,"range":{"start_line":156,"start_character":12,"end_line":156,"end_character":27},"updated":"2017-06-30 13:40:12.000000000","message":"should we leak out the full stacktrace here ? couldn\u0027t we rather extract the RC name from the exception object ?","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"273a7e733dc4a6354a5964c5984738a7e9146e75","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    except exception.ResourceClassNotFound as exc:"},{"line_number":154,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":155,"context_line":"            _(\u0027Invalid resource class in resources parameter: %(error)s\u0027) %"},{"line_number":156,"context_line":"            {\u0027error\u0027: exc})"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    response \u003d req.response"},{"line_number":159,"context_line":"    trx_cands \u003d _transform_allocation_candidates(cands)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_6a740a36","line":156,"range":{"start_line":156,"start_character":12,"end_line":156,"end_character":27},"in_reply_to":"3f1d235d_ff045d7d","updated":"2017-06-30 15:28:25.000000000","message":"We don\u0027t leak the full stack trace. str(exc) results in the name of the missing resource class.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"796c0133692194ad546d53b850acedd191ebb6c6","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    \"\"\""},{"line_number":144,"context_line":"    return {"},{"line_number":145,"context_line":"        \u0027allocation_requests\u0027: _transform_allocation_requests("},{"line_number":146,"context_line":"            alloc_candidates.allocation_requests,"},{"line_number":147,"context_line":"        ),"},{"line_number":148,"context_line":"        \u0027provider_summaries\u0027: _transform_provider_summaries("},{"line_number":149,"context_line":"            alloc_candidates.provider_summaries,"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_56a32c9f","line":146,"range":{"start_line":146,"start_character":48,"end_line":146,"end_character":49},"updated":"2017-07-01 00:27:37.000000000","message":"Why is there a comma here?","commit_id":"17792cfe862a304c8eb0313856db4ab1185539fc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"796c0133692194ad546d53b850acedd191ebb6c6","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            alloc_candidates.allocation_requests,"},{"line_number":147,"context_line":"        ),"},{"line_number":148,"context_line":"        \u0027provider_summaries\u0027: _transform_provider_summaries("},{"line_number":149,"context_line":"            alloc_candidates.provider_summaries,"},{"line_number":150,"context_line":"        ),"},{"line_number":151,"context_line":"    }"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_16adb487","line":149,"range":{"start_line":149,"start_character":47,"end_line":149,"end_character":48},"updated":"2017-07-01 00:27:37.000000000","message":"same","commit_id":"17792cfe862a304c8eb0313856db4ab1185539fc"}],"nova/api/openstack/placement/handlers/resource_provider.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a4728424f63e5ce8f894fe0be193bfbe971dc24e","unresolved":false,"context_lines":[{"line_number":75,"context_line":"# having some set of capacity for some resources. The query string is a"},{"line_number":76,"context_line":"# comma-delimited set of \"$RESOURCE_CLASS_NAME:$AMOUNT\" strings. The validation"},{"line_number":77,"context_line":"# of the string is left up to the helper code in the"},{"line_number":78,"context_line":"# normalize_resources_qs_param() function."},{"line_number":79,"context_line":"GET_RPS_SCHEMA_1_4 \u003d copy.deepcopy(GET_RPS_SCHEMA_1_3)"},{"line_number":80,"context_line":"GET_RPS_SCHEMA_1_4[\u0027properties\u0027][\u0027resources\u0027] \u003d {"},{"line_number":81,"context_line":"    \"type\": \"string\""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f201791_bf1c896a","line":78,"updated":"2017-06-22 18:21:14.000000000","message":"I guess this got missed in the previous patch?","commit_id":"98e589632f872972cc650823bfc55ad5c4e6953f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8a703f93dc2e147b483ec3038cf89daa1a0e4f5b","unresolved":false,"context_lines":[{"line_number":75,"context_line":"# having some set of capacity for some resources. The query string is a"},{"line_number":76,"context_line":"# comma-delimited set of \"$RESOURCE_CLASS_NAME:$AMOUNT\" strings. The validation"},{"line_number":77,"context_line":"# of the string is left up to the helper code in the"},{"line_number":78,"context_line":"# normalize_resources_qs_param() function."},{"line_number":79,"context_line":"GET_RPS_SCHEMA_1_4 \u003d copy.deepcopy(GET_RPS_SCHEMA_1_3)"},{"line_number":80,"context_line":"GET_RPS_SCHEMA_1_4[\u0027properties\u0027][\u0027resources\u0027] \u003d {"},{"line_number":81,"context_line":"    \"type\": \"string\""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f201791_8f4980d1","line":78,"in_reply_to":"5f201791_bf1c896a","updated":"2017-06-23 13:22:31.000000000","message":"Heh, yeah, a rebase issue... I\u0027ll correct.","commit_id":"98e589632f872972cc650823bfc55ad5c4e6953f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"958c99ff1e07fa1410b2d105ebec43b811c092fe","unresolved":false,"context_lines":[{"line_number":74,"context_line":"# having some set of capacity for some resources. The query string is a"},{"line_number":75,"context_line":"# comma-delimited set of \"$RESOURCE_CLASS_NAME:$AMOUNT\" strings. The validation"},{"line_number":76,"context_line":"# of the string is left up to the helper code in the"},{"line_number":77,"context_line":"# _normalize_resources_qs_param() function below."},{"line_number":78,"context_line":"GET_RPS_SCHEMA_1_4 \u003d copy.deepcopy(GET_RPS_SCHEMA_1_3)"},{"line_number":79,"context_line":"GET_RPS_SCHEMA_1_4[\u0027properties\u0027][\u0027resources\u0027] \u003d {"},{"line_number":80,"context_line":"    \"type\": \"string\""}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_df3e4128","side":"PARENT","line":77,"range":{"start_line":77,"start_character":42,"end_line":77,"end_character":49},"updated":"2017-06-30 13:40:12.000000000","message":"not really needed to change, right?","commit_id":"d121a1de93dcebfe7d7ba5d41a2137bd530fde53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eeef3900aa8ac9b76db3ce018da405954298a91b","unresolved":false,"context_lines":[{"line_number":74,"context_line":"# having some set of capacity for some resources. The query string is a"},{"line_number":75,"context_line":"# comma-delimited set of \"$RESOURCE_CLASS_NAME:$AMOUNT\" strings. The validation"},{"line_number":76,"context_line":"# of the string is left up to the helper code in the"},{"line_number":77,"context_line":"# _normalize_resources_qs_param() function below."},{"line_number":78,"context_line":"GET_RPS_SCHEMA_1_4 \u003d copy.deepcopy(GET_RPS_SCHEMA_1_3)"},{"line_number":79,"context_line":"GET_RPS_SCHEMA_1_4[\u0027properties\u0027][\u0027resources\u0027] \u003d {"},{"line_number":80,"context_line":"    \"type\": \"string\""}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_d121954f","side":"PARENT","line":77,"range":{"start_line":77,"start_character":42,"end_line":77,"end_character":49},"in_reply_to":"3f1d235d_df3e4128","updated":"2017-06-30 13:57:36.000000000","message":"Not really, but it should have been done in the other change that moved this to a utility module. I\u0027m fine with leaving this cleanup in here.","commit_id":"d121a1de93dcebfe7d7ba5d41a2137bd530fde53"}],"nova/api/openstack/placement/rest_api_version_history.rst":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"61596fd61395f8748cd856a97cbfb3cab02fde9b","unresolved":false,"context_lines":[{"line_number":146,"context_line":"   Returns all usages for a given project and user."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"1.10 Allocation candidates"},{"line_number":149,"context_line":"-------------------------------------------"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"The 1.10 version brings a new REST resource endpoint for getting a list of"},{"line_number":152,"context_line":"allocation candidates. Allocation candidates are collections of possible"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3f1d235d_75f99b7e","line":149,"range":{"start_line":149,"start_character":26,"end_line":149,"end_character":43},"updated":"2017-06-30 07:00:33.000000000","message":"nit: remove these","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"61596fd61395f8748cd856a97cbfb3cab02fde9b","unresolved":false,"context_lines":[{"line_number":151,"context_line":"The 1.10 version brings a new REST resource endpoint for getting a list of"},{"line_number":152,"context_line":"allocation candidates. Allocation candidates are collections of possible"},{"line_number":153,"context_line":"allocations against resource providers that can satisfy a particular request"},{"line_number":154,"context_line":"for resources and traits."}],"source_content_type":"text/x-rst","patch_set":17,"id":"3f1d235d_f5780bf9","line":154,"range":{"start_line":154,"start_character":14,"end_line":154,"end_character":24},"updated":"2017-06-30 07:00:33.000000000","message":"nit: should probably remove this for 1.10 so there is no confusion that we can get allocation requests here filtered by traits.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"958c99ff1e07fa1410b2d105ebec43b811c092fe","unresolved":false,"context_lines":[{"line_number":151,"context_line":"The 1.10 version brings a new REST resource endpoint for getting a list of"},{"line_number":152,"context_line":"allocation candidates. Allocation candidates are collections of possible"},{"line_number":153,"context_line":"allocations against resource providers that can satisfy a particular request"},{"line_number":154,"context_line":"for resources and traits."}],"source_content_type":"text/x-rst","patch_set":17,"id":"3f1d235d_df276112","line":154,"range":{"start_line":154,"start_character":14,"end_line":154,"end_character":24},"in_reply_to":"3f1d235d_f5780bf9","updated":"2017-06-30 13:40:12.000000000","message":"What Matt said, we don\u0027t support yet requested traits like the spec is saying.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"796c0133692194ad546d53b850acedd191ebb6c6","unresolved":false,"context_lines":[{"line_number":151,"context_line":"The 1.10 version brings a new REST resource endpoint for getting a list of"},{"line_number":152,"context_line":"allocation candidates. Allocation candidates are collections of possible"},{"line_number":153,"context_line":"allocations against resource providers that can satisfy a particular request"},{"line_number":154,"context_line":"for resources and traits."}],"source_content_type":"text/x-rst","patch_set":19,"id":"3f1d235d_d6ddfc14","line":154,"range":{"start_line":154,"start_character":14,"end_line":154,"end_character":25},"updated":"2017-07-01 00:27:37.000000000","message":"Let\u0027s remove this part since it\u0027s not supported in this microversion.","commit_id":"17792cfe862a304c8eb0313856db4ab1185539fc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"59d20e2798e593272cfd5f78b917e7d3cc5d6cec","unresolved":false,"context_lines":[{"line_number":151,"context_line":"The 1.10 version brings a new REST resource endpoint for getting a list of"},{"line_number":152,"context_line":"allocation candidates. Allocation candidates are collections of possible"},{"line_number":153,"context_line":"allocations against resource providers that can satisfy a particular request"},{"line_number":154,"context_line":"for resources and traits."}],"source_content_type":"text/x-rst","patch_set":23,"id":"3f1d235d_472c7901","line":154,"range":{"start_line":154,"start_character":14,"end_line":154,"end_character":24},"updated":"2017-07-03 14:36:59.000000000","message":"let\u0027s remove this part about traits","commit_id":"2b57a62793a2046df11ed567b2eda29abaebf190"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6f923db1a823ed5ccbd498e9ebe9f5b7b990c5d4","unresolved":false,"context_lines":[{"line_number":151,"context_line":"The 1.10 version brings a new REST resource endpoint for getting a list of"},{"line_number":152,"context_line":"allocation candidates. Allocation candidates are collections of possible"},{"line_number":153,"context_line":"allocations against resource providers that can satisfy a particular request"},{"line_number":154,"context_line":"for resources and traits."}],"source_content_type":"text/x-rst","patch_set":23,"id":"3f1d235d_0acd68b7","line":154,"range":{"start_line":154,"start_character":14,"end_line":154,"end_character":24},"in_reply_to":"3f1d235d_472c7901","updated":"2017-07-03 14:57:23.000000000","message":"Done","commit_id":"2b57a62793a2046df11ed567b2eda29abaebf190"}],"nova/api/openstack/placement/util.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e31aaae91bdb7e78f7d129f88af85a7c46e181d3","unresolved":false,"context_lines":[{"line_number":240,"context_line":"            }"},{"line_number":241,"context_line":"            raise webob.exc.HTTPBadRequest(msg)"},{"line_number":242,"context_line":"        result[rc_name] \u003d amount"},{"line_number":243,"context_line":"    return result"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_b0452846","line":243,"updated":"2017-06-19 21:17:49.000000000","message":"We kinda need a unit test for this if it\u0027s common and used by other things, right? It\u0027s probably covered in the thing you ripped it out of, but if we were to remove that later we\u0027d lose coverage of this without a lot of visibility.\n\nThat reinforces my feeling that the refactor of this out into a common helper seems like it should be its own patch, which would make the lack of tests more obvious...","commit_id":"66fe4400167ac098b603c463be502bd4b13b8014"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ce2191c1375571f5cb6f74575a9776c9a2b1152a","unresolved":false,"context_lines":[{"line_number":240,"context_line":"            }"},{"line_number":241,"context_line":"            raise webob.exc.HTTPBadRequest(msg)"},{"line_number":242,"context_line":"        result[rc_name] \u003d amount"},{"line_number":243,"context_line":"    return result"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_1dd994f3","line":243,"in_reply_to":"7f231b9d_b0452846","updated":"2017-06-19 22:54:09.000000000","message":"Done. Placed in a new patch preceding this one.","commit_id":"66fe4400167ac098b603c463be502bd4b13b8014"}],"nova/tests/functional/api/openstack/placement/fixtures.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8c9632017712b6d684fbdf7bd2b333f0b1497ca6","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        # These UUIDs are staticly defined here because the JSONPath querying"},{"line_number":161,"context_line":"        # needed in the allocation-candidates.yaml gabbits cannot refer to an"},{"line_number":162,"context_line":"        # ENVIRON variable because the $ sign is a token in the JSONPath"},{"line_number":163,"context_line":"        # parser."},{"line_number":164,"context_line":"        os.environ[\u0027CN1_UUID\u0027] \u003d \u0027d2d0e0c6-2894-4df1-aa6b-c61fa72ed22d\u0027"},{"line_number":165,"context_line":"        os.environ[\u0027CN2_UUID\u0027] \u003d \u0027e917784d-beef-49a0-98a0-b998b88debfd\u0027"},{"line_number":166,"context_line":"        os.environ[\u0027SS_UUID\u0027] \u003d \u0027cc96c128-61a6-472e-b8c1-74796e803066\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f231b9d_f60ba028","line":163,"updated":"2017-06-19 18:23:19.000000000","message":"sadface.","commit_id":"32bb05370e055607c2e223af875de5332279e776"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"7b2e4d788d5f9dab7681f1149eec98c3da30bcb8","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        # These UUIDs are staticly defined here because the JSONPath querying"},{"line_number":161,"context_line":"        # needed in the allocation-candidates.yaml gabbits cannot refer to an"},{"line_number":162,"context_line":"        # ENVIRON variable because the $ sign is a token in the JSONPath"},{"line_number":163,"context_line":"        # parser."},{"line_number":164,"context_line":"        os.environ[\u0027CN1_UUID\u0027] \u003d \u0027d2d0e0c6-2894-4df1-aa6b-c61fa72ed22d\u0027"},{"line_number":165,"context_line":"        os.environ[\u0027CN2_UUID\u0027] \u003d \u0027e917784d-beef-49a0-98a0-b998b88debfd\u0027"},{"line_number":166,"context_line":"        os.environ[\u0027SS_UUID\u0027] \u003d \u0027cc96c128-61a6-472e-b8c1-74796e803066\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f1d235d_a6ab6f87","line":163,"in_reply_to":"7f231b9d_f60ba028","updated":"2017-07-01 10:44:41.000000000","message":"There\u0027s a bug for this, but there had been no compelling force to fix it yet, but if there\u0027s going to be an ongoing need for dynamic keys it can probably be done. See: https://github.com/cdent/gabbi/issues/170\n\n(I assume that\u0027s what\u0027s been talked about, I\u0027m not up to date on this stuff, just dropped by to add myself to the review so that I\u0027m aware of it when I start paying attention again.)","commit_id":"32bb05370e055607c2e223af875de5332279e776"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"a7b4d8873d770eefccb4a767543a94d0325ee0c1","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        os.environ[\u0027CN1_UUID\u0027] \u003d \u0027d2d0e0c6-2894-4df1-aa6b-c61fa72ed22d\u0027"},{"line_number":165,"context_line":"        os.environ[\u0027CN2_UUID\u0027] \u003d \u0027e917784d-beef-49a0-98a0-b998b88debfd\u0027"},{"line_number":166,"context_line":"        os.environ[\u0027SS_UUID\u0027] \u003d \u0027cc96c128-61a6-472e-b8c1-74796e803066\u0027"},{"line_number":167,"context_line":"        os.environ[\u0027AGG_UUID\u0027] \u003d \u0027910655c1-04b3-458c-9e9f-361aad56f41c\u0027"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        cn1_uuid \u003d os.environ[\u0027CN1_UUID\u0027]"},{"line_number":170,"context_line":"        cn2_uuid \u003d os.environ[\u0027CN2_UUID\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f231b9d_7961c311","line":167,"updated":"2017-06-19 18:50:27.000000000","message":"I understand the limitation, but since these are not critical values, why not make them identifiable, so that the gabbits are a little more readable. E.g.:\n\n        os.environ[\u0027CN1_UUID\u0027] \u003d \u0027c1c1c1c1-2894-4df1-aa6b-c61fa72ed22d\u0027\n        os.environ[\u0027CN2_UUID\u0027] \u003d \u0027c2c2c2c2-beef-49a0-98a0-b998b88debfd\u0027\n        os.environ[\u0027SS_UUID\u0027] \u003d \u0027dddddddd-61a6-472e-b8c1-74796e803066\u0027\n        os.environ[\u0027AGG_UUID\u0027] \u003d \u0027aaaaaaaa-04b3-458c-9e9f-361aad56f41c\u0027\n\n\u0027d\u0027 for \u0027disk, \u0027a\u0027 for agg","commit_id":"32bb05370e055607c2e223af875de5332279e776"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1c898eab2863c8c3b8e7278a3b8891c2ab512069","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        os.environ[\u0027CN1_UUID\u0027] \u003d \u0027d2d0e0c6-2894-4df1-aa6b-c61fa72ed22d\u0027"},{"line_number":165,"context_line":"        os.environ[\u0027CN2_UUID\u0027] \u003d \u0027e917784d-beef-49a0-98a0-b998b88debfd\u0027"},{"line_number":166,"context_line":"        os.environ[\u0027SS_UUID\u0027] \u003d \u0027cc96c128-61a6-472e-b8c1-74796e803066\u0027"},{"line_number":167,"context_line":"        os.environ[\u0027AGG_UUID\u0027] \u003d \u0027910655c1-04b3-458c-9e9f-361aad56f41c\u0027"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        cn1_uuid \u003d os.environ[\u0027CN1_UUID\u0027]"},{"line_number":170,"context_line":"        cn2_uuid \u003d os.environ[\u0027CN2_UUID\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f231b9d_fc48212f","line":167,"in_reply_to":"7f231b9d_7961c311","updated":"2017-06-19 19:01:20.000000000","message":"Hmm, that\u0027s a good idea, Ed. I\u0027ll do that. Thanks!","commit_id":"32bb05370e055607c2e223af875de5332279e776"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"5d9650e1cc1b7ce9561e7dc8ab7fec84b9afb4a7","unresolved":false,"context_lines":[{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"class SharedStorageFixture(APIFixture):"},{"line_number":152,"context_line":"    \"\"\"An APIFixture that has some two compute nodes without local storage"},{"line_number":153,"context_line":"    associated by aggregate to a provider of shared storage."},{"line_number":154,"context_line":"    \"\"\""},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def start_fixture(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f201791_4c917699","line":153,"range":{"start_line":152,"start_character":0,"end_line":153,"end_character":60},"updated":"2017-06-21 17:14:12.000000000","message":"Will we be adding coverage for the case of a CN with both local and shared storage?","commit_id":"e5e5a10075532840cd3db68e73d3c3ef5b7889d3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"95b54f962067020d5a91e65a14cdd5f8a37052ed","unresolved":false,"context_lines":[{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"class SharedStorageFixture(APIFixture):"},{"line_number":152,"context_line":"    \"\"\"An APIFixture that has some two compute nodes without local storage"},{"line_number":153,"context_line":"    associated by aggregate to a provider of shared storage."},{"line_number":154,"context_line":"    \"\"\""},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def start_fixture(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f201791_c7dc4148","line":153,"range":{"start_line":152,"start_character":0,"end_line":153,"end_character":60},"in_reply_to":"5f201791_4c917699","updated":"2017-06-21 17:53:38.000000000","message":"yes, for sure.","commit_id":"e5e5a10075532840cd3db68e73d3c3ef5b7889d3"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"5d9650e1cc1b7ce9561e7dc8ab7fec84b9afb4a7","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        os.environ[\u0027CN1_UUID\u0027] \u003d \u0027c1c1c1c1-2894-4df1-aa6b-c61fa72ed22d\u0027"},{"line_number":165,"context_line":"        os.environ[\u0027CN2_UUID\u0027] \u003d \u0027c2c2c2c2-beef-49a0-98a0-b998b88debfd\u0027"},{"line_number":166,"context_line":"        os.environ[\u0027SS_UUID\u0027] \u003d \u0027dddddddd-61a6-472e-b8c1-74796e803066\u0027"},{"line_number":167,"context_line":"        os.environ[\u0027AGG_UUID\u0027] \u003d \u0027eeeeeeee-04b3-458c-9e9f-361aad56f41c\u0027"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        cn1_uuid \u003d os.environ[\u0027CN1_UUID\u0027]"},{"line_number":170,"context_line":"        cn2_uuid \u003d os.environ[\u0027CN2_UUID\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f201791_6cd9d281","line":167,"range":{"start_line":167,"start_character":34,"end_line":167,"end_character":42},"updated":"2017-06-21 17:14:12.000000000","message":"nit: using \u0027aaaaaaaa\u0027 instead of the e\u0027s is more mnemonic: \u0027a\u0027 for \u0027aggregate\u0027","commit_id":"e5e5a10075532840cd3db68e73d3c3ef5b7889d3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"95b54f962067020d5a91e65a14cdd5f8a37052ed","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        os.environ[\u0027CN1_UUID\u0027] \u003d \u0027c1c1c1c1-2894-4df1-aa6b-c61fa72ed22d\u0027"},{"line_number":165,"context_line":"        os.environ[\u0027CN2_UUID\u0027] \u003d \u0027c2c2c2c2-beef-49a0-98a0-b998b88debfd\u0027"},{"line_number":166,"context_line":"        os.environ[\u0027SS_UUID\u0027] \u003d \u0027dddddddd-61a6-472e-b8c1-74796e803066\u0027"},{"line_number":167,"context_line":"        os.environ[\u0027AGG_UUID\u0027] \u003d \u0027eeeeeeee-04b3-458c-9e9f-361aad56f41c\u0027"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        cn1_uuid \u003d os.environ[\u0027CN1_UUID\u0027]"},{"line_number":170,"context_line":"        cn2_uuid \u003d os.environ[\u0027CN2_UUID\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f201791_07d3593a","line":167,"range":{"start_line":167,"start_character":34,"end_line":167,"end_character":42},"in_reply_to":"5f201791_6cd9d281","updated":"2017-06-21 17:53:38.000000000","message":"heh, prolly fat-fingered it... will change.","commit_id":"e5e5a10075532840cd3db68e73d3c3ef5b7889d3"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"5d9650e1cc1b7ce9561e7dc8ab7fec84b9afb4a7","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        # provider associated via aggregate"},{"line_number":242,"context_line":"        t \u003d objects.Trait("},{"line_number":243,"context_line":"            self.context,"},{"line_number":244,"context_line":"            name\u003d\"MISC_SHARES_VIA_AGGREGATE\","},{"line_number":245,"context_line":"        )"},{"line_number":246,"context_line":"        # TODO(jaypipes): Once MISC_SHARES_VIA_AGGREGATE is a standard"},{"line_number":247,"context_line":"        # os-traits trait, we won\u0027t need to create() here. Instead, we will"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f201791_ac45aa19","line":244,"range":{"start_line":244,"start_character":12,"end_line":244,"end_character":44},"updated":"2017-06-21 17:14:12.000000000","message":"This will raise an ObjectActionError, since it doesn\u0027t begin with \u0027CUSTOM_\u0027","commit_id":"e5e5a10075532840cd3db68e73d3c3ef5b7889d3"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"5d9650e1cc1b7ce9561e7dc8ab7fec84b9afb4a7","unresolved":false,"context_lines":[{"line_number":243,"context_line":"            self.context,"},{"line_number":244,"context_line":"            name\u003d\"MISC_SHARES_VIA_AGGREGATE\","},{"line_number":245,"context_line":"        )"},{"line_number":246,"context_line":"        # TODO(jaypipes): Once MISC_SHARES_VIA_AGGREGATE is a standard"},{"line_number":247,"context_line":"        # os-traits trait, we won\u0027t need to create() here. Instead, we will"},{"line_number":248,"context_line":"        # just do:"},{"line_number":249,"context_line":"        # t \u003d objects.Trait.get_by_name("},{"line_number":250,"context_line":"        #    self.context,"},{"line_number":251,"context_line":"        #    \"MISC_SHARES_VIA_AGGREGATE\","}],"source_content_type":"text/x-python","patch_set":7,"id":"5f201791_6c47921f","line":248,"range":{"start_line":246,"start_character":7,"end_line":248,"end_character":18},"updated":"2017-06-21 17:14:12.000000000","message":"We should probably speed this up. :)","commit_id":"e5e5a10075532840cd3db68e73d3c3ef5b7889d3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"95b54f962067020d5a91e65a14cdd5f8a37052ed","unresolved":false,"context_lines":[{"line_number":243,"context_line":"            self.context,"},{"line_number":244,"context_line":"            name\u003d\"MISC_SHARES_VIA_AGGREGATE\","},{"line_number":245,"context_line":"        )"},{"line_number":246,"context_line":"        # TODO(jaypipes): Once MISC_SHARES_VIA_AGGREGATE is a standard"},{"line_number":247,"context_line":"        # os-traits trait, we won\u0027t need to create() here. Instead, we will"},{"line_number":248,"context_line":"        # just do:"},{"line_number":249,"context_line":"        # t \u003d objects.Trait.get_by_name("},{"line_number":250,"context_line":"        #    self.context,"},{"line_number":251,"context_line":"        #    \"MISC_SHARES_VIA_AGGREGATE\","}],"source_content_type":"text/x-python","patch_set":7,"id":"5f201791_67e32d07","line":248,"range":{"start_line":246,"start_character":7,"end_line":248,"end_character":18},"in_reply_to":"5f201791_6c47921f","updated":"2017-06-21 17:53:38.000000000","message":"Actually, we can do it now... since 0.4 os-traits was released.","commit_id":"e5e5a10075532840cd3db68e73d3c3ef5b7889d3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5e4289d963c3473ef8da8fc7e28772e6d2c214e4","unresolved":false,"context_lines":[{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"class SharedStorageFixture(APIFixture):"},{"line_number":152,"context_line":"    \"\"\"An APIFixture that has some two compute nodes without local storage"},{"line_number":153,"context_line":"    associated by aggregate to a provider of shared storage."},{"line_number":154,"context_line":"    \"\"\""},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_b825a3c4","line":152,"range":{"start_line":152,"start_character":30,"end_line":152,"end_character":38},"updated":"2017-06-23 15:59:55.000000000","message":"?","commit_id":"b6442abc9030fc05f3a81c67fa62888b5e6d30cc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5e4289d963c3473ef8da8fc7e28772e6d2c214e4","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        super(SharedStorageFixture, self).start_fixture()"},{"line_number":158,"context_line":"        self.context \u003d context.get_admin_context()"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        # These UUIDs are staticly defined here because the JSONPath querying"},{"line_number":161,"context_line":"        # needed in the allocation-candidates.yaml gabbits cannot refer to an"},{"line_number":162,"context_line":"        # ENVIRON variable because the $ sign is a token in the JSONPath"},{"line_number":163,"context_line":"        # parser."}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_f8143b50","line":160,"range":{"start_line":160,"start_character":26,"end_line":160,"end_character":34},"updated":"2017-06-23 15:59:55.000000000","message":"statically","commit_id":"b6442abc9030fc05f3a81c67fa62888b5e6d30cc"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"acfd2894b0d0b65ed9f704685a996767ad9a43f1","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        os.environ[\u0027CN1_UUID\u0027] \u003d \u0027c1c1c1c1-2894-4df1-aa6b-c61fa72ed22d\u0027"},{"line_number":208,"context_line":"        os.environ[\u0027CN2_UUID\u0027] \u003d \u0027c2c2c2c2-beef-49a0-98a0-b998b88debfd\u0027"},{"line_number":209,"context_line":"        os.environ[\u0027SS_UUID\u0027] \u003d \u0027dddddddd-61a6-472e-b8c1-74796e803066\u0027"},{"line_number":210,"context_line":"        os.environ[\u0027AGG_UUID\u0027] \u003d \u0027eeeeeeee-04b3-458c-9e9f-361aad56f41c\u0027"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        cn1_uuid \u003d os.environ[\u0027CN1_UUID\u0027]"},{"line_number":213,"context_line":"        cn2_uuid \u003d os.environ[\u0027CN2_UUID\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f201791_10f66264","line":210,"range":{"start_line":210,"start_character":34,"end_line":210,"end_character":42},"updated":"2017-06-27 12:23:01.000000000","message":"I still think s/e/a would be better, as a mnemonic for \u0027agg\u0027, as mentioned back in PS 7","commit_id":"4bdfdc363424e30df6ef01cf4c04567bedc55168"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"62640aca87b78d45fb9c807e23d6a20681ae402a","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        os.environ[\u0027CN1_UUID\u0027] \u003d \u0027c1c1c1c1-2894-4df1-aa6b-c61fa72ed22d\u0027"},{"line_number":208,"context_line":"        os.environ[\u0027CN2_UUID\u0027] \u003d \u0027c2c2c2c2-beef-49a0-98a0-b998b88debfd\u0027"},{"line_number":209,"context_line":"        os.environ[\u0027SS_UUID\u0027] \u003d \u0027dddddddd-61a6-472e-b8c1-74796e803066\u0027"},{"line_number":210,"context_line":"        os.environ[\u0027AGG_UUID\u0027] \u003d \u0027eeeeeeee-04b3-458c-9e9f-361aad56f41c\u0027"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        cn1_uuid \u003d os.environ[\u0027CN1_UUID\u0027]"},{"line_number":213,"context_line":"        cn2_uuid \u003d os.environ[\u0027CN2_UUID\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f201791_81490261","line":210,"range":{"start_line":210,"start_character":34,"end_line":210,"end_character":42},"in_reply_to":"5f201791_10f66264","updated":"2017-06-27 13:02:10.000000000","message":"gah, I keep forgetting this. :( Will do right now.","commit_id":"4bdfdc363424e30df6ef01cf4c04567bedc55168"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6b0bf23d9049ccf4a3799d1bbc1be688f3e15ccf","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        # provider associated via aggregate"},{"line_number":279,"context_line":"        t \u003d objects.Trait.get_by_name("},{"line_number":280,"context_line":"            self.context,"},{"line_number":281,"context_line":"            \"MISC_SHARES_VIA_AGGREGATE\","},{"line_number":282,"context_line":"        )"},{"line_number":283,"context_line":"        ss.set_traits(objects.TraitList(objects\u003d[t]))"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        # Now associate the shared storage pool and both compute nodes with the"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f201791_64b7ebf6","line":282,"range":{"start_line":281,"start_character":0,"end_line":282,"end_character":9},"updated":"2017-06-28 12:17:56.000000000","message":"trailing comma/paren","commit_id":"2f5c9be5ea8c8c9f004ea1452a395ae48ab4b767"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"61596fd61395f8748cd856a97cbfb3cab02fde9b","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"class SharedStorageFixture(APIFixture):"},{"line_number":195,"context_line":"    \"\"\"An APIFixture that has some two compute nodes without local storage"},{"line_number":196,"context_line":"    associated by aggregate to a provider of shared storage."},{"line_number":197,"context_line":"    \"\"\""},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_b58293c7","line":195,"range":{"start_line":195,"start_character":30,"end_line":195,"end_character":34},"updated":"2017-06-30 07:00:33.000000000","message":"s/some//","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"61596fd61395f8748cd856a97cbfb3cab02fde9b","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        super(SharedStorageFixture, self).start_fixture()"},{"line_number":201,"context_line":"        self.context \u003d context.get_admin_context()"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        # These UUIDs are staticly defined here because the JSONPath querying"},{"line_number":204,"context_line":"        # needed in the allocation-candidates.yaml gabbits cannot refer to an"},{"line_number":205,"context_line":"        # ENVIRON variable because the $ sign is a token in the JSONPath"},{"line_number":206,"context_line":"        # parser."}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_f5612b3b","line":203,"range":{"start_line":203,"start_character":26,"end_line":203,"end_character":34},"updated":"2017-06-30 07:00:33.000000000","message":"statically","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"958c99ff1e07fa1410b2d105ebec43b811c092fe","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        t \u003d objects.Trait.get_by_name("},{"line_number":280,"context_line":"            self.context,"},{"line_number":281,"context_line":"            \"MISC_SHARES_VIA_AGGREGATE\")"},{"line_number":282,"context_line":"        ss.set_traits(objects.TraitList(objects\u003d[t]))"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        # Now associate the shared storage pool and both compute nodes with the"},{"line_number":285,"context_line":"        # same aggregate"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_bfd705c0","line":282,"updated":"2017-06-30 13:40:12.000000000","message":"not sure it\u0027s needed there but okay.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eeef3900aa8ac9b76db3ce018da405954298a91b","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        t \u003d objects.Trait.get_by_name("},{"line_number":280,"context_line":"            self.context,"},{"line_number":281,"context_line":"            \"MISC_SHARES_VIA_AGGREGATE\")"},{"line_number":282,"context_line":"        ss.set_traits(objects.TraitList(objects\u003d[t]))"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        # Now associate the shared storage pool and both compute nodes with the"},{"line_number":285,"context_line":"        # same aggregate"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_b1e3b905","line":282,"in_reply_to":"3f1d235d_bfd705c0","updated":"2017-06-30 13:57:36.000000000","message":"It\u0027s needed for the MISC_SHARES_VIA_AGGREGATE trait which ties the compute node resource providers to the shared storage provider via the aggregate.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"796c0133692194ad546d53b850acedd191ebb6c6","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"class SharedStorageFixture(APIFixture):"},{"line_number":195,"context_line":"    \"\"\"An APIFixture that has some two compute nodes without local storage"},{"line_number":196,"context_line":"    associated by aggregate to a provider of shared storage."},{"line_number":197,"context_line":"    \"\"\""},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_96b2e4e5","line":195,"range":{"start_line":195,"start_character":30,"end_line":195,"end_character":34},"updated":"2017-07-01 00:27:37.000000000","message":"s/some//","commit_id":"17792cfe862a304c8eb0313856db4ab1185539fc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"796c0133692194ad546d53b850acedd191ebb6c6","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        super(SharedStorageFixture, self).start_fixture()"},{"line_number":201,"context_line":"        self.context \u003d context.get_admin_context()"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        # These UUIDs are staticly defined here because the JSONPath querying"},{"line_number":204,"context_line":"        # needed in the allocation-candidates.yaml gabbits cannot refer to an"},{"line_number":205,"context_line":"        # ENVIRON variable because the $ sign is a token in the JSONPath"},{"line_number":206,"context_line":"        # parser."}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_56cc4c69","line":203,"range":{"start_line":203,"start_character":26,"end_line":203,"end_character":34},"updated":"2017-07-01 00:27:37.000000000","message":"statically","commit_id":"17792cfe862a304c8eb0313856db4ab1185539fc"}],"nova/tests/functional/api/openstack/placement/gabbits/allocation-candidates.yaml":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a4728424f63e5ce8f894fe0be193bfbe971dc24e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"      $.allocation_requests.`len`: 2"},{"line_number":40,"context_line":"      # Verify that compute node #1 only has VCPU and MEMORY_MB listed in the"},{"line_number":41,"context_line":"      # resource requests"},{"line_number":42,"context_line":"      $.allocation_requests..allocations[?(@.resource_provider.uuid\u003d\u0027c1c1c1c1-2894-4df1-aa6b-c61fa72ed22d\u0027)].resources[VCPU]: 1"},{"line_number":43,"context_line":"      $.allocation_requests..allocations[?(@.resource_provider.uuid\u003d\u0027c1c1c1c1-2894-4df1-aa6b-c61fa72ed22d\u0027)].resources[MEMORY_MB]: 1024"},{"line_number":44,"context_line":"      # Verify that compute node #2 only has VCPU and MEMORY_MB listed in the"},{"line_number":45,"context_line":"      # resource requests"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"5f201791_ff97a18f","line":42,"updated":"2017-06-22 18:21:14.000000000","message":"Does this mean that this looks like:\n\n {\n   allocation_requests: {\n     allocations: [\n       \u003c!-- allocation body --\u003e,\n     ],\n   },\n   provider_summaries: {\n }\n\n?","commit_id":"98e589632f872972cc650823bfc55ad5c4e6953f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8a703f93dc2e147b483ec3038cf89daa1a0e4f5b","unresolved":false,"context_lines":[{"line_number":39,"context_line":"      $.allocation_requests.`len`: 2"},{"line_number":40,"context_line":"      # Verify that compute node #1 only has VCPU and MEMORY_MB listed in the"},{"line_number":41,"context_line":"      # resource requests"},{"line_number":42,"context_line":"      $.allocation_requests..allocations[?(@.resource_provider.uuid\u003d\u0027c1c1c1c1-2894-4df1-aa6b-c61fa72ed22d\u0027)].resources[VCPU]: 1"},{"line_number":43,"context_line":"      $.allocation_requests..allocations[?(@.resource_provider.uuid\u003d\u0027c1c1c1c1-2894-4df1-aa6b-c61fa72ed22d\u0027)].resources[MEMORY_MB]: 1024"},{"line_number":44,"context_line":"      # Verify that compute node #2 only has VCPU and MEMORY_MB listed in the"},{"line_number":45,"context_line":"      # resource requests"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"5f201791_2f66ec52","line":42,"in_reply_to":"5f201791_ff97a18f","updated":"2017-06-23 13:22:31.000000000","message":"No, like this:\n\n  {\n   allocation_requests: [\n     {\n       allocations: [\n         {\n           \u0027resource_provider\u0027: {\n             \u0027uuid\u0027: \u003cUUID\u003e\n           },\n           \u0027resources\u0027: {\n             \u0027VCPU\u0027: 1,\n             \u0027MEMORY_MB\u0027: 1024\n           }\n         }, ...\n       ],\n     },\n   ],\n   provider_summaries: {\n }\n\nThe \u003c!-- allocation body --\u003e is the dict that has a single element \"allocations\" which is a list of dicts that have a resource_provider and a resources element.\n\nEach of the allocation_requests list elements is a JSON object that can be sent as-is to the PUT /allocations/{consumer_uuid} endpoint.","commit_id":"98e589632f872972cc650823bfc55ad5c4e6953f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a4728424f63e5ce8f894fe0be193bfbe971dc24e","unresolved":false,"context_lines":[{"line_number":63,"context_line":"      # Verify that the resources listed in the provider summary for shared"},{"line_number":64,"context_line":"      # storage show correct capacity and usage"},{"line_number":65,"context_line":"      $.provider_summaries[\u0027dddddddd-61a6-472e-b8c1-74796e803066\u0027].resources[DISK_GB].capacity: 1900 # 1.0 * 2000 - 100G"},{"line_number":66,"context_line":"      $.provider_summaries[\u0027dddddddd-61a6-472e-b8c1-74796e803066\u0027].resources[DISK_GB].used: 0"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"5f201791_1f5a5d29","line":66,"updated":"2017-06-22 18:21:14.000000000","message":"I\u0027ll just reiterate here that testing this API only via gabbit means I have no place I can go to see what this blob actually looks like. I can construct it in my head from this, or from the code, or go deploy it somewhere and look myself. That makes it hard to validate that this complex structure looks like I expect :/","commit_id":"98e589632f872972cc650823bfc55ad5c4e6953f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8a703f93dc2e147b483ec3038cf89daa1a0e4f5b","unresolved":false,"context_lines":[{"line_number":63,"context_line":"      # Verify that the resources listed in the provider summary for shared"},{"line_number":64,"context_line":"      # storage show correct capacity and usage"},{"line_number":65,"context_line":"      $.provider_summaries[\u0027dddddddd-61a6-472e-b8c1-74796e803066\u0027].resources[DISK_GB].capacity: 1900 # 1.0 * 2000 - 100G"},{"line_number":66,"context_line":"      $.provider_summaries[\u0027dddddddd-61a6-472e-b8c1-74796e803066\u0027].resources[DISK_GB].used: 0"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"5f201791_0f5d7079","line":66,"in_reply_to":"5f201791_1f5a5d29","updated":"2017-06-23 13:22:31.000000000","message":"Agreed. I wish there was a mode in Gabbi that we could put the entire expected response in JSON format.","commit_id":"98e589632f872972cc650823bfc55ad5c4e6953f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"54cef180af65b0ca25b2dcb44c03556d72f28c3e","unresolved":false,"context_lines":[{"line_number":21,"context_line":"#  os.environ[\u0027AGG_UUID\u0027] \u003d \u0027aaaaaaaa-04b3-458c-9e9f-361aad56f41c\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"- name: get allocation candidates before microversion"},{"line_number":24,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1"},{"line_number":25,"context_line":"  request_headers:"},{"line_number":26,"context_line":"      openstack-api-version: placement 1.8"},{"line_number":27,"context_line":"  status: 404"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"3f1d235d_6cf0bfca","line":24,"range":{"start_line":24,"start_character":40,"end_line":24,"end_character":44},"updated":"2017-06-30 02:10:53.000000000","message":"Better to have a case for invalid resource class","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"958c99ff1e07fa1410b2d105ebec43b811c092fe","unresolved":false,"context_lines":[{"line_number":21,"context_line":"#  os.environ[\u0027AGG_UUID\u0027] \u003d \u0027aaaaaaaa-04b3-458c-9e9f-361aad56f41c\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"- name: get allocation candidates before microversion"},{"line_number":24,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1"},{"line_number":25,"context_line":"  request_headers:"},{"line_number":26,"context_line":"      openstack-api-version: placement 1.8"},{"line_number":27,"context_line":"  status: 404"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"3f1d235d_bf002536","line":24,"range":{"start_line":24,"start_character":40,"end_line":24,"end_character":44},"in_reply_to":"3f1d235d_6cf0bfca","updated":"2017-06-30 13:40:12.000000000","message":"+1","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"61596fd61395f8748cd856a97cbfb3cab02fde9b","unresolved":false,"context_lines":[{"line_number":32,"context_line":"  response_strings:"},{"line_number":33,"context_line":"      - \"\u0027resources\u0027 is a required property\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"- name: get allocation candidates no allocations yet"},{"line_number":36,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1,MEMORY_MB:1024,DISK_GB:100"},{"line_number":37,"context_line":"  status: 200"},{"line_number":38,"context_line":"  response_json_paths:"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"3f1d235d_b545f372","line":35,"updated":"2017-06-30 07:00:33.000000000","message":"I know we\u0027re using gabbi and that\u0027s cool, but it would be nice to have an actual functional test that gets these allocation candidates, picks one and then does the PUT /allocations for a given resource provider in the summary, and then do another GET /allocation_candidates request and sees that things have changed because we made an allocation request for available capacity is decremented.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"54cef180af65b0ca25b2dcb44c03556d72f28c3e","unresolved":false,"context_lines":[{"line_number":42,"context_line":"      # However, there are only 2 allocation requests, one for each compute"},{"line_number":43,"context_line":"      # node that provides the VCPU/MEMORY_MB and DISK_GB provided by the"},{"line_number":44,"context_line":"      # shared storage provider"},{"line_number":45,"context_line":"      $.allocation_requests.`len`: 2"},{"line_number":46,"context_line":"      # Verify that compute node #1 only has VCPU and MEMORY_MB listed in the"},{"line_number":47,"context_line":"      # resource requests"},{"line_number":48,"context_line":"      $.allocation_requests..allocations[?(@.resource_provider.uuid\u003d\u0027c1c1c1c1-2894-4df1-aa6b-c61fa72ed22d\u0027)].resources[VCPU]: 1"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"3f1d235d_6cac3f8c","line":45,"range":{"start_line":45,"start_character":6,"end_line":45,"end_character":36},"updated":"2017-06-30 02:10:53.000000000","message":"It would be created if we can put the response of this API into the allocation API.\n\nlooks like gabbi can do that. copy from the gabbi doc:\n\n# $RESPONSE\" provides access to the JSON in the prior response, via\n# JSONPath. See http://jsonpath-rw.readthedocs.io/ for\n# jsonpath-rw formatting.\"\n\nBut I\u0027m not sure how to add user_id and project_id into the request body;.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"61596fd61395f8748cd856a97cbfb3cab02fde9b","unresolved":false,"context_lines":[{"line_number":43,"context_line":"      # node that provides the VCPU/MEMORY_MB and DISK_GB provided by the"},{"line_number":44,"context_line":"      # shared storage provider"},{"line_number":45,"context_line":"      $.allocation_requests.`len`: 2"},{"line_number":46,"context_line":"      # Verify that compute node #1 only has VCPU and MEMORY_MB listed in the"},{"line_number":47,"context_line":"      # resource requests"},{"line_number":48,"context_line":"      $.allocation_requests..allocations[?(@.resource_provider.uuid\u003d\u0027c1c1c1c1-2894-4df1-aa6b-c61fa72ed22d\u0027)].resources[VCPU]: 1"},{"line_number":49,"context_line":"      $.allocation_requests..allocations[?(@.resource_provider.uuid\u003d\u0027c1c1c1c1-2894-4df1-aa6b-c61fa72ed22d\u0027)].resources[MEMORY_MB]: 1024"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"3f1d235d_f5948bea","line":46,"updated":"2017-06-30 07:00:33.000000000","message":"Thanks for comments because the format here is hard for me to read and understand.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"61596fd61395f8748cd856a97cbfb3cab02fde9b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"      $.allocation_requests.`len`: 2"},{"line_number":46,"context_line":"      # Verify that compute node #1 only has VCPU and MEMORY_MB listed in the"},{"line_number":47,"context_line":"      # resource requests"},{"line_number":48,"context_line":"      $.allocation_requests..allocations[?(@.resource_provider.uuid\u003d\u0027c1c1c1c1-2894-4df1-aa6b-c61fa72ed22d\u0027)].resources[VCPU]: 1"},{"line_number":49,"context_line":"      $.allocation_requests..allocations[?(@.resource_provider.uuid\u003d\u0027c1c1c1c1-2894-4df1-aa6b-c61fa72ed22d\u0027)].resources[MEMORY_MB]: 1024"},{"line_number":50,"context_line":"      # Verify that compute node #2 only has VCPU and MEMORY_MB listed in the"},{"line_number":51,"context_line":"      # resource requests"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"3f1d235d_b5b73387","line":48,"range":{"start_line":48,"start_character":27,"end_line":48,"end_character":29},"updated":"2017-06-30 07:00:33.000000000","message":"This is a wildcard or...? This goes back to my question about flattening the structure of the allocation requests in the response - this would be easier to visualize if we had an API ref sample in this change too, but maybe we aren\u0027t far enough along yet in the placement API samples to get to 1.10 for this change?","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"958c99ff1e07fa1410b2d105ebec43b811c092fe","unresolved":false,"context_lines":[{"line_number":69,"context_line":"      # Verify that the resources listed in the provider summary for shared"},{"line_number":70,"context_line":"      # storage show correct capacity and usage"},{"line_number":71,"context_line":"      $.provider_summaries[\u0027dddddddd-61a6-472e-b8c1-74796e803066\u0027].resources[DISK_GB].capacity: 1900 # 1.0 * 2000 - 100G"},{"line_number":72,"context_line":"      $.provider_summaries[\u0027dddddddd-61a6-472e-b8c1-74796e803066\u0027].resources[DISK_GB].used: 0"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"3f1d235d_df552152","line":72,"updated":"2017-06-30 13:40:12.000000000","message":"Some other tests could be verifying that if we have empty allocation candidates with accepted resource names.","commit_id":"d35e68ece35d9d5cc069506ea704e40235e3c129"}]}
