)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"30aea1f47ddde1521cdf75437d4b9709c99f2e38","unresolved":false,"context_lines":[{"line_number":14,"context_line":"/allocations to set allocations for multiple consumers, such as an"},{"line_number":15,"context_line":"an instance and a migration uuid. Conceptually it is relatively"},{"line_number":16,"context_line":"simple: build an AllocationList of Allocation objects and"},{"line_number":17,"context_line":"create_al(). But there are some wrinkles:"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"* The association between consumer_uuid and project id is only done"},{"line_number":20,"context_line":"  for the consumer of the first allocation, resulting in bad /usages"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f287b81_797302b3","line":17,"range":{"start_line":17,"start_character":7,"end_line":17,"end_character":9},"updated":"2017-09-01 14:48:41.000000000","message":"Who\u0027s Al?","commit_id":"9eff3e01b0c2550c6279c7cec3ab555bc33dbb6a"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"89f93aa2dd3bf8e2c162108e688d6db9c3bb6474","unresolved":false,"context_lines":[{"line_number":14,"context_line":"/allocations to set allocations for multiple consumers, such as an"},{"line_number":15,"context_line":"an instance and a migration uuid. Conceptually it is relatively"},{"line_number":16,"context_line":"simple: build an AllocationList of Allocation objects and"},{"line_number":17,"context_line":"create_al(). But there are some wrinkles:"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"* The association between consumer_uuid and project id is only done"},{"line_number":20,"context_line":"  for the consumer of the first allocation, resulting in bad /usages"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f287b81_3979fa2e","line":17,"in_reply_to":"7f287b81_797302b3","updated":"2017-09-01 14:52:28.000000000","message":"Whoever you want them to be.","commit_id":"9eff3e01b0c2550c6279c7cec3ab555bc33dbb6a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a4a317a18e10538465f06f7355f0b01500c9dc46","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Being able to set allocations for multiple consumers in one request"},{"line_number":17,"context_line":"helps to address race conditions when cleaning up allocations during"},{"line_number":18,"context_line":"move operations in nova."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Clearing allocations is done by setting the \u0027allocations\u0027 key to an"},{"line_number":21,"context_line":"empty dict."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"3f4b6375_69b48180","line":18,"updated":"2017-10-27 19:04:07.000000000","message":"ack.","commit_id":"4beab7ce4d45c003ac9bbd05f4235725e4ea125c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7af7cab790f706772a850d0068e8aef2649f88b4","unresolved":false,"context_lines":[{"line_number":17,"context_line":"helps to address race conditions when cleaning up allocations during"},{"line_number":18,"context_line":"move operations in nova."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Clearing allocations is done by setting the \u0027allocations\u0027 key to an"},{"line_number":21,"context_line":"empty dict."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Updates to placement-api-ref, rest version history and a reno are"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":27,"id":"3f4b6375_a5b015df","line":20,"range":{"start_line":20,"start_character":58,"end_line":20,"end_character":61},"updated":"2017-10-30 14:59:28.000000000","message":"allocations key *for a specific consumer*","commit_id":"8a9ed7cf03bb9acdb55398c6e67d2e274a8a8c1f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a8e249406b2c02c3b5869831a355c1eec0b80392","unresolved":false,"context_lines":[{"line_number":17,"context_line":"helps to address race conditions when cleaning up allocations during"},{"line_number":18,"context_line":"move operations in nova."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Clearing allocations is done by setting the \u0027allocations\u0027 key to an"},{"line_number":21,"context_line":"empty dict."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Updates to placement-api-ref, rest version history and a reno are"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":27,"id":"3f4b6375_2369bd8a","line":20,"range":{"start_line":20,"start_character":58,"end_line":20,"end_character":61},"in_reply_to":"3f4b6375_a5b015df","updated":"2017-10-30 15:35:29.000000000","message":"ya","commit_id":"8a9ed7cf03bb9acdb55398c6e67d2e274a8a8c1f"}],"nova/api/openstack/placement/handler.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a4a317a18e10538465f06f7355f0b01500c9dc46","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    },"},{"line_number":106,"context_line":"    \u0027/allocations/{consumer_uuid}\u0027: {"},{"line_number":107,"context_line":"        \u0027GET\u0027: allocation.list_for_consumer,"},{"line_number":108,"context_line":"        \u0027PUT\u0027: allocation.set_allocations,"},{"line_number":109,"context_line":"        \u0027DELETE\u0027: allocation.delete_allocations,"},{"line_number":110,"context_line":"    },"},{"line_number":111,"context_line":"    \u0027/allocation_candidates\u0027: {"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f4b6375_097aadb8","line":108,"range":{"start_line":108,"start_character":27,"end_line":108,"end_character":41},"updated":"2017-10-27 19:04:07.000000000","message":"instead of a new set_multiple() function, I\u0027d almost rather change the existing set_allocations() function to set_allocations_for_consumer() and make the new function you\u0027re adding in this patch called set_allocations(). That would make it clear that the former function is operating on a consumer and the new function has no such restriction.\n\nThoughts?","commit_id":"4beab7ce4d45c003ac9bbd05f4235725e4ea125c"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"dc30ffa8f427c13bb96b4107c41a238333981a25","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    },"},{"line_number":106,"context_line":"    \u0027/allocations/{consumer_uuid}\u0027: {"},{"line_number":107,"context_line":"        \u0027GET\u0027: allocation.list_for_consumer,"},{"line_number":108,"context_line":"        \u0027PUT\u0027: allocation.set_allocations,"},{"line_number":109,"context_line":"        \u0027DELETE\u0027: allocation.delete_allocations,"},{"line_number":110,"context_line":"    },"},{"line_number":111,"context_line":"    \u0027/allocation_candidates\u0027: {"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f4b6375_5ebb95c3","line":108,"range":{"start_line":108,"start_character":27,"end_line":108,"end_character":41},"in_reply_to":"3f4b6375_097aadb8","updated":"2017-10-27 19:46:46.000000000","message":"Yeah, I could see that. I tend to be reluctant to mess with such things if there\u0027s no strict requirement to do so, but in this case it doesn\u0027t have any impact other than improving the readability, so yeah, seems good to me.","commit_id":"4beab7ce4d45c003ac9bbd05f4235725e4ea125c"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"b735c6fcdf7609477147d7c7092994efe9fdd539","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    },"},{"line_number":106,"context_line":"    \u0027/allocations/{consumer_uuid}\u0027: {"},{"line_number":107,"context_line":"        \u0027GET\u0027: allocation.list_for_consumer,"},{"line_number":108,"context_line":"        \u0027PUT\u0027: allocation.set_allocations,"},{"line_number":109,"context_line":"        \u0027DELETE\u0027: allocation.delete_allocations,"},{"line_number":110,"context_line":"    },"},{"line_number":111,"context_line":"    \u0027/allocation_candidates\u0027: {"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f4b6375_10c17a81","line":108,"range":{"start_line":108,"start_character":27,"end_line":108,"end_character":41},"in_reply_to":"3f4b6375_3ee8d97a","updated":"2017-10-29 11:08:43.000000000","message":"Done","commit_id":"4beab7ce4d45c003ac9bbd05f4235725e4ea125c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7e145ff3043b98ed9084c43ec42f9beebe6b6033","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    },"},{"line_number":106,"context_line":"    \u0027/allocations/{consumer_uuid}\u0027: {"},{"line_number":107,"context_line":"        \u0027GET\u0027: allocation.list_for_consumer,"},{"line_number":108,"context_line":"        \u0027PUT\u0027: allocation.set_allocations,"},{"line_number":109,"context_line":"        \u0027DELETE\u0027: allocation.delete_allocations,"},{"line_number":110,"context_line":"    },"},{"line_number":111,"context_line":"    \u0027/allocation_candidates\u0027: {"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f4b6375_3ee8d97a","line":108,"range":{"start_line":108,"start_character":27,"end_line":108,"end_character":41},"in_reply_to":"3f4b6375_5ebb95c3","updated":"2017-10-27 19:59:22.000000000","message":"yeah, was just a suggestion. see if @dansmith or others have an opinion...","commit_id":"4beab7ce4d45c003ac9bbd05f4235725e4ea125c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7af7cab790f706772a850d0068e8aef2649f88b4","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    },"},{"line_number":106,"context_line":"    \u0027/allocations/{consumer_uuid}\u0027: {"},{"line_number":107,"context_line":"        \u0027GET\u0027: allocation.list_for_consumer,"},{"line_number":108,"context_line":"        \u0027PUT\u0027: allocation.set_allocations_for_consumer,"},{"line_number":109,"context_line":"        \u0027DELETE\u0027: allocation.delete_allocations,"},{"line_number":110,"context_line":"    },"},{"line_number":111,"context_line":"    \u0027/allocation_candidates\u0027: {"}],"source_content_type":"text/x-python","patch_set":27,"id":"3f4b6375_65ca1d50","line":108,"updated":"2017-10-30 14:59:28.000000000","message":"++ thanks for changing that. :)","commit_id":"8a9ed7cf03bb9acdb55398c6e67d2e274a8a8c1f"}],"nova/api/openstack/placement/handlers/allocation.py":[{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"30aea1f47ddde1521cdf75437d4b9709c99f2e38","unresolved":false,"context_lines":[{"line_number":87,"context_line":"# ALLOCATION_SET_MULTIPLE_SCHEMA \u003d {"},{"line_number":88,"context_line":"\"\"\""},{"line_number":89,"context_line":"{"},{"line_number":90,"context_line":"    \"38b74342-b77f-4b54-b504-a3c8d4f95c9b\": {"},{"line_number":91,"context_line":"        \"project_id\": \"f234d33d-09b1-4b93-8b71-4cbb5c92c825\","},{"line_number":92,"context_line":"        \"allocations\": {"},{"line_number":93,"context_line":"            \"acd61be4-4d92-4986-8d4b-7184b17c57e5\": {"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_79f662fc","line":90,"range":{"start_line":90,"start_character":4,"end_line":90,"end_character":42},"updated":"2017-09-01 14:48:41.000000000","message":"This is the consumer ID, right?","commit_id":"9eff3e01b0c2550c6279c7cec3ab555bc33dbb6a"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"89f93aa2dd3bf8e2c162108e688d6db9c3bb6474","unresolved":false,"context_lines":[{"line_number":87,"context_line":"# ALLOCATION_SET_MULTIPLE_SCHEMA \u003d {"},{"line_number":88,"context_line":"\"\"\""},{"line_number":89,"context_line":"{"},{"line_number":90,"context_line":"    \"38b74342-b77f-4b54-b504-a3c8d4f95c9b\": {"},{"line_number":91,"context_line":"        \"project_id\": \"f234d33d-09b1-4b93-8b71-4cbb5c92c825\","},{"line_number":92,"context_line":"        \"allocations\": {"},{"line_number":93,"context_line":"            \"acd61be4-4d92-4986-8d4b-7184b17c57e5\": {"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_b9928a4a","line":90,"in_reply_to":"7f287b81_79f662fc","updated":"2017-09-01 14:52:28.000000000","message":"yeah, sorry I have added some comments, but I\u0027m a bit rushing","commit_id":"9eff3e01b0c2550c6279c7cec3ab555bc33dbb6a"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"89f93aa2dd3bf8e2c162108e688d6db9c3bb6474","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    \"38b74342-b77f-4b54-b504-a3c8d4f95c9b\": {"},{"line_number":91,"context_line":"        \"project_id\": \"f234d33d-09b1-4b93-8b71-4cbb5c92c825\","},{"line_number":92,"context_line":"        \"allocations\": {"},{"line_number":93,"context_line":"            \"acd61be4-4d92-4986-8d4b-7184b17c57e5\": {"},{"line_number":94,"context_line":"                \"resources\": {"},{"line_number":95,"context_line":"                    \"DISK_GB\": 5"},{"line_number":96,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_799c225d","line":93,"updated":"2017-09-01 14:52:28.000000000","message":"resource provider id","commit_id":"9eff3e01b0c2550c6279c7cec3ab555bc33dbb6a"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"89f93aa2dd3bf8e2c162108e688d6db9c3bb6474","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        },"},{"line_number":105,"context_line":"        \"user_id\": \"6d85fb40-f673-4715-ba3e-1528ddd90bd8\""},{"line_number":106,"context_line":"    },"},{"line_number":107,"context_line":"    \"8050d031-db7d-4113-8a76-7f8c793b82da\": {"},{"line_number":108,"context_line":"        \"project_id\": \"f234d33d-09b1-4b93-8b71-4cbb5c92c825\","},{"line_number":109,"context_line":"        \"allocations\": {"},{"line_number":110,"context_line":"            \"a9ed707b-ac7a-4870-982f-5b3974cc7c5b\": {"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_59a16695","line":107,"updated":"2017-09-01 14:52:28.000000000","message":"consumer uuid","commit_id":"9eff3e01b0c2550c6279c7cec3ab555bc33dbb6a"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"30aea1f47ddde1521cdf75437d4b9709c99f2e38","unresolved":false,"context_lines":[{"line_number":362,"context_line":"    # TODO(cdent): duped from _set_allocations:"},{"line_number":363,"context_line":"    # TODO(cdent): right now this only allows a single project_id and"},{"line_number":364,"context_line":"    # user_id because that\u0027s on the AllocationList, not the Allocation,"},{"line_number":365,"context_line":"    # which seems wrong. And, if there are two different consumer uuid"},{"line_number":366,"context_line":"    # in a AllocationList only one is associated with the project id,"},{"line_number":367,"context_line":"    # results in /usages reporting problems (see xfail in"},{"line_number":368,"context_line":"    # alocations-post.yaml)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_d92c364c","line":365,"range":{"start_line":365,"start_character":6,"end_line":365,"end_character":23},"updated":"2017-09-01 14:48:41.000000000","message":"Agree. In the original design, where there could only be a single consumer in an AllocationList, it made sense not to duplicate that info. But if we\u0027re changing the design to allow for multiple consumers, then they should be moved to the Allocation objects.","commit_id":"9eff3e01b0c2550c6279c7cec3ab555bc33dbb6a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"dbde453cb8bd976bbd283f0c0e10bffcd39f1261","unresolved":false,"context_lines":[{"line_number":364,"context_line":"            allocations \u003d objects.AllocationList.get_all_by_consumer_id("},{"line_number":365,"context_line":"                context, consumer_uuid)"},{"line_number":366,"context_line":"            for allocation in allocations:"},{"line_number":367,"context_line":"                zeroed_allocation \u003d objects.Allocation("},{"line_number":368,"context_line":"                    resource_provider\u003dallocation.resource_provider,"},{"line_number":369,"context_line":"                    consumer_id\u003dconsumer_uuid,"},{"line_number":370,"context_line":"                    resource_class\u003dallocation.resource_class,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f287b81_211b98ca","line":367,"updated":"2017-09-06 17:41:41.000000000","message":"Do you really need to do this? Can you not just zero the value and save()?","commit_id":"73b4b5312cc5d476b75f0ac23acdd01dc9e2d0c8"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"924c128586444a263db9596257c3d08206edce1f","unresolved":false,"context_lines":[{"line_number":364,"context_line":"            allocations \u003d objects.AllocationList.get_all_by_consumer_id("},{"line_number":365,"context_line":"                context, consumer_uuid)"},{"line_number":366,"context_line":"            for allocation in allocations:"},{"line_number":367,"context_line":"                zeroed_allocation \u003d objects.Allocation("},{"line_number":368,"context_line":"                    resource_provider\u003dallocation.resource_provider,"},{"line_number":369,"context_line":"                    consumer_id\u003dconsumer_uuid,"},{"line_number":370,"context_line":"                    resource_class\u003dallocation.resource_class,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f287b81_182586c2","line":367,"in_reply_to":"7f287b81_12858c5a","updated":"2017-09-07 22:40:12.000000000","message":"Yeah, I know why you\u0027re doing it. I would expect to embed that behavior in save() because it\u0027s specific to how allocation works. However, maybe that doesn\u0027t make sense as we really want to do create_all() on most things.\n\nAnyway, you could do this:\n\n del allocation.id\n\nto disconnect the object from the row in the database that represents it and then just pass this again to create_all().\n\nAnyway, I didn\u0027t mean to take specific exception to this, I was just kinda surprised to see it.","commit_id":"73b4b5312cc5d476b75f0ac23acdd01dc9e2d0c8"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"db64cb36d28e4ae8186c6a9498488a9a9a066af3","unresolved":false,"context_lines":[{"line_number":364,"context_line":"            allocations \u003d objects.AllocationList.get_all_by_consumer_id("},{"line_number":365,"context_line":"                context, consumer_uuid)"},{"line_number":366,"context_line":"            for allocation in allocations:"},{"line_number":367,"context_line":"                zeroed_allocation \u003d objects.Allocation("},{"line_number":368,"context_line":"                    resource_provider\u003dallocation.resource_provider,"},{"line_number":369,"context_line":"                    consumer_id\u003dconsumer_uuid,"},{"line_number":370,"context_line":"                    resource_class\u003dallocation.resource_class,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f287b81_12858c5a","line":367,"in_reply_to":"7f287b81_211b98ca","updated":"2017-09-06 19:06:51.000000000","message":"My understanding was that the requirement here was to make sure that all the updates are happening within the transaction and rp generation handling that is built in to create_all().\n\nIf that\u0027s the case, then we don\u0027t want to save() here. Also, at some point in the past we declared that allocations were to be created and deleted via the AllocationList object, not Allocation.\n\nI tried initially to change used on the existing allocation object (rather than create a fresh clone) but the internals of create_all() want to reject an existing object and this seemed the most explicit way of saying \"yeah, this is a new one\". Is there a better way to do that?","commit_id":"73b4b5312cc5d476b75f0ac23acdd01dc9e2d0c8"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"306808abed15673435f901355dab244c53515a97","unresolved":false,"context_lines":[{"line_number":398,"context_line":""},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"@wsgi_wrapper.PlacementWsgify"},{"line_number":401,"context_line":"@microversion.version_handler(\u00271.11\u0027)"},{"line_number":402,"context_line":"@util.require_content(\u0027application/json\u0027)"},{"line_number":403,"context_line":"def set_multiple(req):"},{"line_number":404,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f4e5783_bc1e026e","line":401,"range":{"start_line":401,"start_character":31,"end_line":401,"end_character":35},"updated":"2017-10-10 15:56:02.000000000","message":"Should be 1.12, no?","commit_id":"609ad379af66087ccc732578f8dc7de6d1864ffd"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9bf6822bbea1431c61533d40a0549faf635a2dc5","unresolved":false,"context_lines":[{"line_number":398,"context_line":""},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"@wsgi_wrapper.PlacementWsgify"},{"line_number":401,"context_line":"@microversion.version_handler(\u00271.11\u0027)"},{"line_number":402,"context_line":"@util.require_content(\u0027application/json\u0027)"},{"line_number":403,"context_line":"def set_multiple(req):"},{"line_number":404,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f4e5783_5212575a","line":401,"range":{"start_line":401,"start_character":31,"end_line":401,"end_character":35},"in_reply_to":"5f4e5783_bc1e026e","updated":"2017-10-10 16:22:00.000000000","message":"indeed","commit_id":"609ad379af66087ccc732578f8dc7de6d1864ffd"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"306808abed15673435f901355dab244c53515a97","unresolved":false,"context_lines":[{"line_number":440,"context_line":"    try:"},{"line_number":441,"context_line":"        allocations.create_all()"},{"line_number":442,"context_line":"        LOG.debug(\"Successfully wrote allocations %s\", allocations)"},{"line_number":443,"context_line":"    # InvalidInventory is a parent for several exceptions that"},{"line_number":444,"context_line":"    # indicate either that Inventory is not present, or that"},{"line_number":445,"context_line":"    # capacity limits have been exceeded."},{"line_number":446,"context_line":"    except exception.NotFound as exc:"},{"line_number":447,"context_line":"        # TODO(cdent): this is the wrong error message. We may have many"},{"line_number":448,"context_line":"        # resource providers or consmers. Perhaps use request id?"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f4e5783_7c71aae0","line":445,"range":{"start_line":443,"start_character":0,"end_line":445,"end_character":41},"updated":"2017-10-10 15:56:02.000000000","message":"Nit: this comment should probable go either after the appropriate `except:` line, or above the `try:`.","commit_id":"609ad379af66087ccc732578f8dc7de6d1864ffd"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9bf6822bbea1431c61533d40a0549faf635a2dc5","unresolved":false,"context_lines":[{"line_number":440,"context_line":"    try:"},{"line_number":441,"context_line":"        allocations.create_all()"},{"line_number":442,"context_line":"        LOG.debug(\"Successfully wrote allocations %s\", allocations)"},{"line_number":443,"context_line":"    # InvalidInventory is a parent for several exceptions that"},{"line_number":444,"context_line":"    # indicate either that Inventory is not present, or that"},{"line_number":445,"context_line":"    # capacity limits have been exceeded."},{"line_number":446,"context_line":"    except exception.NotFound as exc:"},{"line_number":447,"context_line":"        # TODO(cdent): this is the wrong error message. We may have many"},{"line_number":448,"context_line":"        # resource providers or consmers. Perhaps use request id?"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f4e5783_9221efa2","line":445,"range":{"start_line":443,"start_character":0,"end_line":445,"end_character":41},"in_reply_to":"5f4e5783_7c71aae0","updated":"2017-10-10 16:22:00.000000000","message":"Yeah, that\u0027s a pasto from the original, thanks.","commit_id":"609ad379af66087ccc732578f8dc7de6d1864ffd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a4a317a18e10538465f06f7355f0b01500c9dc46","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        # TODO(cdent): this is the wrong error message. We may have many"},{"line_number":451,"context_line":"        # resource providers or consumers. Perhaps use request id?"},{"line_number":452,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":453,"context_line":"                _(\"Unable to allocate inventory for resource provider \""},{"line_number":454,"context_line":"                  \"%(rp_uuid)s: %(error)s\") %"},{"line_number":455,"context_line":"            {\u0027rp_uuid\u0027: resource_provider_uuid, \u0027error\u0027: exc})"},{"line_number":456,"context_line":"    except exception.InvalidInventory as exc:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f4b6375_94ac709f","line":453,"range":{"start_line":453,"start_character":19,"end_line":453,"end_character":47},"updated":"2017-10-27 19:04:07.000000000","message":"This is the wrong error message if the branch of code from line 433 runs...","commit_id":"4beab7ce4d45c003ac9bbd05f4235725e4ea125c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7e145ff3043b98ed9084c43ec42f9beebe6b6033","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        # TODO(cdent): this is the wrong error message. We may have many"},{"line_number":451,"context_line":"        # resource providers or consumers. Perhaps use request id?"},{"line_number":452,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":453,"context_line":"                _(\"Unable to allocate inventory for resource provider \""},{"line_number":454,"context_line":"                  \"%(rp_uuid)s: %(error)s\") %"},{"line_number":455,"context_line":"            {\u0027rp_uuid\u0027: resource_provider_uuid, \u0027error\u0027: exc})"},{"line_number":456,"context_line":"    except exception.InvalidInventory as exc:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f4b6375_9ef8ed49","line":453,"range":{"start_line":453,"start_character":19,"end_line":453,"end_character":47},"in_reply_to":"3f4b6375_1eb51dce","updated":"2017-10-27 19:59:22.000000000","message":"Yeah, I\u0027d be fine with just using the request ID","commit_id":"4beab7ce4d45c003ac9bbd05f4235725e4ea125c"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"dc30ffa8f427c13bb96b4107c41a238333981a25","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        # TODO(cdent): this is the wrong error message. We may have many"},{"line_number":451,"context_line":"        # resource providers or consumers. Perhaps use request id?"},{"line_number":452,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":453,"context_line":"                _(\"Unable to allocate inventory for resource provider \""},{"line_number":454,"context_line":"                  \"%(rp_uuid)s: %(error)s\") %"},{"line_number":455,"context_line":"            {\u0027rp_uuid\u0027: resource_provider_uuid, \u0027error\u0027: exc})"},{"line_number":456,"context_line":"    except exception.InvalidInventory as exc:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f4b6375_1eb51dce","line":453,"range":{"start_line":453,"start_character":19,"end_line":453,"end_character":47},"in_reply_to":"3f4b6375_94ac709f","updated":"2017-10-27 19:46:46.000000000","message":"that too, yeah\n\nI guess I never got around to deciding how to fix this, maybe I will make it not identify anything, and let the request id do its job?","commit_id":"4beab7ce4d45c003ac9bbd05f4235725e4ea125c"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"b735c6fcdf7609477147d7c7092994efe9fdd539","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        # TODO(cdent): this is the wrong error message. We may have many"},{"line_number":451,"context_line":"        # resource providers or consumers. Perhaps use request id?"},{"line_number":452,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":453,"context_line":"                _(\"Unable to allocate inventory for resource provider \""},{"line_number":454,"context_line":"                  \"%(rp_uuid)s: %(error)s\") %"},{"line_number":455,"context_line":"            {\u0027rp_uuid\u0027: resource_provider_uuid, \u0027error\u0027: exc})"},{"line_number":456,"context_line":"    except exception.InvalidInventory as exc:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f4b6375_5044921b","line":453,"range":{"start_line":453,"start_character":19,"end_line":453,"end_character":47},"in_reply_to":"3f4b6375_9ef8ed49","updated":"2017-10-29 11:08:43.000000000","message":"Done","commit_id":"4beab7ce4d45c003ac9bbd05f4235725e4ea125c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a4a317a18e10538465f06f7355f0b01500c9dc46","unresolved":false,"context_lines":[{"line_number":452,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":453,"context_line":"                _(\"Unable to allocate inventory for resource provider \""},{"line_number":454,"context_line":"                  \"%(rp_uuid)s: %(error)s\") %"},{"line_number":455,"context_line":"            {\u0027rp_uuid\u0027: resource_provider_uuid, \u0027error\u0027: exc})"},{"line_number":456,"context_line":"    except exception.InvalidInventory as exc:"},{"line_number":457,"context_line":"        # InvalidInventory is a parent for several exceptions that"},{"line_number":458,"context_line":"        # indicate either that Inventory is not present, or that"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f4b6375_94291038","line":455,"range":{"start_line":455,"start_character":24,"end_line":455,"end_character":46},"updated":"2017-10-27 19:04:07.000000000","message":"no such variable will exist if the branch of code starting on line 433 runs...","commit_id":"4beab7ce4d45c003ac9bbd05f4235725e4ea125c"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"dc30ffa8f427c13bb96b4107c41a238333981a25","unresolved":false,"context_lines":[{"line_number":452,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":453,"context_line":"                _(\"Unable to allocate inventory for resource provider \""},{"line_number":454,"context_line":"                  \"%(rp_uuid)s: %(error)s\") %"},{"line_number":455,"context_line":"            {\u0027rp_uuid\u0027: resource_provider_uuid, \u0027error\u0027: exc})"},{"line_number":456,"context_line":"    except exception.InvalidInventory as exc:"},{"line_number":457,"context_line":"        # InvalidInventory is a parent for several exceptions that"},{"line_number":458,"context_line":"        # indicate either that Inventory is not present, or that"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f4b6375_1eeabdab","line":455,"range":{"start_line":455,"start_character":24,"end_line":455,"end_character":46},"in_reply_to":"3f4b6375_94291038","updated":"2017-10-27 19:46:46.000000000","message":"Yes, and if it does, it will be wrong.","commit_id":"4beab7ce4d45c003ac9bbd05f4235725e4ea125c"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"9183b6dcb40d64efee2ac0a07531472a644e84e4","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"# POST to /allocations uses this to allow multiple allocations"},{"line_number":142,"context_line":"# from multiple consumers in one request. It is a dict, keyed by"},{"line_number":143,"context_line":"# consumer uuid, of v1.12 allocations. In POST the allocations"},{"line_number":144,"context_line":"# can be empty."},{"line_number":145,"context_line":"DELETABLE_ALLOCATIONS \u003d copy.deepcopy(ALLOCATION_SCHEMA_V1_12)"},{"line_number":146,"context_line":"DELETABLE_ALLOCATIONS[\u0027properties\u0027][\u0027allocations\u0027][\u0027minProperties\u0027] \u003d 0"}],"source_content_type":"text/x-python","patch_set":26,"id":"3f4b6375_0b61453a","line":143,"range":{"start_line":143,"start_character":23,"end_line":143,"end_character":25},"updated":"2017-10-30 09:21:17.000000000","message":"typo","commit_id":"645a59968f2a4687e140736032bf0e44a9f83f5f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9b8496fcb2e6cce55c58b54daa9adc2ef9f050a8","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"# POST to /allocations uses this to allow multiple allocations"},{"line_number":142,"context_line":"# from multiple consumers in one request. It is a dict, keyed by"},{"line_number":143,"context_line":"# consumer uuid, of v1.12 allocations. In POST the allocations"},{"line_number":144,"context_line":"# can be empty."},{"line_number":145,"context_line":"DELETABLE_ALLOCATIONS \u003d copy.deepcopy(ALLOCATION_SCHEMA_V1_12)"},{"line_number":146,"context_line":"DELETABLE_ALLOCATIONS[\u0027properties\u0027][\u0027allocations\u0027][\u0027minProperties\u0027] \u003d 0"}],"source_content_type":"text/x-python","patch_set":26,"id":"3f4b6375_173602b6","line":143,"range":{"start_line":143,"start_character":23,"end_line":143,"end_character":25},"in_reply_to":"3f4b6375_0b61453a","updated":"2017-10-30 11:04:37.000000000","message":"This is correct. The allocations are in the form used in 1.12 (see above). POST using that form in 1.13\n\nI\u0027ll make the comment more clear.","commit_id":"645a59968f2a4687e140736032bf0e44a9f83f5f"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"9183b6dcb40d64efee2ac0a07531472a644e84e4","unresolved":false,"context_lines":[{"line_number":142,"context_line":"# from multiple consumers in one request. It is a dict, keyed by"},{"line_number":143,"context_line":"# consumer uuid, of v1.12 allocations. In POST the allocations"},{"line_number":144,"context_line":"# can be empty."},{"line_number":145,"context_line":"DELETABLE_ALLOCATIONS \u003d copy.deepcopy(ALLOCATION_SCHEMA_V1_12)"},{"line_number":146,"context_line":"DELETABLE_ALLOCATIONS[\u0027properties\u0027][\u0027allocations\u0027][\u0027minProperties\u0027] \u003d 0"},{"line_number":147,"context_line":"ALLOCATION_SET_MULTIPLE_SCHEMA \u003d {"},{"line_number":148,"context_line":"    \"type\": \"object\","}],"source_content_type":"text/x-python","patch_set":26,"id":"3f4b6375_cb5a0d82","line":145,"range":{"start_line":145,"start_character":38,"end_line":145,"end_character":61},"updated":"2017-10-30 09:21:17.000000000","message":"need sync","commit_id":"645a59968f2a4687e140736032bf0e44a9f83f5f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7af7cab790f706772a850d0068e8aef2649f88b4","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                project_id\u003ddata.get(\u0027project_id\u0027),"},{"line_number":318,"context_line":"                user_id\u003ddata.get(\u0027user_id\u0027),"},{"line_number":319,"context_line":"                used\u003dresources[resource_class])"},{"line_number":320,"context_line":"            allocation_objects.append(allocation)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    allocations \u003d rp_obj.AllocationList("},{"line_number":323,"context_line":"        context, objects\u003dallocation_objects)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3f4b6375_65d9fdf2","side":"PARENT","line":320,"updated":"2017-10-30 14:59:28.000000000","message":"just moved this into a helper function, yes? I don\u0027t see any functional changes. please confirm.","commit_id":"18c9442def5833fdfa26b5b1b11e30f0a5cb53a8"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a8e249406b2c02c3b5869831a355c1eec0b80392","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                project_id\u003ddata.get(\u0027project_id\u0027),"},{"line_number":318,"context_line":"                user_id\u003ddata.get(\u0027user_id\u0027),"},{"line_number":319,"context_line":"                used\u003dresources[resource_class])"},{"line_number":320,"context_line":"            allocation_objects.append(allocation)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    allocations \u003d rp_obj.AllocationList("},{"line_number":323,"context_line":"        context, objects\u003dallocation_objects)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3f4b6375_639e9555","side":"PARENT","line":320,"in_reply_to":"3f4b6375_65d9fdf2","updated":"2017-10-30 15:35:29.000000000","message":"ya","commit_id":"18c9442def5833fdfa26b5b1b11e30f0a5cb53a8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7af7cab790f706772a850d0068e8aef2649f88b4","unresolved":false,"context_lines":[{"line_number":146,"context_line":"# modifies ALLOCATION_SCHEMA_V1_12 accordingly."},{"line_number":147,"context_line":"DELETABLE_ALLOCATIONS \u003d copy.deepcopy(ALLOCATION_SCHEMA_V1_12)"},{"line_number":148,"context_line":"DELETABLE_ALLOCATIONS[\u0027properties\u0027][\u0027allocations\u0027][\u0027minProperties\u0027] \u003d 0"},{"line_number":149,"context_line":"ALLOCATION_SET_MULTIPLE_SCHEMA \u003d {"},{"line_number":150,"context_line":"    \"type\": \"object\","},{"line_number":151,"context_line":"    \"minProperties\": 1,"},{"line_number":152,"context_line":"    \"additionalProperties\": False,"}],"source_content_type":"text/x-python","patch_set":27,"id":"3f4b6375_a5fed568","line":149,"range":{"start_line":149,"start_character":0,"end_line":149,"end_character":31},"updated":"2017-10-30 14:59:28.000000000","message":"prefer to call this POST_ALLOCATIONS_V1_13","commit_id":"8a9ed7cf03bb9acdb55398c6e67d2e274a8a8c1f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e612e3fbe881cc69e3801c3b7d93ce9615b10323","unresolved":false,"context_lines":[{"line_number":146,"context_line":"# modifies ALLOCATION_SCHEMA_V1_12 accordingly."},{"line_number":147,"context_line":"DELETABLE_ALLOCATIONS \u003d copy.deepcopy(ALLOCATION_SCHEMA_V1_12)"},{"line_number":148,"context_line":"DELETABLE_ALLOCATIONS[\u0027properties\u0027][\u0027allocations\u0027][\u0027minProperties\u0027] \u003d 0"},{"line_number":149,"context_line":"ALLOCATION_SET_MULTIPLE_SCHEMA \u003d {"},{"line_number":150,"context_line":"    \"type\": \"object\","},{"line_number":151,"context_line":"    \"minProperties\": 1,"},{"line_number":152,"context_line":"    \"additionalProperties\": False,"}],"source_content_type":"text/x-python","patch_set":27,"id":"3f4b6375_03300107","line":149,"range":{"start_line":149,"start_character":0,"end_line":149,"end_character":31},"in_reply_to":"3f4b6375_a5fed568","updated":"2017-11-19 07:50:39.000000000","message":"Done","commit_id":"8a9ed7cf03bb9acdb55398c6e67d2e274a8a8c1f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a8e249406b2c02c3b5869831a355c1eec0b80392","unresolved":false,"context_lines":[{"line_number":146,"context_line":"# modifies ALLOCATION_SCHEMA_V1_12 accordingly."},{"line_number":147,"context_line":"DELETABLE_ALLOCATIONS \u003d copy.deepcopy(ALLOCATION_SCHEMA_V1_12)"},{"line_number":148,"context_line":"DELETABLE_ALLOCATIONS[\u0027properties\u0027][\u0027allocations\u0027][\u0027minProperties\u0027] \u003d 0"},{"line_number":149,"context_line":"ALLOCATION_SET_MULTIPLE_SCHEMA \u003d {"},{"line_number":150,"context_line":"    \"type\": \"object\","},{"line_number":151,"context_line":"    \"minProperties\": 1,"},{"line_number":152,"context_line":"    \"additionalProperties\": False,"}],"source_content_type":"text/x-python","patch_set":27,"id":"3f4b6375_23fe5dae","line":149,"range":{"start_line":149,"start_character":0,"end_line":149,"end_character":31},"in_reply_to":"3f4b6375_a5fed568","updated":"2017-10-30 15:35:29.000000000","message":"that makes sense, especially now that I\u0027m change the name of the method","commit_id":"8a9ed7cf03bb9acdb55398c6e67d2e274a8a8c1f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7af7cab790f706772a850d0068e8aef2649f88b4","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    \"patternProperties\": {"},{"line_number":154,"context_line":"        \"^[0-9a-fA-F-]{36}$\": DELETABLE_ALLOCATIONS"},{"line_number":155,"context_line":"    }"},{"line_number":156,"context_line":"}"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"def _allocations_dict(allocations, key_fetcher, resource_provider\u003dNone,"}],"source_content_type":"text/x-python","patch_set":27,"id":"3f4b6375_c5655147","line":156,"updated":"2017-10-30 14:59:28.000000000","message":"Unless I\u0027m mistaken, you also need to change the minimum value of the resources patternProperties value to 0 instead of 1 for POST /allocations in order to allow deleting one single resource from a set of allocation records for a single consumer.","commit_id":"8a9ed7cf03bb9acdb55398c6e67d2e274a8a8c1f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a950157abdcd45a20eefa11ec41613439ab33ba1","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    \"patternProperties\": {"},{"line_number":154,"context_line":"        \"^[0-9a-fA-F-]{36}$\": DELETABLE_ALLOCATIONS"},{"line_number":155,"context_line":"    }"},{"line_number":156,"context_line":"}"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"def _allocations_dict(allocations, key_fetcher, resource_provider\u003dNone,"}],"source_content_type":"text/x-python","patch_set":27,"id":"3f4b6375_c30c2996","line":156,"in_reply_to":"3f4b6375_c397893a","updated":"2017-10-30 15:40:37.000000000","message":"I see. I suppose I\u0027m confusing the Python code that requires a single-item 0-valued allocation record with the REST API interface...","commit_id":"8a9ed7cf03bb9acdb55398c6e67d2e274a8a8c1f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a8e249406b2c02c3b5869831a355c1eec0b80392","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    \"patternProperties\": {"},{"line_number":154,"context_line":"        \"^[0-9a-fA-F-]{36}$\": DELETABLE_ALLOCATIONS"},{"line_number":155,"context_line":"    }"},{"line_number":156,"context_line":"}"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"def _allocations_dict(allocations, key_fetcher, resource_provider\u003dNone,"}],"source_content_type":"text/x-python","patch_set":27,"id":"3f4b6375_c397893a","line":156,"in_reply_to":"3f4b6375_c5655147","updated":"2017-10-30 15:35:29.000000000","message":"Hmmm.\n\nThat\u0027s not a use case I recall being discussed on the spec or the conversations surrounding it, nor is it supported in PUT (where if it were valid here it would also be valid there, since it is on _one_ consumer uuid).\n\nRecall that a single allocations dict (whether one or several resource classes) entirely replaces those allocations so for the case where we want to delete \"one single resource\" we just don\u0027t include it in the PUT or the POST.","commit_id":"8a9ed7cf03bb9acdb55398c6e67d2e274a8a8c1f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7af7cab790f706772a850d0068e8aef2649f88b4","unresolved":false,"context_lines":[{"line_number":415,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":416,"context_line":"    data \u003d util.extract_json(req.body, ALLOCATION_SET_MULTIPLE_SCHEMA)"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    # Create a sequence of allocation objects to used in an"},{"line_number":419,"context_line":"    # AllocationList.create_all() call, which will mean all the changes"},{"line_number":420,"context_line":"    # happen within a single transaction and with resource provider"},{"line_number":421,"context_line":"    # generations check all in one go."}],"source_content_type":"text/x-python","patch_set":27,"id":"3f4b6375_a820ec9c","line":418,"range":{"start_line":418,"start_character":46,"end_line":418,"end_character":53},"updated":"2017-10-30 14:59:28.000000000","message":"to be used","commit_id":"8a9ed7cf03bb9acdb55398c6e67d2e274a8a8c1f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a8e249406b2c02c3b5869831a355c1eec0b80392","unresolved":false,"context_lines":[{"line_number":415,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":416,"context_line":"    data \u003d util.extract_json(req.body, ALLOCATION_SET_MULTIPLE_SCHEMA)"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    # Create a sequence of allocation objects to used in an"},{"line_number":419,"context_line":"    # AllocationList.create_all() call, which will mean all the changes"},{"line_number":420,"context_line":"    # happen within a single transaction and with resource provider"},{"line_number":421,"context_line":"    # generations check all in one go."}],"source_content_type":"text/x-python","patch_set":27,"id":"3f4b6375_23a89d75","line":418,"range":{"start_line":418,"start_character":46,"end_line":418,"end_character":53},"in_reply_to":"3f4b6375_a820ec9c","updated":"2017-10-30 15:35:29.000000000","message":"✔","commit_id":"8a9ed7cf03bb9acdb55398c6e67d2e274a8a8c1f"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"8b14f0d23979ffeecf217c68a47da8c20c762f93","unresolved":false,"context_lines":[{"line_number":434,"context_line":"                                               project_id,"},{"line_number":435,"context_line":"                                               user_id)"},{"line_number":436,"context_line":"            allocation_objects.extend(new_allocations)"},{"line_number":437,"context_line":"        else:"},{"line_number":438,"context_line":"            # The allocations are empty, which means wipe them out."},{"line_number":439,"context_line":"            # Internal to the allocation object this is signalled by a"},{"line_number":440,"context_line":"            # used value of 0."},{"line_number":441,"context_line":"            allocations \u003d rp_obj.AllocationList.get_all_by_consumer_id("},{"line_number":442,"context_line":"                context, consumer_uuid)"},{"line_number":443,"context_line":"            for allocation in allocations:"}],"source_content_type":"text/x-python","patch_set":29,"id":"1f485f77_063253f2","line":440,"range":{"start_line":437,"start_character":0,"end_line":440,"end_character":30},"updated":"2017-11-13 03:15:57.000000000","message":"Let me quote from a python for-else usage document[1]; \u0027The else clause executes when the loop completes normally. This means that the loop did not encounter any break.\u0027 \nSo, the \u0027allocation.used\u003d0\u0027 happens all the time, which I believe is not what we intend to do.\n\n[1] http://book.pythontips.com/en/latest/for_-_else.html\n\n\nIt is interesting that when \u0027allocations\u0027 are not empty, the wipeout doesn\u0027t happen even if \u0027allocation.used\u0027 is set to 0, and the test works correctly. This is just because an allocation with the same consumer_uuid is already in \u0027allocation_objects\u0027 list and \u0027_delete_allocations_for_consumer()\u0027[2] is before and out of \u0027if alloc.used \u003d\u003d 0:\u0027 clause[3] in the DB api. \n\n[2] https://github.com/openstack/nova/blob/master/nova/objects/resource_provider.py#L1787\n\n[3] \nhttps://github.com/openstack/nova/blob/master/nova/objects/resource_provider.py#L1809-L1812\n\n\nBut this is too tricky, which warrants a small fix, IMO.","commit_id":"ad840be8ba2006b094d2e3bca26bfa9fda14f938"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e612e3fbe881cc69e3801c3b7d93ce9615b10323","unresolved":false,"context_lines":[{"line_number":434,"context_line":"                                               project_id,"},{"line_number":435,"context_line":"                                               user_id)"},{"line_number":436,"context_line":"            allocation_objects.extend(new_allocations)"},{"line_number":437,"context_line":"        else:"},{"line_number":438,"context_line":"            # The allocations are empty, which means wipe them out."},{"line_number":439,"context_line":"            # Internal to the allocation object this is signalled by a"},{"line_number":440,"context_line":"            # used value of 0."},{"line_number":441,"context_line":"            allocations \u003d rp_obj.AllocationList.get_all_by_consumer_id("},{"line_number":442,"context_line":"                context, consumer_uuid)"},{"line_number":443,"context_line":"            for allocation in allocations:"}],"source_content_type":"text/x-python","patch_set":29,"id":"1f485f77_fbeef81f","line":440,"range":{"start_line":437,"start_character":0,"end_line":440,"end_character":30},"in_reply_to":"1f485f77_063253f2","updated":"2017-11-19 07:50:39.000000000","message":"good catch, thanks","commit_id":"ad840be8ba2006b094d2e3bca26bfa9fda14f938"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"de708461f844b71d894ecb4648ac182518784a81","unresolved":false,"context_lines":[{"line_number":451,"context_line":"    try:"},{"line_number":452,"context_line":"        allocations.create_all()"},{"line_number":453,"context_line":"        LOG.debug(\"Successfully wrote allocations %s\", allocations)"},{"line_number":454,"context_line":"    except exception.NotFound as exc:"},{"line_number":455,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":456,"context_line":"            _(\"Unable to allocate inventory %(error)s\") % {\u0027error\u0027: exc})"},{"line_number":457,"context_line":"    except exception.InvalidInventory as exc:"}],"source_content_type":"text/x-python","patch_set":30,"id":"ff82abbf_7683f857","line":454,"range":{"start_line":454,"start_character":11,"end_line":454,"end_character":29},"updated":"2017-11-20 06:54:28.000000000","message":"Just a question.\nIs the NotFound exception really occurred?\nIn what case?","commit_id":"81c0b5e7bfd3375deff0e6a642a769dfc58d0c3d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"60b91bd76f2653f2597e44dbdb928d56d36ad397","unresolved":false,"context_lines":[{"line_number":451,"context_line":"    try:"},{"line_number":452,"context_line":"        allocations.create_all()"},{"line_number":453,"context_line":"        LOG.debug(\"Successfully wrote allocations %s\", allocations)"},{"line_number":454,"context_line":"    except exception.NotFound as exc:"},{"line_number":455,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":456,"context_line":"            _(\"Unable to allocate inventory %(error)s\") % {\u0027error\u0027: exc})"},{"line_number":457,"context_line":"    except exception.InvalidInventory as exc:"}],"source_content_type":"text/x-python","patch_set":30,"id":"ff82abbf_96679c26","line":454,"range":{"start_line":454,"start_character":11,"end_line":454,"end_character":29},"in_reply_to":"ff82abbf_7683f857","updated":"2017-11-20 07:36:21.000000000","message":"If a resource class in any of the allocations does not exist a ResourceClassNotFound can be raised. I believe the more generic/super exception was used here in the original _set_allocations to also deal with a case where the resource provider may have gone away, but the code has since been refactored out from under that. However, using the super class keeps some flexibility.","commit_id":"81c0b5e7bfd3375deff0e6a642a769dfc58d0c3d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"81c4a596c43edba126d998d9bf4dd52ba7a0e22d","unresolved":false,"context_lines":[{"line_number":330,"context_line":"    return allocations"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"def _set_allocations(req, schema):"},{"line_number":334,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":335,"context_line":"    consumer_uuid \u003d util.wsgi_path_item(req.environ, \u0027consumer_uuid\u0027)"},{"line_number":336,"context_line":"    data \u003d util.extract_json(req.body, schema)"}],"source_content_type":"text/x-python","patch_set":34,"id":"ff82abbf_6938529f","line":333,"range":{"start_line":333,"start_character":4,"end_line":333,"end_character":20},"updated":"2017-11-27 17:11:06.000000000","message":"To avoid confusion, do we perhaps want to rename this to _set_allocations_for_consumer ?","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3647d9362b76feeca9a748a572b7a9c44d56ead6","unresolved":false,"context_lines":[{"line_number":330,"context_line":"    return allocations"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"def _set_allocations(req, schema):"},{"line_number":334,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":335,"context_line":"    consumer_uuid \u003d util.wsgi_path_item(req.environ, \u0027consumer_uuid\u0027)"},{"line_number":336,"context_line":"    data \u003d util.extract_json(req.body, schema)"}],"source_content_type":"text/x-python","patch_set":34,"id":"ff82abbf_7eb9d112","line":333,"range":{"start_line":333,"start_character":4,"end_line":333,"end_character":20},"in_reply_to":"ff82abbf_6938529f","updated":"2017-11-28 12:15:29.000000000","message":"Done","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"81c4a596c43edba126d998d9bf4dd52ba7a0e22d","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        LOG.debug(\"Successfully wrote allocations %s\", allocations)"},{"line_number":454,"context_line":"    except exception.NotFound as exc:"},{"line_number":455,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":456,"context_line":"            _(\"Unable to allocate inventory %(error)s\") % {\u0027error\u0027: exc})"},{"line_number":457,"context_line":"    except exception.InvalidInventory as exc:"},{"line_number":458,"context_line":"        # InvalidInventory is a parent for several exceptions that"},{"line_number":459,"context_line":"        # indicate either that Inventory is not present, or that"}],"source_content_type":"text/x-python","patch_set":34,"id":"ff82abbf_a9d73aee","line":456,"range":{"start_line":456,"start_character":14,"end_line":456,"end_character":54},"updated":"2017-11-27 17:11:06.000000000","message":"This message should be different, or we can fold this except clause into the following one.","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1681354add910afb38ba85cc4dac5ffbbeb826c8","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        LOG.debug(\"Successfully wrote allocations %s\", allocations)"},{"line_number":454,"context_line":"    except exception.NotFound as exc:"},{"line_number":455,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":456,"context_line":"            _(\"Unable to allocate inventory %(error)s\") % {\u0027error\u0027: exc})"},{"line_number":457,"context_line":"    except exception.InvalidInventory as exc:"},{"line_number":458,"context_line":"        # InvalidInventory is a parent for several exceptions that"},{"line_number":459,"context_line":"        # indicate either that Inventory is not present, or that"}],"source_content_type":"text/x-python","patch_set":34,"id":"ff82abbf_beaf5928","line":456,"range":{"start_line":456,"start_character":14,"end_line":456,"end_character":54},"in_reply_to":"ff82abbf_9e4db53f","updated":"2017-11-28 12:48:16.000000000","message":"Duh, sorry.","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3647d9362b76feeca9a748a572b7a9c44d56ead6","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        LOG.debug(\"Successfully wrote allocations %s\", allocations)"},{"line_number":454,"context_line":"    except exception.NotFound as exc:"},{"line_number":455,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":456,"context_line":"            _(\"Unable to allocate inventory %(error)s\") % {\u0027error\u0027: exc})"},{"line_number":457,"context_line":"    except exception.InvalidInventory as exc:"},{"line_number":458,"context_line":"        # InvalidInventory is a parent for several exceptions that"},{"line_number":459,"context_line":"        # indicate either that Inventory is not present, or that"}],"source_content_type":"text/x-python","patch_set":34,"id":"ff82abbf_9e4db53f","line":456,"range":{"start_line":456,"start_character":14,"end_line":456,"end_character":54},"in_reply_to":"ff82abbf_a9d73aee","updated":"2017-11-28 12:15:29.000000000","message":"they are different response codes","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"}],"nova/tests/functional/api/openstack/placement/gabbits/allocations-post.yaml":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d9c719c049a1c2329c1dfd7611a0bca7d32dd70b","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"# TODO(cdent):"},{"line_number":119,"context_line":"# differing project/user info"},{"line_number":120,"context_line":"# empty allocations dict"},{"line_number":121,"context_line":"# the other (more listy) format"},{"line_number":122,"context_line":"# json schema violations"},{"line_number":123,"context_line":"# allocation violations of inventory constraints"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7f287b81_1402350a","line":120,"updated":"2017-09-06 00:59:58.000000000","message":"this is going to require yet more changes to _set_allocations in nova.objects.resource_provider. I\u0027ll hork that in before this one.","commit_id":"644b1dd0cf8a344864b3854d3b904ac193ed68ca"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"306808abed15673435f901355dab244c53515a97","unresolved":false,"context_lines":[{"line_number":10,"context_line":"        x-auth-token: admin"},{"line_number":11,"context_line":"        accept: application/json"},{"line_number":12,"context_line":"        content-type: application/json"},{"line_number":13,"context_line":"        openstack-api-version: placement 1.11"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"tests:"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":20,"id":"5f4e5783_df75309a","line":13,"range":{"start_line":13,"start_character":41,"end_line":13,"end_character":45},"updated":"2017-10-10 15:56:02.000000000","message":"Again, should be 1.12","commit_id":"609ad379af66087ccc732578f8dc7de6d1864ffd"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9bf6822bbea1431c61533d40a0549faf635a2dc5","unresolved":false,"context_lines":[{"line_number":10,"context_line":"        x-auth-token: admin"},{"line_number":11,"context_line":"        accept: application/json"},{"line_number":12,"context_line":"        content-type: application/json"},{"line_number":13,"context_line":"        openstack-api-version: placement 1.11"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"tests:"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":20,"id":"5f4e5783_3238fbd1","line":13,"range":{"start_line":13,"start_character":41,"end_line":13,"end_character":45},"in_reply_to":"5f4e5783_df75309a","updated":"2017-10-10 16:22:00.000000000","message":"yup, problem caused by when I integrated to two separate /allocations related stacks, thanks","commit_id":"609ad379af66087ccc732578f8dc7de6d1864ffd"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"306808abed15673435f901355dab244c53515a97","unresolved":false,"context_lines":[{"line_number":81,"context_line":"- name: 404 on older microversion post"},{"line_number":82,"context_line":"  POST: /allocations"},{"line_number":83,"context_line":"  request_headers:"},{"line_number":84,"context_line":"      openstack-api-version: placement 1.10"},{"line_number":85,"context_line":"  status: 404"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"- name: post allocations two consumers"}],"source_content_type":"text/x-yaml","patch_set":20,"id":"5f4e5783_bf515411","line":84,"range":{"start_line":84,"start_character":39,"end_line":84,"end_character":43},"updated":"2017-10-10 15:56:02.000000000","message":"This will work, but it should really be 1.11, as that\u0027s the latest version that doesn\u0027t support POST /allocations.","commit_id":"609ad379af66087ccc732578f8dc7de6d1864ffd"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9bf6822bbea1431c61533d40a0549faf635a2dc5","unresolved":false,"context_lines":[{"line_number":81,"context_line":"- name: 404 on older microversion post"},{"line_number":82,"context_line":"  POST: /allocations"},{"line_number":83,"context_line":"  request_headers:"},{"line_number":84,"context_line":"      openstack-api-version: placement 1.10"},{"line_number":85,"context_line":"  status: 404"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"- name: post allocations two consumers"}],"source_content_type":"text/x-yaml","patch_set":20,"id":"5f4e5783_1235ffda","line":84,"range":{"start_line":84,"start_character":39,"end_line":84,"end_character":43},"in_reply_to":"5f4e5783_bf515411","updated":"2017-10-10 16:22:00.000000000","message":"yup","commit_id":"609ad379af66087ccc732578f8dc7de6d1864ffd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7af7cab790f706772a850d0068e8aef2649f88b4","unresolved":false,"context_lines":[{"line_number":130,"context_line":"          project_id: $ENVIRON[\u0027PROJECT_ID\u0027]"},{"line_number":131,"context_line":"          user_id: $ENVIRON[\u0027USER_ID\u0027]"},{"line_number":132,"context_line":"      $ENVIRON[\u0027MIGRATION_UUID\u0027]:"},{"line_number":133,"context_line":"          allocations: {}"},{"line_number":134,"context_line":"          project_id: $ENVIRON[\u0027PROJECT_ID\u0027]"},{"line_number":135,"context_line":"          user_id: $ENVIRON[\u0027USER_ID\u0027]"},{"line_number":136,"context_line":"  status: 204"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3f4b6375_a83fcc85","line":133,"updated":"2017-10-30 14:59:28.000000000","message":"In addition to removing all allocations for a consumer, I think we want a test for removing a single allocation from a consumer by supplying an amount of 0 for an existing resource class.\n\nThis is the \"allocations for a migration involve a shared resource provider\" use case.","commit_id":"8a9ed7cf03bb9acdb55398c6e67d2e274a8a8c1f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a8e249406b2c02c3b5869831a355c1eec0b80392","unresolved":false,"context_lines":[{"line_number":130,"context_line":"          project_id: $ENVIRON[\u0027PROJECT_ID\u0027]"},{"line_number":131,"context_line":"          user_id: $ENVIRON[\u0027USER_ID\u0027]"},{"line_number":132,"context_line":"      $ENVIRON[\u0027MIGRATION_UUID\u0027]:"},{"line_number":133,"context_line":"          allocations: {}"},{"line_number":134,"context_line":"          project_id: $ENVIRON[\u0027PROJECT_ID\u0027]"},{"line_number":135,"context_line":"          user_id: $ENVIRON[\u0027USER_ID\u0027]"},{"line_number":136,"context_line":"  status: 204"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3f4b6375_63cc5561","line":133,"in_reply_to":"3f4b6375_a83fcc85","updated":"2017-10-30 15:35:29.000000000","message":"I think this is already covered, see my comment elsewhere.\n\nSetting to zero is not something we really do is it? Rather we don\u0027t set it.","commit_id":"8a9ed7cf03bb9acdb55398c6e67d2e274a8a8c1f"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"de708461f844b71d894ecb4648ac182518784a81","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"ff82abbf_16662cef","line":234,"updated":"2017-11-20 06:54:28.000000000","message":"The following 2 cases are missing.\n\nNotFound(rp_obj.ResourceProvider.get_by_uuid):\n  https://review.openstack.org/#/c/500073/30/nova/api/openstack/placement/handlers/allocation.py@316\n\nNotFound(allocations.create_all()):\n  https://review.openstack.org/#/c/500073/30/nova/api/openstack/placement/handlers/allocation.py@454","commit_id":"81c0b5e7bfd3375deff0e6a642a769dfc58d0c3d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"60b91bd76f2653f2597e44dbdb928d56d36ad397","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"ff82abbf_d603e40e","line":234,"in_reply_to":"ff82abbf_16662cef","updated":"2017-11-20 07:36:21.000000000","message":"Thanks, will make some adjustments.","commit_id":"81c0b5e7bfd3375deff0e6a642a769dfc58d0c3d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bbf5db20b6ddfcf039775305c3944f5f878f7045","unresolved":false,"context_lines":[{"line_number":212,"context_line":""},{"line_number":213,"context_line":"- name: fail allocations deep schema violate"},{"line_number":214,"context_line":"  desc: no schema yet"},{"line_number":215,"context_line":"  xfail: true"},{"line_number":216,"context_line":"  POST: /allocations"},{"line_number":217,"context_line":"  data:"},{"line_number":218,"context_line":"      $ENVIRON[\u0027INSTANCE_UUID\u0027]:"}],"source_content_type":"text/x-yaml","patch_set":33,"id":"ff82abbf_8ad98484","line":215,"range":{"start_line":215,"start_character":2,"end_line":215,"end_character":13},"updated":"2017-11-21 14:50:42.000000000","message":"hmm, this is new to me. Looking up in Gabbi, it seems to be in Gabbi for 3+ years, though so clearly not new to Gabbi :)","commit_id":"f9691608b25b69789ae8ef285b227f7670671b49"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"ae5069c00c391743ed66693a363925715f817c52","unresolved":false,"context_lines":[{"line_number":212,"context_line":""},{"line_number":213,"context_line":"- name: fail allocations deep schema violate"},{"line_number":214,"context_line":"  desc: no schema yet"},{"line_number":215,"context_line":"  xfail: true"},{"line_number":216,"context_line":"  POST: /allocations"},{"line_number":217,"context_line":"  data:"},{"line_number":218,"context_line":"      $ENVIRON[\u0027INSTANCE_UUID\u0027]:"}],"source_content_type":"text/x-yaml","patch_set":33,"id":"ff82abbf_21617637","line":215,"range":{"start_line":215,"start_character":2,"end_line":215,"end_character":13},"in_reply_to":"ff82abbf_8ad98484","updated":"2017-11-21 19:15:51.000000000","message":"it\u0027s good you noticed this because they\u0027re not supposed to be there anymore. They should be registering as an unexpected success but there\u0027s a long standing bug somewhere in the testr/testtools stack: https://bugs.launchpad.net/testrepository/+bug/1429196\n\nI\u0027ll clean them out when I fix the problems in the parent.","commit_id":"f9691608b25b69789ae8ef285b227f7670671b49"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"81c4a596c43edba126d998d9bf4dd52ba7a0e22d","unresolved":false,"context_lines":[{"line_number":45,"context_line":"  GET: $LOCATION"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"- name: inventory compute01"},{"line_number":48,"context_line":"  PUT: $HISTORY[\u0027rp compute01\u0027].$RESPONSE[\u0027links[?rel \u003d \"inventories\"].href\u0027]"},{"line_number":49,"context_line":"  data:"},{"line_number":50,"context_line":"      resource_provider_generation: 0"},{"line_number":51,"context_line":"      inventories:"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"ff82abbf_69c85221","line":48,"range":{"start_line":48,"start_character":43,"end_line":48,"end_character":75},"updated":"2017-11-27 17:11:06.000000000","message":"I guess the fixture is set up in such a way that the leading \"/placement\" in these hrefs doesn\u0027t confuse it?  Or does the response somehow come back with these links \"correct\" in this setup?","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1b5e2401d33f014adc3c1e58ba39a24ecaee6b65","unresolved":false,"context_lines":[{"line_number":45,"context_line":"  GET: $LOCATION"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"- name: inventory compute01"},{"line_number":48,"context_line":"  PUT: $HISTORY[\u0027rp compute01\u0027].$RESPONSE[\u0027links[?rel \u003d \"inventories\"].href\u0027]"},{"line_number":49,"context_line":"  data:"},{"line_number":50,"context_line":"      resource_provider_generation: 0"},{"line_number":51,"context_line":"      inventories:"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"ff82abbf_04264b16","line":48,"range":{"start_line":48,"start_character":43,"end_line":48,"end_character":75},"in_reply_to":"ff82abbf_69c85221","updated":"2017-11-27 17:33:53.000000000","message":"In this context there is no /placement prefix: https://github.com/openstack/nova/blob/efce0ea78e050c3238340c9ea1fce68d651f0dd9/nova/tests/functional/api/openstack/placement/test_placement_api.py#L37\n\nThe prefix is added by the wsgi server, and becomes SERVER_NAME in the WSGI environ and is used in the utility methods that created links: https://github.com/openstack/nova/blob/efce0ea78e050c3238340c9ea1fce68d651f0dd9/nova/api/openstack/placement/util.py#L152","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"81c4a596c43edba126d998d9bf4dd52ba7a0e22d","unresolved":false,"context_lines":[{"line_number":169,"context_line":"          user_id: $ENVIRON[\u0027USER_ID_ALT\u0027]"},{"line_number":170,"context_line":"  status: 204"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"- name: confirm usages user a"},{"line_number":173,"context_line":"  GET: /usages?project_id\u003d$ENVIRON[\u0027PROJECT_ID\u0027]"},{"line_number":174,"context_line":"  response_json_paths:"},{"line_number":175,"context_line":"      $.usages.`len`: 3"},{"line_number":176,"context_line":"      $.usages.DISK_GB: 5"},{"line_number":177,"context_line":"      $.usages.VCPU: 2"},{"line_number":178,"context_line":"      $.usages.MEMORY_MB: 1024"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"- name: confirm usages user b"},{"line_number":181,"context_line":"  GET: /usages?project_id\u003d$ENVIRON[\u0027PROJECT_ID_ALT\u0027]"},{"line_number":182,"context_line":"  response_json_paths:"},{"line_number":183,"context_line":"      $.usages.`len`: 2"},{"line_number":184,"context_line":"      $.usages.VCPU: 2"},{"line_number":185,"context_line":"      $.usages.MEMORY_MB: 1024"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"- name: fail allocations over capacity"},{"line_number":188,"context_line":"  POST: /allocations"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"ff82abbf_29b56a7e","line":185,"range":{"start_line":172,"start_character":0,"end_line":185,"end_character":30},"updated":"2017-11-27 17:11:06.000000000","message":"Respect that we\u0027re confirming usages; but shouldn\u0027t we also confirm GET /allocations/{consumer_uuid} to make sure the allocations are associated with the right consumers?","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1b5e2401d33f014adc3c1e58ba39a24ecaee6b65","unresolved":false,"context_lines":[{"line_number":169,"context_line":"          user_id: $ENVIRON[\u0027USER_ID_ALT\u0027]"},{"line_number":170,"context_line":"  status: 204"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"- name: confirm usages user a"},{"line_number":173,"context_line":"  GET: /usages?project_id\u003d$ENVIRON[\u0027PROJECT_ID\u0027]"},{"line_number":174,"context_line":"  response_json_paths:"},{"line_number":175,"context_line":"      $.usages.`len`: 3"},{"line_number":176,"context_line":"      $.usages.DISK_GB: 5"},{"line_number":177,"context_line":"      $.usages.VCPU: 2"},{"line_number":178,"context_line":"      $.usages.MEMORY_MB: 1024"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"- name: confirm usages user b"},{"line_number":181,"context_line":"  GET: /usages?project_id\u003d$ENVIRON[\u0027PROJECT_ID_ALT\u0027]"},{"line_number":182,"context_line":"  response_json_paths:"},{"line_number":183,"context_line":"      $.usages.`len`: 2"},{"line_number":184,"context_line":"      $.usages.VCPU: 2"},{"line_number":185,"context_line":"      $.usages.MEMORY_MB: 1024"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"- name: fail allocations over capacity"},{"line_number":188,"context_line":"  POST: /allocations"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"ff82abbf_c470630b","line":185,"range":{"start_line":172,"start_character":0,"end_line":185,"end_character":30},"in_reply_to":"ff82abbf_29b56a7e","updated":"2017-11-27 17:33:53.000000000","message":"isnt\u0027 that what querying by PROJECT_ID is halfway doing?\n\nWe don\u0027t want to duplicate the verification of the entire allocation creation process through do we?","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"bd953b95bcf17bf9a088c3f060d25a87d5fc05ba","unresolved":false,"context_lines":[{"line_number":169,"context_line":"          user_id: $ENVIRON[\u0027USER_ID_ALT\u0027]"},{"line_number":170,"context_line":"  status: 204"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"- name: confirm usages user a"},{"line_number":173,"context_line":"  GET: /usages?project_id\u003d$ENVIRON[\u0027PROJECT_ID\u0027]"},{"line_number":174,"context_line":"  response_json_paths:"},{"line_number":175,"context_line":"      $.usages.`len`: 3"},{"line_number":176,"context_line":"      $.usages.DISK_GB: 5"},{"line_number":177,"context_line":"      $.usages.VCPU: 2"},{"line_number":178,"context_line":"      $.usages.MEMORY_MB: 1024"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"- name: confirm usages user b"},{"line_number":181,"context_line":"  GET: /usages?project_id\u003d$ENVIRON[\u0027PROJECT_ID_ALT\u0027]"},{"line_number":182,"context_line":"  response_json_paths:"},{"line_number":183,"context_line":"      $.usages.`len`: 2"},{"line_number":184,"context_line":"      $.usages.VCPU: 2"},{"line_number":185,"context_line":"      $.usages.MEMORY_MB: 1024"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"- name: fail allocations over capacity"},{"line_number":188,"context_line":"  POST: /allocations"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"ff82abbf_1950df0a","line":185,"range":{"start_line":172,"start_character":0,"end_line":185,"end_character":30},"in_reply_to":"ff82abbf_c470630b","updated":"2017-11-28 12:59:02.000000000","message":"Considering what we\u0027re doing is creating allocations, verifying the allocation creation process seems not wrong.  I\u0027m convinced the code is doing what it ought... but only because I looked at the code.  Just looking at this test, I can imagine horrible and incorrect ways the code could be written where this would still pass.\n\nAgain not insisting on a change; just being heard.","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"}],"nova/tests/functional/api/openstack/placement/gabbits/allocations.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"81c4a596c43edba126d998d9bf4dd52ba7a0e22d","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"tests:"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"- name: get allocations no consumer is 405"},{"line_number":18,"context_line":"  GET: /allocations"},{"line_number":19,"context_line":"  status: 405"},{"line_number":20,"context_line":"  response_json_paths:"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"ff82abbf_896916fa","line":17,"updated":"2017-11-27 17:11:06.000000000","message":"This test could be deleted at this point - covered by https://review.openstack.org/#/c/500073/34/nova/tests/functional/api/openstack/placement/gabbits/allocations-post.yaml@75","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"bd953b95bcf17bf9a088c3f060d25a87d5fc05ba","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"tests:"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"- name: get allocations no consumer is 405"},{"line_number":18,"context_line":"  GET: /allocations"},{"line_number":19,"context_line":"  status: 405"},{"line_number":20,"context_line":"  response_json_paths:"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"ff82abbf_3905a311","line":17,"in_reply_to":"ff82abbf_44d3f3d5","updated":"2017-11-28 12:59:02.000000000","message":"I can understand why you would have a bit of an ook removing a gabbi test, because they\u0027re cumulative, but there\u0027s no problem as long as it doesn\u0027t a) change the database, or b) provide vars for subsequent tests.\n\nI don\u0027t have a serious problem with duplicated test code, especially if it reads well in context.  Although in this case that would prompt me to suggest we add another one for the 404 case.\n\nI\u0027m not insisting on a change here; but opinions have been expressed.","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1b5e2401d33f014adc3c1e58ba39a24ecaee6b65","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"tests:"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"- name: get allocations no consumer is 405"},{"line_number":18,"context_line":"  GET: /allocations"},{"line_number":19,"context_line":"  status: 405"},{"line_number":20,"context_line":"  response_json_paths:"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"ff82abbf_44d3f3d5","line":17,"in_reply_to":"ff82abbf_896916fa","updated":"2017-11-27 17:33:53.000000000","message":"I figured it was better/easier to just leave it in its corrected form. It existing helps explains what\u0027s going on here. Also seems weird to remove a gabbi test. Not sure why.\n\nHappy to be influenced.","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"}],"placement-api-ref/source/allocations.inc":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"de708461f844b71d894ecb4648ac182518784a81","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"No body content is returned on a successful DELETE."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Manage allocations"},{"line_number":129,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"Create, update or delete allocations for multiple consumers in a single"}],"source_content_type":"text/x-c++src","patch_set":30,"id":"ff82abbf_96ed5c27","line":128,"range":{"start_line":128,"start_character":0,"end_line":128,"end_character":18},"updated":"2017-11-20 06:54:28.000000000","message":"This section should be in the top.\nSee \"Reordering Methods\" in https://wiki.openstack.org/wiki/NovaAPIRef .","commit_id":"81c0b5e7bfd3375deff0e6a642a769dfc58d0c3d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"60b91bd76f2653f2597e44dbdb928d56d36ad397","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"No body content is returned on a successful DELETE."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Manage allocations"},{"line_number":129,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"Create, update or delete allocations for multiple consumers in a single"}],"source_content_type":"text/x-c++src","patch_set":30,"id":"ff82abbf_961ebc6e","line":128,"range":{"start_line":128,"start_character":0,"end_line":128,"end_character":18},"in_reply_to":"ff82abbf_96ed5c27","updated":"2017-11-20 07:36:21.000000000","message":"I don\u0027t really agree with that advice, but am happy to follow it since that\u0027s the agreed form.\n\nAlso note that the placement-api-ref is not the nova-api-ref and while it is probably a good idea for it to follow those standards,  no explicit commitment has been made to do so.","commit_id":"81c0b5e7bfd3375deff0e6a642a769dfc58d0c3d"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"de708461f844b71d894ecb4648ac182518784a81","unresolved":false,"context_lines":[{"line_number":157,"context_line":"  - consumer_uuid: consumer_uuid_body"},{"line_number":158,"context_line":"  - project_id: project_id_body"},{"line_number":159,"context_line":"  - user_id: user_id_body"},{"line_number":160,"context_line":"  - allocations: allocations_dict_empty"},{"line_number":161,"context_line":"  - resources: resources"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Request Example"}],"source_content_type":"text/x-c++src","patch_set":30,"id":"ff82abbf_565ef4e6","line":160,"range":{"start_line":160,"start_character":17,"end_line":160,"end_character":39},"updated":"2017-11-20 06:54:28.000000000","message":"\"New in version 1.12\" is not necessary. Remove it.\nSee the following.\n\nhttp://logs.openstack.org/73/500073/30/check/build-placement-api-ref/04546e1/html/#manage-allocations","commit_id":"81c0b5e7bfd3375deff0e6a642a769dfc58d0c3d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"ae5069c00c391743ed66693a363925715f817c52","unresolved":false,"context_lines":[{"line_number":157,"context_line":"  - consumer_uuid: consumer_uuid_body"},{"line_number":158,"context_line":"  - project_id: project_id_body"},{"line_number":159,"context_line":"  - user_id: user_id_body"},{"line_number":160,"context_line":"  - allocations: allocations_dict_empty"},{"line_number":161,"context_line":"  - resources: resources"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Request Example"}],"source_content_type":"text/x-c++src","patch_set":30,"id":"ff82abbf_7c4c3976","line":160,"range":{"start_line":160,"start_character":17,"end_line":160,"end_character":39},"in_reply_to":"ff82abbf_565ef4e6","updated":"2017-11-21 19:15:51.000000000","message":"Actually turns out this is happening because of yaml inheritance.","commit_id":"81c0b5e7bfd3375deff0e6a642a769dfc58d0c3d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"60b91bd76f2653f2597e44dbdb928d56d36ad397","unresolved":false,"context_lines":[{"line_number":157,"context_line":"  - consumer_uuid: consumer_uuid_body"},{"line_number":158,"context_line":"  - project_id: project_id_body"},{"line_number":159,"context_line":"  - user_id: user_id_body"},{"line_number":160,"context_line":"  - allocations: allocations_dict_empty"},{"line_number":161,"context_line":"  - resources: resources"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Request Example"}],"source_content_type":"text/x-c++src","patch_set":30,"id":"ff82abbf_160aac25","line":160,"range":{"start_line":160,"start_character":17,"end_line":160,"end_character":39},"in_reply_to":"ff82abbf_565ef4e6","updated":"2017-11-20 07:36:21.000000000","message":"If present it needs to be new in version 1.13, not 1.12\n\nI\u0027ve had conflicting advice on this kind of change. Some people have advised to be as verbose as possible when indicating details of microversions in representations.\n\nI\u0027ll remove it in this case.","commit_id":"81c0b5e7bfd3375deff0e6a642a769dfc58d0c3d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"81c4a596c43edba126d998d9bf4dd52ba7a0e22d","unresolved":false,"context_lines":[{"line_number":7,"context_line":"of a particular resource that has been allocated to a given consumer"},{"line_number":8,"context_line":"of that resource from a particular resource provider."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"Manage allocations"},{"line_number":11,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Create, update or delete allocations for multiple consumers in a single"}],"source_content_type":"text/x-c++src","patch_set":34,"id":"ff82abbf_897cb683","line":10,"updated":"2017-11-27 17:11:06.000000000","message":"In terms of logical reading order, I feel like this section should come last.  Did you put it up front because its URI is shorter?","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1b5e2401d33f014adc3c1e58ba39a24ecaee6b65","unresolved":false,"context_lines":[{"line_number":7,"context_line":"of a particular resource that has been allocated to a given consumer"},{"line_number":8,"context_line":"of that resource from a particular resource provider."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"Manage allocations"},{"line_number":11,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Create, update or delete allocations for multiple consumers in a single"}],"source_content_type":"text/x-c++src","patch_set":34,"id":"ff82abbf_e4d1e7fc","line":10,"in_reply_to":"ff82abbf_897cb683","updated":"2017-11-27 17:33:53.000000000","message":"See Takashi\u0027s comments on an earlier patchset, he wanted this order as it is more aligned with the TheRules™","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"bd953b95bcf17bf9a088c3f060d25a87d5fc05ba","unresolved":false,"context_lines":[{"line_number":7,"context_line":"of a particular resource that has been allocated to a given consumer"},{"line_number":8,"context_line":"of that resource from a particular resource provider."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"Manage allocations"},{"line_number":11,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Create, update or delete allocations for multiple consumers in a single"}],"source_content_type":"text/x-c++src","patch_set":34,"id":"ff82abbf_b93e93b5","line":10,"in_reply_to":"ff82abbf_e4d1e7fc","updated":"2017-11-28 12:59:02.000000000","message":"Yeah, I figured it had been something like that, but didn\u0027t look through the comment history.","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"}],"releasenotes/notes/post-allocations-427581fa41671820.yaml":[{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"2cbaa316fc687433d0a7c2b2ff7343be624f5e2c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Micoversion 1.13 of the Placement API gives the ability to set or clear"},{"line_number":5,"context_line":"    allocations for more than one consumer uuid with a request to"},{"line_number":6,"context_line":"    ``POST /allocations``."}],"source_content_type":"text/x-yaml","patch_set":34,"id":"ff82abbf_dd44c349","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":15},"updated":"2017-11-27 11:57:06.000000000","message":"Microversion","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3647d9362b76feeca9a748a572b7a9c44d56ead6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Micoversion 1.13 of the Placement API gives the ability to set or clear"},{"line_number":5,"context_line":"    allocations for more than one consumer uuid with a request to"},{"line_number":6,"context_line":"    ``POST /allocations``."}],"source_content_type":"text/x-yaml","patch_set":34,"id":"ff82abbf_de581dfb","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":15},"in_reply_to":"ff82abbf_dd44c349","updated":"2017-11-28 12:15:29.000000000","message":"Done","commit_id":"2e6bf7ff44224092f1a899ce0a2f38cccca2cc6d"}]}
