)]}'
{"nova/api/openstack/placement/errors.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a5c8423d33d410eae8187eaaa0774c78d8aaa536","unresolved":false,"context_lines":[{"line_number":40,"context_line":"# value."},{"line_number":41,"context_line":"DEFAULT \u003d \u0027placement.undefined_code\u0027"},{"line_number":42,"context_line":"INVENTORY_INUSE \u003d \u0027placement.inventory.inuse\u0027"},{"line_number":43,"context_line":"CONCURRENT_UPDATE \u003d \u0027placement.concurrent_update\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_64d2cf02","line":43,"updated":"2018-05-10 14:30:53.000000000","message":"do we care about which concurrent update it is? I go back and forth on this question of how much detail the code should provide.\n\nIs a consumer generation conflict something that should be differently coded from a rp generation conflict?","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f3486550f5c728803e68d1be2f67a42fba84b12d","unresolved":false,"context_lines":[{"line_number":40,"context_line":"# value."},{"line_number":41,"context_line":"DEFAULT \u003d \u0027placement.undefined_code\u0027"},{"line_number":42,"context_line":"INVENTORY_INUSE \u003d \u0027placement.inventory.inuse\u0027"},{"line_number":43,"context_line":"CONCURRENT_UPDATE \u003d \u0027placement.concurrent_update\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_fe7731d3","line":43,"in_reply_to":"5f7c97a3_64d2cf02","updated":"2018-05-11 19:07:09.000000000","message":"I didn\u0027t think it was worth having more granular error codes since the action the client needs to take is the same -- re-read the state and try again (if conditions still are good for the update)","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bd4e3925be5f7a9086774677929c81523e5e243b","unresolved":false,"context_lines":[{"line_number":40,"context_line":"# value."},{"line_number":41,"context_line":"DEFAULT \u003d \u0027placement.undefined_code\u0027"},{"line_number":42,"context_line":"INVENTORY_INUSE \u003d \u0027placement.inventory.inuse\u0027"},{"line_number":43,"context_line":"CONCURRENT_UPDATE \u003d \u0027placement.concurrent_update\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_97005a68","line":43,"updated":"2018-06-11 21:25:33.000000000","message":"Still vaguely thinking we might want to distinguish a resource provider generation collision from a consumer generation collision. More from a use by humans sense rather than in code (that is, use in speech or writing to communicate with another human).\n\nI\u0027m undecided, I\u0027m sure this is fine, but if anyone else has doubts, now is the time to speak out.","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":40,"context_line":"# value."},{"line_number":41,"context_line":"DEFAULT \u003d \u0027placement.undefined_code\u0027"},{"line_number":42,"context_line":"INVENTORY_INUSE \u003d \u0027placement.inventory.inuse\u0027"},{"line_number":43,"context_line":"CONCURRENT_UPDATE \u003d \u0027placement.concurrent_update\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_db4d7d72","line":43,"in_reply_to":"5f7c97a3_97005a68","updated":"2018-06-12 22:26:10.000000000","message":"I agree with this, though I think it\u0027s programmatically useful as well.  I think it would be useful to have:\n\n- placement.concurrent_update.generation.consumer\n- placement.concurrent_update.generation.provider\n- placement.concurrent_update.other\n\n(That last one is for e.g. DBDuplicateEntry.)\n\nThis way I can use prefixes if I only care that it was a concurrent update, only care if it was a generation conflict, or specifically care which generation conflict it was.  This might influence which bits of my payload I re-GET before retrying, which may allow me to code a performance benefit.","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1b6352547d3a109534311b452f78bead1ec3b776","unresolved":false,"context_lines":[{"line_number":40,"context_line":"# value."},{"line_number":41,"context_line":"DEFAULT \u003d \u0027placement.undefined_code\u0027"},{"line_number":42,"context_line":"INVENTORY_INUSE \u003d \u0027placement.inventory.inuse\u0027"},{"line_number":43,"context_line":"CONCURRENT_UPDATE \u003d \u0027placement.concurrent_update\u0027"}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_55026c74","line":43,"updated":"2018-06-14 21:47:07.000000000","message":"see continuation of PS24 discussion","commit_id":"449f5e8e574efd907f48ae6b4eb8554c727f8c11"}],"nova/api/openstack/placement/handlers/allocation.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a5c8423d33d410eae8187eaaa0774c78d8aaa536","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        if requires_consumer_generation:"},{"line_number":271,"context_line":"            if consumer_generation is not None:"},{"line_number":272,"context_line":"                raise webob.exc.HTTPConflict("},{"line_number":273,"context_line":"                    _(\u0027consumer generation conflict\u0027))"},{"line_number":274,"context_line":"        # No such consumer. This is common for new allocations. Create the"},{"line_number":275,"context_line":"        # consumer record"},{"line_number":276,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_c41083ab","line":273,"updated":"2018-05-10 14:30:53.000000000","message":"might make sense to distinguish this message from the one at 263, perhaps for the sake of client side logs (if they choose to log verbosely) and debugging.","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f3486550f5c728803e68d1be2f67a42fba84b12d","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        if requires_consumer_generation:"},{"line_number":271,"context_line":"            if consumer_generation is not None:"},{"line_number":272,"context_line":"                raise webob.exc.HTTPConflict("},{"line_number":273,"context_line":"                    _(\u0027consumer generation conflict\u0027))"},{"line_number":274,"context_line":"        # No such consumer. This is common for new allocations. Create the"},{"line_number":275,"context_line":"        # consumer record"},{"line_number":276,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_be7d39b3","line":273,"in_reply_to":"5f7c97a3_c41083ab","updated":"2018-05-11 19:07:09.000000000","message":"Done. I added an \"expected blah got blah\" to the messages.","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a5c8423d33d410eae8187eaaa0774c78d8aaa536","unresolved":false,"context_lines":[{"line_number":441,"context_line":""},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"@wsgi_wrapper.PlacementWsgify"},{"line_number":444,"context_line":"@microversion.version_handler(\u00271.13\u0027, \u00271.26\u0027)"},{"line_number":445,"context_line":"@util.require_content(\u0027application/json\u0027)"},{"line_number":446,"context_line":"def set_allocations(req):"},{"line_number":447,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_e4c81f23","line":444,"updated":"2018-05-10 14:30:53.000000000","message":"I\u0027d suggest not putting the 1.26 in here, otherwise as soon as 1.27 comes out and someone tries to use it, this method won\u0027t be available. You\u0027re creating a min/max window here.","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f3486550f5c728803e68d1be2f67a42fba84b12d","unresolved":false,"context_lines":[{"line_number":441,"context_line":""},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"@wsgi_wrapper.PlacementWsgify"},{"line_number":444,"context_line":"@microversion.version_handler(\u00271.13\u0027, \u00271.26\u0027)"},{"line_number":445,"context_line":"@util.require_content(\u0027application/json\u0027)"},{"line_number":446,"context_line":"def set_allocations(req):"},{"line_number":447,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_be569929","line":444,"in_reply_to":"5f7c97a3_e4c81f23","updated":"2018-05-11 19:07:09.000000000","message":"ah, gotcha. thanks. done.","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bd4e3925be5f7a9086774677929c81523e5e243b","unresolved":false,"context_lines":[{"line_number":234,"context_line":"    :param project_id: The project consuming the resources."},{"line_number":235,"context_line":"    :param user_id: The user consuming the resources."},{"line_number":236,"context_line":"    :param consumer_generation: The generation supplied by the user when"},{"line_number":237,"context_line":"                                PUT/POST/DELETE\u0027ing allocations. May be None if"},{"line_number":238,"context_line":"                                the microversion is \u003c1.28"},{"line_number":239,"context_line":"    :param want_version: The microversion object from the context."},{"line_number":240,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_f743ceae","line":237,"range":{"start_line":237,"start_character":41,"end_line":237,"end_character":47},"updated":"2018-06-11 21:25:33.000000000","message":"we can remove them in all three methods, but only PUT and POST use generation, yeah?","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":234,"context_line":"    :param project_id: The project consuming the resources."},{"line_number":235,"context_line":"    :param user_id: The user consuming the resources."},{"line_number":236,"context_line":"    :param consumer_generation: The generation supplied by the user when"},{"line_number":237,"context_line":"                                PUT/POST/DELETE\u0027ing allocations. May be None if"},{"line_number":238,"context_line":"                                the microversion is \u003c1.28"},{"line_number":239,"context_line":"    :param want_version: The microversion object from the context."},{"line_number":240,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_9b6ce5d0","line":237,"range":{"start_line":237,"start_character":41,"end_line":237,"end_character":47},"in_reply_to":"5f7c97a3_f743ceae","updated":"2018-06-12 22:26:10.000000000","message":"Agree.","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":234,"context_line":"    :param project_id: The project consuming the resources."},{"line_number":235,"context_line":"    :param user_id: The user consuming the resources."},{"line_number":236,"context_line":"    :param consumer_generation: The generation supplied by the user when"},{"line_number":237,"context_line":"                                PUT/POST/DELETE\u0027ing allocations. May be None if"},{"line_number":238,"context_line":"                                the microversion is \u003c1.28"},{"line_number":239,"context_line":"    :param want_version: The microversion object from the context."},{"line_number":240,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_7acd312e","line":237,"range":{"start_line":237,"start_character":41,"end_line":237,"end_character":47},"in_reply_to":"5f7c97a3_f743ceae","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bd4e3925be5f7a9086774677929c81523e5e243b","unresolved":false,"context_lines":[{"line_number":327,"context_line":"    except exception.InvalidInventory as exc:"},{"line_number":328,"context_line":"        raise webob.exc.HTTPConflict("},{"line_number":329,"context_line":"            _(\u0027Unable to allocate inventory: %(error)s\u0027) % {\u0027error\u0027: exc})"},{"line_number":330,"context_line":"    except exception.ConcurrentUpdateDetected as exc:"},{"line_number":331,"context_line":"        raise webob.exc.HTTPConflict("},{"line_number":332,"context_line":"            _(\u0027Inventory and/or allocations changed while attempting to \u0027"},{"line_number":333,"context_line":"              \u0027allocate: %(error)s\u0027) % {\u0027error\u0027: exc},"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_b71316b8","line":330,"updated":"2018-06-11 21:25:33.000000000","message":"Hmmm. Of course to get the granular error.code we would need to have exception subclasses. That may be taking it too far.","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1b6352547d3a109534311b452f78bead1ec3b776","unresolved":false,"context_lines":[{"line_number":327,"context_line":"    except exception.InvalidInventory as exc:"},{"line_number":328,"context_line":"        raise webob.exc.HTTPConflict("},{"line_number":329,"context_line":"            _(\u0027Unable to allocate inventory: %(error)s\u0027) % {\u0027error\u0027: exc})"},{"line_number":330,"context_line":"    except exception.ConcurrentUpdateDetected as exc:"},{"line_number":331,"context_line":"        raise webob.exc.HTTPConflict("},{"line_number":332,"context_line":"            _(\u0027Inventory and/or allocations changed while attempting to \u0027"},{"line_number":333,"context_line":"              \u0027allocate: %(error)s\u0027) % {\u0027error\u0027: exc},"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_95c1e432","line":330,"in_reply_to":"5f7c97a3_3ab25995","updated":"2018-06-14 21:47:07.000000000","message":"I pointed out [1] an example of where it might be useful; and the thing is, if there\u0027s *any* chance of that, we need to do it now, because we can\u0027t [2] change it later.  Callers who don\u0027t care about the distinction, but still care that it\u0027s concurrent update as opposed to some other conflict, can use .startswith (which they should probably do anyway, but this forces them to).\n\n[1] https://review.openstack.org/#/c/565604/24/nova/api/openstack/placement/errors.py@43\n[2] without uncomfortable contortions","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":327,"context_line":"    except exception.InvalidInventory as exc:"},{"line_number":328,"context_line":"        raise webob.exc.HTTPConflict("},{"line_number":329,"context_line":"            _(\u0027Unable to allocate inventory: %(error)s\u0027) % {\u0027error\u0027: exc})"},{"line_number":330,"context_line":"    except exception.ConcurrentUpdateDetected as exc:"},{"line_number":331,"context_line":"        raise webob.exc.HTTPConflict("},{"line_number":332,"context_line":"            _(\u0027Inventory and/or allocations changed while attempting to \u0027"},{"line_number":333,"context_line":"              \u0027allocate: %(error)s\u0027) % {\u0027error\u0027: exc},"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_3ab25995","line":330,"in_reply_to":"5f7c97a3_b71316b8","updated":"2018-06-13 15:02:25.000000000","message":"It\u0027s taking it too far IMHO (as I\u0027ve noted before). My reasoning is that the caller is making a call to POST/PUT /allocations (or PUT /resource_providers/{uuid}/inventories, etc). They already know what they are doing. They know that if they receive a placement.concurrent_update error code, they will need to re-read the state and retry the operation.\n\nThe error, again IMHO, is ConcurrentUpdateDetected. Whether the provider or the consumer\u0027s generation was concurrently modified is a detail that isn\u0027t particularly useful IMHO.","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":327,"context_line":"    except exception.InvalidInventory as exc:"},{"line_number":328,"context_line":"        raise webob.exc.HTTPConflict("},{"line_number":329,"context_line":"            _(\u0027Unable to allocate inventory: %(error)s\u0027) % {\u0027error\u0027: exc})"},{"line_number":330,"context_line":"    except exception.ConcurrentUpdateDetected as exc:"},{"line_number":331,"context_line":"        raise webob.exc.HTTPConflict("},{"line_number":332,"context_line":"            _(\u0027Inventory and/or allocations changed while attempting to \u0027"},{"line_number":333,"context_line":"              \u0027allocate: %(error)s\u0027) % {\u0027error\u0027: exc},"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_1b60d5ce","line":330,"in_reply_to":"5f7c97a3_b71316b8","updated":"2018-06-12 22:26:10.000000000","message":"Nope, I think that would be just dandy.","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        user_id \u003d consumer.user.external_id"},{"line_number":98,"context_line":"        result[\u0027project_id\u0027] \u003d project_id"},{"line_number":99,"context_line":"        result[\u0027user_id\u0027] \u003d user_id"},{"line_number":100,"context_line":"        show_consumer_gen \u003d want_version.matches((1, 27))"},{"line_number":101,"context_line":"        if show_consumer_gen:"},{"line_number":102,"context_line":"            result[\u0027consumer_generation\u0027] \u003d consumer.generation"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_fbd5d943","line":100,"range":{"start_line":100,"start_character":53,"end_line":100,"end_character":55},"updated":"2018-06-12 22:26:10.000000000","message":"28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        user_id \u003d consumer.user.external_id"},{"line_number":98,"context_line":"        result[\u0027project_id\u0027] \u003d project_id"},{"line_number":99,"context_line":"        result[\u0027user_id\u0027] \u003d user_id"},{"line_number":100,"context_line":"        show_consumer_gen \u003d want_version.matches((1, 27))"},{"line_number":101,"context_line":"        if show_consumer_gen:"},{"line_number":102,"context_line":"            result[\u0027consumer_generation\u0027] \u003d consumer.generation"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_da31e5a3","line":100,"range":{"start_line":100,"start_character":53,"end_line":100,"end_character":55},"in_reply_to":"5f7c97a3_fbd5d943","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":129,"context_line":"       }"},{"line_number":130,"context_line":"    }"},{"line_number":131,"context_line":"    \"\"\""},{"line_number":132,"context_line":"    show_consumer_gen \u003d want_version.matches((1, 27))"},{"line_number":133,"context_line":"    allocation_data \u003d collections.defaultdict(dict)"},{"line_number":134,"context_line":"    for allocation in allocations:"},{"line_number":135,"context_line":"        key \u003d allocation.consumer.uuid"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_bbcbe1a1","line":132,"range":{"start_line":132,"start_character":49,"end_line":132,"end_character":51},"updated":"2018-06-12 22:26:10.000000000","message":"28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":129,"context_line":"       }"},{"line_number":130,"context_line":"    }"},{"line_number":131,"context_line":"    \"\"\""},{"line_number":132,"context_line":"    show_consumer_gen \u003d want_version.matches((1, 27))"},{"line_number":133,"context_line":"    allocation_data \u003d collections.defaultdict(dict)"},{"line_number":134,"context_line":"    for allocation in allocations:"},{"line_number":135,"context_line":"        key \u003d allocation.consumer.uuid"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_fafe21ad","line":132,"range":{"start_line":132,"start_character":49,"end_line":132,"end_character":51},"in_reply_to":"5f7c97a3_bbcbe1a1","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":374,"context_line":"    context.can(policies.ALLOC_MANAGE)"},{"line_number":375,"context_line":"    want_version \u003d req.environ[microversion.MICROVERSION_ENVIRON]"},{"line_number":376,"context_line":"    want_schema \u003d schema.POST_ALLOCATIONS_V1_13"},{"line_number":377,"context_line":"    if want_version.matches((1, 27)):"},{"line_number":378,"context_line":"        want_schema \u003d schema.POST_ALLOCATIONS_V1_27"},{"line_number":379,"context_line":"    data \u003d util.extract_json(req.body, want_schema)"},{"line_number":380,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_7bc1c97f","line":377,"range":{"start_line":377,"start_character":32,"end_line":377,"end_character":34},"updated":"2018-06-12 22:26:10.000000000","message":"28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":374,"context_line":"    context.can(policies.ALLOC_MANAGE)"},{"line_number":375,"context_line":"    want_version \u003d req.environ[microversion.MICROVERSION_ENVIRON]"},{"line_number":376,"context_line":"    want_schema \u003d schema.POST_ALLOCATIONS_V1_13"},{"line_number":377,"context_line":"    if want_version.matches((1, 27)):"},{"line_number":378,"context_line":"        want_schema \u003d schema.POST_ALLOCATIONS_V1_27"},{"line_number":379,"context_line":"    data \u003d util.extract_json(req.body, want_schema)"},{"line_number":380,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_3af9f9c6","line":377,"range":{"start_line":377,"start_character":32,"end_line":377,"end_character":34},"in_reply_to":"5f7c97a3_7bc1c97f","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":375,"context_line":"    want_version \u003d req.environ[microversion.MICROVERSION_ENVIRON]"},{"line_number":376,"context_line":"    want_schema \u003d schema.POST_ALLOCATIONS_V1_13"},{"line_number":377,"context_line":"    if want_version.matches((1, 27)):"},{"line_number":378,"context_line":"        want_schema \u003d schema.POST_ALLOCATIONS_V1_27"},{"line_number":379,"context_line":"    data \u003d util.extract_json(req.body, want_schema)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    # Create a sequence of allocation objects to be used in an"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_5bc64d9c","line":378,"range":{"start_line":378,"start_character":49,"end_line":378,"end_character":51},"updated":"2018-06-12 22:26:10.000000000","message":"28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":375,"context_line":"    want_version \u003d req.environ[microversion.MICROVERSION_ENVIRON]"},{"line_number":376,"context_line":"    want_schema \u003d schema.POST_ALLOCATIONS_V1_13"},{"line_number":377,"context_line":"    if want_version.matches((1, 27)):"},{"line_number":378,"context_line":"        want_schema \u003d schema.POST_ALLOCATIONS_V1_27"},{"line_number":379,"context_line":"    data \u003d util.extract_json(req.body, want_schema)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    # Create a sequence of allocation objects to be used in an"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_5af4f5ce","line":378,"range":{"start_line":378,"start_character":49,"end_line":378,"end_character":51},"in_reply_to":"5f7c97a3_5bc64d9c","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1b6352547d3a109534311b452f78bead1ec3b776","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        if show_consumer_gen:"},{"line_number":144,"context_line":"            consumer_gen \u003d None"},{"line_number":145,"context_line":"            if allocation.consumer is not None:"},{"line_number":146,"context_line":"                consumer_gen \u003d allocation.consumer.generation"},{"line_number":147,"context_line":"            allocation_data[key][\u0027consumer_generation\u0027] \u003d consumer_gen"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_350fb089","line":145,"range":{"start_line":145,"start_character":12,"end_line":145,"end_character":47},"updated":"2018-06-14 21:47:07.000000000","message":"With the new migration thingy from [1], this can no longer be None, right?\n\n[1] https://review.openstack.org/#/c/565405/25","commit_id":"449f5e8e574efd907f48ae6b4eb8554c727f8c11"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1b6352547d3a109534311b452f78bead1ec3b776","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        # NOTE(jaypipes): This will only occur 1.28+. The JSONSchema will"},{"line_number":292,"context_line":"        # prevent an empty allocations object from being passed when there is"},{"line_number":293,"context_line":"        # no consumer generation, so this is safe to do."},{"line_number":294,"context_line":"        util.ensure_consumer(context, consumer_uuid, data.get(\u0027project_id\u0027),"},{"line_number":295,"context_line":"             data.get(\u0027user_id\u0027), data.get(\u0027consumer_generation\u0027),"},{"line_number":296,"context_line":"             want_version)"},{"line_number":297,"context_line":"        allocations \u003d rp_obj.AllocationList.get_all_by_consumer_id("}],"source_content_type":"text/x-python","patch_set":29,"id":"5f7c97a3_159b9417","line":294,"range":{"start_line":294,"start_character":13,"end_line":294,"end_character":28},"updated":"2018-06-14 21:47:07.000000000","message":"Does this mean I can create bogus consumer records by spamming /allocations/{consumer_uuid} with empty payloads?\n\nDo we still have the leak where consumers are never deleted?  (Or maybe that was aggregates?)","commit_id":"449f5e8e574efd907f48ae6b4eb8554c727f8c11"}],"nova/api/openstack/placement/microversion.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a5c8423d33d410eae8187eaaa0774c78d8aaa536","unresolved":false,"context_lines":[{"line_number":68,"context_line":"             # GET /resource_providers"},{"line_number":69,"context_line":"    \u00271.25\u0027,  # Adds support for granular resource requests via numbered"},{"line_number":70,"context_line":"             # querystring groups in GET /allocation_candidates"},{"line_number":71,"context_line":"    \u00271.26\u0027,  # Add support for consumer generation"},{"line_number":72,"context_line":"]"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_44f8f347","line":71,"updated":"2018-05-10 14:30:53.000000000","message":"Perhaps add: \"when modifying allocations\"?","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f3486550f5c728803e68d1be2f67a42fba84b12d","unresolved":false,"context_lines":[{"line_number":68,"context_line":"             # GET /resource_providers"},{"line_number":69,"context_line":"    \u00271.25\u0027,  # Adds support for granular resource requests via numbered"},{"line_number":70,"context_line":"             # querystring groups in GET /allocation_candidates"},{"line_number":71,"context_line":"    \u00271.26\u0027,  # Add support for consumer generation"},{"line_number":72,"context_line":"]"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_7e324112","line":71,"in_reply_to":"5f7c97a3_44f8f347","updated":"2018-05-11 19:07:09.000000000","message":"Well, it\u0027s the GETs as well...","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"}],"nova/api/openstack/placement/objects/consumer.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3b4c557a877889de17b1338b086be6542b63aa49","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    res \u003d ctx.session.execute(upd_stmt)"},{"line_number":128,"context_line":"    if res.rowcount !\u003d 1:"},{"line_number":129,"context_line":"        raise exception.ConcurrentUpdateDetected"},{"line_number":130,"context_line":"    return new_generation"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_a490fa97","line":129,"range":{"start_line":129,"start_character":14,"end_line":129,"end_character":48},"updated":"2018-06-20 14:20:03.000000000","message":"I thought PEP8 stated a preference for raising instances instead of classes, but apparently it doesn\u0027t. I believe the overwhelming majority of the Nova code uses instances, even when there are no arguments, so this looks really weird to my eyes.","commit_id":"092820939d53268152893a15fdaf5129554fbcb3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"12d10c5c3b4a9e760d6c8cac734c40f726db6ef0","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    res \u003d ctx.session.execute(upd_stmt)"},{"line_number":128,"context_line":"    if res.rowcount !\u003d 1:"},{"line_number":129,"context_line":"        raise exception.ConcurrentUpdateDetected"},{"line_number":130,"context_line":"    return new_generation"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_84c93e5b","line":129,"range":{"start_line":129,"start_character":14,"end_line":129,"end_character":48},"in_reply_to":"5f7c97a3_a490fa97","updated":"2018-06-20 14:32:02.000000000","message":"Agree it looks weird.  Apparently pep doesn\u0027t care (or we have that rule disabled) and this matches what we do for provider generations [1].  I\u0027m guessing since we only use it as a signal it\u0027s okay?\n\n[1] https://github.com/openstack/nova/blob/a0bdebac04af91198cef6beeea8d520212aa33df/nova/api/openstack/placement/objects/resource_provider.py#L281","commit_id":"092820939d53268152893a15fdaf5129554fbcb3"}],"nova/api/openstack/placement/objects/resource_provider.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a5c8423d33d410eae8187eaaa0774c78d8aaa536","unresolved":false,"context_lines":[{"line_number":2179,"context_line":"        for alloc in allocs:"},{"line_number":2180,"context_line":"            # TODO(jaypipes): The check for whether an Allocation.consumer is"},{"line_number":2181,"context_line":"            # None is necessary here because older allocations created before"},{"line_number":2182,"context_line":"            # 1.12 would not have a project or user and thus no consumers table"},{"line_number":2183,"context_line":"            # record would have been created. Remove this check when we are"},{"line_number":2184,"context_line":"            # assured that all allocations have an associated consumers table"},{"line_number":2185,"context_line":"            # record."}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_8487ebb5","line":2182,"updated":"2018-05-10 14:30:53.000000000","message":"didn\u0027t your migration earlier in the stack take care of this?","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f3486550f5c728803e68d1be2f67a42fba84b12d","unresolved":false,"context_lines":[{"line_number":2179,"context_line":"        for alloc in allocs:"},{"line_number":2180,"context_line":"            # TODO(jaypipes): The check for whether an Allocation.consumer is"},{"line_number":2181,"context_line":"            # None is necessary here because older allocations created before"},{"line_number":2182,"context_line":"            # 1.12 would not have a project or user and thus no consumers table"},{"line_number":2183,"context_line":"            # record would have been created. Remove this check when we are"},{"line_number":2184,"context_line":"            # assured that all allocations have an associated consumers table"},{"line_number":2185,"context_line":"            # record."}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_3e3849ec","line":2182,"in_reply_to":"5f7c97a3_8487ebb5","updated":"2018-05-11 19:07:09.000000000","message":"done. nice catch.","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3b4c557a877889de17b1338b086be6542b63aa49","unresolved":false,"context_lines":[{"line_number":1663,"context_line":"    for alloc in allocs:"},{"line_number":1664,"context_line":"        rc_id \u003d _RC_CACHE.id_from_string(alloc.resource_class)"},{"line_number":1665,"context_line":"        rp_uuid \u003d alloc.resource_provider.uuid"},{"line_number":1666,"context_line":"        if rp_uuid not in res_providers:"},{"line_number":1667,"context_line":"            res_providers[rp_uuid] \u003d alloc.resource_provider"},{"line_number":1668,"context_line":"        amount_needed \u003d alloc.used"},{"line_number":1669,"context_line":"        # No use checking usage if we\u0027re not asking for anything"},{"line_number":1670,"context_line":"        if amount_needed \u003d\u003d 0:"},{"line_number":1671,"context_line":"            continue"},{"line_number":1672,"context_line":"        key \u003d (rp_uuid, rc_id)"},{"line_number":1673,"context_line":"        try:"},{"line_number":1674,"context_line":"            usage \u003d usage_map[key]"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_44e4863c","line":1671,"range":{"start_line":1666,"start_character":0,"end_line":1671,"end_character":20},"updated":"2018-06-20 14:20:03.000000000","message":"This looks like it is an optimization that has nothing to do with this patch and could be split?","commit_id":"092820939d53268152893a15fdaf5129554fbcb3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"12d10c5c3b4a9e760d6c8cac734c40f726db6ef0","unresolved":false,"context_lines":[{"line_number":1663,"context_line":"    for alloc in allocs:"},{"line_number":1664,"context_line":"        rc_id \u003d _RC_CACHE.id_from_string(alloc.resource_class)"},{"line_number":1665,"context_line":"        rp_uuid \u003d alloc.resource_provider.uuid"},{"line_number":1666,"context_line":"        if rp_uuid not in res_providers:"},{"line_number":1667,"context_line":"            res_providers[rp_uuid] \u003d alloc.resource_provider"},{"line_number":1668,"context_line":"        amount_needed \u003d alloc.used"},{"line_number":1669,"context_line":"        # No use checking usage if we\u0027re not asking for anything"},{"line_number":1670,"context_line":"        if amount_needed \u003d\u003d 0:"},{"line_number":1671,"context_line":"            continue"},{"line_number":1672,"context_line":"        key \u003d (rp_uuid, rc_id)"},{"line_number":1673,"context_line":"        try:"},{"line_number":1674,"context_line":"            usage \u003d usage_map[key]"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_64d3c202","line":1671,"range":{"start_line":1666,"start_character":0,"end_line":1671,"end_character":20},"in_reply_to":"5f7c97a3_44e4863c","updated":"2018-06-20 14:32:02.000000000","message":"I remember thinking that too originally.  I believe I convinced myself it was necessary for allowing deletion via PUT, which is new in this microversion.","commit_id":"092820939d53268152893a15fdaf5129554fbcb3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5451db38b578d303012f057d30a3b16c7130561e","unresolved":false,"context_lines":[{"line_number":1663,"context_line":"    for alloc in allocs:"},{"line_number":1664,"context_line":"        rc_id \u003d _RC_CACHE.id_from_string(alloc.resource_class)"},{"line_number":1665,"context_line":"        rp_uuid \u003d alloc.resource_provider.uuid"},{"line_number":1666,"context_line":"        if rp_uuid not in res_providers:"},{"line_number":1667,"context_line":"            res_providers[rp_uuid] \u003d alloc.resource_provider"},{"line_number":1668,"context_line":"        amount_needed \u003d alloc.used"},{"line_number":1669,"context_line":"        # No use checking usage if we\u0027re not asking for anything"},{"line_number":1670,"context_line":"        if amount_needed \u003d\u003d 0:"},{"line_number":1671,"context_line":"            continue"},{"line_number":1672,"context_line":"        key \u003d (rp_uuid, rc_id)"},{"line_number":1673,"context_line":"        try:"},{"line_number":1674,"context_line":"            usage \u003d usage_map[key]"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_e49fd2ff","line":1671,"range":{"start_line":1666,"start_character":0,"end_line":1671,"end_character":20},"in_reply_to":"5f7c97a3_64d3c202","updated":"2018-06-20 14:35:27.000000000","message":"Hmm, okay, well, seems like it should have gone first, especially since this is such a massive patch already. But I guess no point in delaying this further at this time.","commit_id":"092820939d53268152893a15fdaf5129554fbcb3"}],"nova/api/openstack/placement/rest_api_version_history.rst":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a5c8423d33d410eae8187eaaa0774c78d8aaa536","unresolved":false,"context_lines":[{"line_number":332,"context_line":"allocation is created, a consumer UUID is specified, along with a project and"},{"line_number":333,"context_line":"user ID (after microversion 1.8)."},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"The consumers generation facilitates partial modification of an allocation and"},{"line_number":336,"context_line":"protects allocation data for a single consumer from being modified improperly"},{"line_number":337,"context_line":"by concurrent callers."},{"line_number":338,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"5f7c97a3_0453db40","line":335,"range":{"start_line":335,"start_character":37,"end_line":335,"end_character":57},"updated":"2018-05-10 14:30:53.000000000","message":"\"partial\" kind of implies that we are allowing people to do something other than replace allocations. Might be a better way to say this if we want to be fully pedantic and accurate.","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a5c8423d33d410eae8187eaaa0774c78d8aaa536","unresolved":false,"context_lines":[{"line_number":332,"context_line":"allocation is created, a consumer UUID is specified, along with a project and"},{"line_number":333,"context_line":"user ID (after microversion 1.8)."},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"The consumers generation facilitates partial modification of an allocation and"},{"line_number":336,"context_line":"protects allocation data for a single consumer from being modified improperly"},{"line_number":337,"context_line":"by concurrent callers."},{"line_number":338,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"5f7c97a3_a4b54780","line":335,"range":{"start_line":335,"start_character":4,"end_line":335,"end_character":13},"updated":"2018-05-10 14:30:53.000000000","message":"consumer\u0027s?","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f3486550f5c728803e68d1be2f67a42fba84b12d","unresolved":false,"context_lines":[{"line_number":332,"context_line":"allocation is created, a consumer UUID is specified, along with a project and"},{"line_number":333,"context_line":"user ID (after microversion 1.8)."},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"The consumers generation facilitates partial modification of an allocation and"},{"line_number":336,"context_line":"protects allocation data for a single consumer from being modified improperly"},{"line_number":337,"context_line":"by concurrent callers."},{"line_number":338,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"5f7c97a3_be045919","line":335,"range":{"start_line":335,"start_character":37,"end_line":335,"end_character":57},"in_reply_to":"5f7c97a3_0453db40","updated":"2018-05-11 19:07:09.000000000","message":"Done","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f3486550f5c728803e68d1be2f67a42fba84b12d","unresolved":false,"context_lines":[{"line_number":332,"context_line":"allocation is created, a consumer UUID is specified, along with a project and"},{"line_number":333,"context_line":"user ID (after microversion 1.8)."},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"The consumers generation facilitates partial modification of an allocation and"},{"line_number":336,"context_line":"protects allocation data for a single consumer from being modified improperly"},{"line_number":337,"context_line":"by concurrent callers."},{"line_number":338,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"5f7c97a3_1e0c6d3f","line":335,"range":{"start_line":335,"start_character":4,"end_line":335,"end_character":13},"in_reply_to":"5f7c97a3_a4b54780","updated":"2018-05-11 19:07:09.000000000","message":"Done","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a5c8423d33d410eae8187eaaa0774c78d8aaa536","unresolved":false,"context_lines":[{"line_number":354,"context_line":""},{"line_number":355,"context_line":"The value of the ``consumer_generation`` field will be either ``null`` or an"},{"line_number":356,"context_line":"unsigned integer.  Values of ``null`` indicate that the allocation was created"},{"line_number":357,"context_line":"before consumer records were being fully tracked. These allocations may not be"},{"line_number":358,"context_line":"partially modified (though they may be replaced or deleted entirely). The"},{"line_number":359,"context_line":"replace and delete operation on such allocations will not be safe for"},{"line_number":360,"context_line":"concurrent callers."},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"The ``PUT /allocations/{consumer_uuid}`` URI has bee modified to now require a"},{"line_number":363,"context_line":"``consumer_generation`` field in the request payload. This field is required to"}],"source_content_type":"text/x-rst","patch_set":11,"id":"5f7c97a3_c43de3dd","line":360,"range":{"start_line":357,"start_character":50,"end_line":360,"end_character":19},"updated":"2018-05-10 14:30:53.000000000","message":"this doesn\u0027t really make sense to me. You can still partially modify: you get, modify the bit you want, and put back, the same way you always were able to partially modify allocations and the same way we still do. Yes, it is not safe.\n\nOr are you using \"partially modify\" in some other meaning?","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f3486550f5c728803e68d1be2f67a42fba84b12d","unresolved":false,"context_lines":[{"line_number":354,"context_line":""},{"line_number":355,"context_line":"The value of the ``consumer_generation`` field will be either ``null`` or an"},{"line_number":356,"context_line":"unsigned integer.  Values of ``null`` indicate that the allocation was created"},{"line_number":357,"context_line":"before consumer records were being fully tracked. These allocations may not be"},{"line_number":358,"context_line":"partially modified (though they may be replaced or deleted entirely). The"},{"line_number":359,"context_line":"replace and delete operation on such allocations will not be safe for"},{"line_number":360,"context_line":"concurrent callers."},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"The ``PUT /allocations/{consumer_uuid}`` URI has bee modified to now require a"},{"line_number":363,"context_line":"``consumer_generation`` field in the request payload. This field is required to"}],"source_content_type":"text/x-rst","patch_set":11,"id":"5f7c97a3_d213495b","line":360,"range":{"start_line":357,"start_character":50,"end_line":360,"end_character":19},"in_reply_to":"5f7c97a3_c43de3dd","updated":"2018-05-11 19:07:09.000000000","message":"Sorry, I meant partial modification in the sense of transaction isolation and read consistency -- i.e. phantom reads and partial writes. I\u0027ve removed the term \"partial modification\" and just used the term \"safe concurrent modification\" everywhere.","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a5c8423d33d410eae8187eaaa0774c78d8aaa536","unresolved":false,"context_lines":[{"line_number":359,"context_line":"replace and delete operation on such allocations will not be safe for"},{"line_number":360,"context_line":"concurrent callers."},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"The ``PUT /allocations/{consumer_uuid}`` URI has bee modified to now require a"},{"line_number":363,"context_line":"``consumer_generation`` field in the request payload. This field is required to"},{"line_number":364,"context_line":"be ``null`` if the caller expects that there are no allocations already"},{"line_number":365,"context_line":"existing for the consumer. Otherwise, it should contain the integer generation"}],"source_content_type":"text/x-rst","patch_set":11,"id":"5f7c97a3_84236bbd","line":362,"range":{"start_line":362,"start_character":49,"end_line":362,"end_character":52},"updated":"2018-05-10 14:30:53.000000000","message":"been","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f3486550f5c728803e68d1be2f67a42fba84b12d","unresolved":false,"context_lines":[{"line_number":359,"context_line":"replace and delete operation on such allocations will not be safe for"},{"line_number":360,"context_line":"concurrent callers."},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"The ``PUT /allocations/{consumer_uuid}`` URI has bee modified to now require a"},{"line_number":363,"context_line":"``consumer_generation`` field in the request payload. This field is required to"},{"line_number":364,"context_line":"be ``null`` if the caller expects that there are no allocations already"},{"line_number":365,"context_line":"existing for the consumer. Otherwise, it should contain the integer generation"}],"source_content_type":"text/x-rst","patch_set":11,"id":"5f7c97a3_125461fd","line":362,"range":{"start_line":362,"start_character":49,"end_line":362,"end_character":52},"in_reply_to":"5f7c97a3_84236bbd","updated":"2018-05-11 19:07:09.000000000","message":"Done","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a5c8423d33d410eae8187eaaa0774c78d8aaa536","unresolved":false,"context_lines":[{"line_number":393,"context_line":""},{"line_number":394,"context_line":"**WARNING**:"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"In all cases, it is absolutely **NOT SAFE** to create and modify allocations"},{"line_number":397,"context_line":"for a consumer using different microversions where one of the microversions is"},{"line_number":398,"context_line":"prior to 1.26. The only way to safely modify allocations for a consumer and"},{"line_number":399,"context_line":"satisfy expectations you have regarding the prior existence (or lack of"}],"source_content_type":"text/x-rst","patch_set":11,"id":"5f7c97a3_e7002104","line":396,"range":{"start_line":396,"start_character":20,"end_line":396,"end_character":43},"updated":"2018-05-10 14:30:53.000000000","message":"seems a bit strong to me\n\nThe situations in which we require safety are rather constrained and for some use cases will be uncommon or even rare.","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f3486550f5c728803e68d1be2f67a42fba84b12d","unresolved":false,"context_lines":[{"line_number":393,"context_line":""},{"line_number":394,"context_line":"**WARNING**:"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"In all cases, it is absolutely **NOT SAFE** to create and modify allocations"},{"line_number":397,"context_line":"for a consumer using different microversions where one of the microversions is"},{"line_number":398,"context_line":"prior to 1.26. The only way to safely modify allocations for a consumer and"},{"line_number":399,"context_line":"satisfy expectations you have regarding the prior existence (or lack of"}],"source_content_type":"text/x-rst","patch_set":11,"id":"5f7c97a3_926071d1","line":396,"range":{"start_line":396,"start_character":20,"end_line":396,"end_character":43},"in_reply_to":"5f7c97a3_e7002104","updated":"2018-05-11 19:07:09.000000000","message":"I was asked in an earlier revision and on the spec to call out the lack of safety very clearly. :)","commit_id":"3829413219f0e811b33c2289e550421fe7d957a3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":352,"context_line":""},{"line_number":353,"context_line":"``GET /resource_providers/{uuid}/allocations``"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"The response continues to be a dict with a key of \u0027allocations\u0027, which itself"},{"line_number":356,"context_line":"is a dict, keyed by consumer UUID, of allocations against the resource"},{"line_number":357,"context_line":"provider. For each of those dicts, a ``consumer_generation`` field will now be"},{"line_number":358,"context_line":"shown."}],"source_content_type":"text/x-rst","patch_set":26,"id":"5f7c97a3_db601da8","line":355,"range":{"start_line":355,"start_character":50,"end_line":355,"end_character":63},"updated":"2018-06-12 22:26:10.000000000","message":"double backticks (throughout)","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":352,"context_line":""},{"line_number":353,"context_line":"``GET /resource_providers/{uuid}/allocations``"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"The response continues to be a dict with a key of \u0027allocations\u0027, which itself"},{"line_number":356,"context_line":"is a dict, keyed by consumer UUID, of allocations against the resource"},{"line_number":357,"context_line":"provider. For each of those dicts, a ``consumer_generation`` field will now be"},{"line_number":358,"context_line":"shown."}],"source_content_type":"text/x-rst","patch_set":26,"id":"5f7c97a3_1a13dd02","line":355,"range":{"start_line":355,"start_character":50,"end_line":355,"end_character":63},"in_reply_to":"5f7c97a3_db601da8","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1b6352547d3a109534311b452f78bead1ec3b776","unresolved":false,"context_lines":[{"line_number":364,"context_line":"consumed by the consumer with the ``{consumer_uuid}``. The top-level dict will"},{"line_number":365,"context_line":"also now contain a ``consumer_generation`` field."},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"The value of the ``consumer_generation`` field will be an unsigned integer."},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"The ``PUT /allocations/{consumer_uuid}`` URI has been modified to now require a"},{"line_number":370,"context_line":"``consumer_generation`` field in the request payload. This field is required to"}],"source_content_type":"text/x-rst","patch_set":29,"id":"5f7c97a3_78eafd0e","line":367,"range":{"start_line":367,"start_character":0,"end_line":367,"end_character":75},"updated":"2018-06-14 21:47:07.000000000","message":"boo\n\n\"The value of the ``consumer_generation`` field is intended to be opaque to the caller. Don\u0027t look at it - just send back what you get.\"","commit_id":"449f5e8e574efd907f48ae6b4eb8554c727f8c11"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4711c156e827c6e1631806463116f8fff60cdde7","unresolved":false,"context_lines":[{"line_number":364,"context_line":"consumed by the consumer with the ``{consumer_uuid}``. The top-level dict will"},{"line_number":365,"context_line":"also now contain a ``consumer_generation`` field."},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"The value of the ``consumer_generation`` field will be an unsigned integer."},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"The ``PUT /allocations/{consumer_uuid}`` URI has been modified to now require a"},{"line_number":370,"context_line":"``consumer_generation`` field in the request payload. This field is required to"}],"source_content_type":"text/x-rst","patch_set":29,"id":"5f7c97a3_3c0947dc","line":367,"range":{"start_line":367,"start_character":0,"end_line":367,"end_character":75},"in_reply_to":"5f7c97a3_78eafd0e","updated":"2018-06-21 16:11:49.000000000","message":"Done","commit_id":"449f5e8e574efd907f48ae6b4eb8554c727f8c11"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1b6352547d3a109534311b452f78bead1ec3b776","unresolved":false,"context_lines":[{"line_number":369,"context_line":"The ``PUT /allocations/{consumer_uuid}`` URI has been modified to now require a"},{"line_number":370,"context_line":"``consumer_generation`` field in the request payload. This field is required to"},{"line_number":371,"context_line":"be ``null`` if the caller expects that there are no allocations already"},{"line_number":372,"context_line":"existing for the consumer. Otherwise, it should contain the integer generation"},{"line_number":373,"context_line":"that the caller understands the consumer to be at the time of the call."},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"A ``409 Conflict`` will be returned from the ``PUT"}],"source_content_type":"text/x-rst","patch_set":29,"id":"5f7c97a3_98e27930","line":372,"range":{"start_line":372,"start_character":60,"end_line":372,"end_character":67},"updated":"2018-06-14 21:47:07.000000000","message":"strike","commit_id":"449f5e8e574efd907f48ae6b4eb8554c727f8c11"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4711c156e827c6e1631806463116f8fff60cdde7","unresolved":false,"context_lines":[{"line_number":369,"context_line":"The ``PUT /allocations/{consumer_uuid}`` URI has been modified to now require a"},{"line_number":370,"context_line":"``consumer_generation`` field in the request payload. This field is required to"},{"line_number":371,"context_line":"be ``null`` if the caller expects that there are no allocations already"},{"line_number":372,"context_line":"existing for the consumer. Otherwise, it should contain the integer generation"},{"line_number":373,"context_line":"that the caller understands the consumer to be at the time of the call."},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"A ``409 Conflict`` will be returned from the ``PUT"}],"source_content_type":"text/x-rst","patch_set":29,"id":"5f7c97a3_fc0e6fe2","line":372,"range":{"start_line":372,"start_character":60,"end_line":372,"end_character":67},"in_reply_to":"5f7c97a3_98e27930","updated":"2018-06-21 16:11:49.000000000","message":"Done","commit_id":"449f5e8e574efd907f48ae6b4eb8554c727f8c11"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1b6352547d3a109534311b452f78bead1ec3b776","unresolved":false,"context_lines":[{"line_number":372,"context_line":"existing for the consumer. Otherwise, it should contain the integer generation"},{"line_number":373,"context_line":"that the caller understands the consumer to be at the time of the call."},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"A ``409 Conflict`` will be returned from the ``PUT"},{"line_number":376,"context_line":"/allocations/{consumer_uuid}`` if there was a mismatch between the supplied"},{"line_number":377,"context_line":"generation and the consumer\u0027s generation as known by the server. Similarly, a"},{"line_number":378,"context_line":"``409 Conflict`` will be returned if during the course of replacing the"}],"source_content_type":"text/x-rst","patch_set":29,"id":"5f7c97a3_18c8a9a6","line":375,"range":{"start_line":375,"start_character":41,"end_line":375,"end_character":44},"updated":"2018-06-14 21:47:07.000000000","message":"strike (or add \"URI\" to match elsewhere, even though that\u0027s not strictly correct)","commit_id":"449f5e8e574efd907f48ae6b4eb8554c727f8c11"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4711c156e827c6e1631806463116f8fff60cdde7","unresolved":false,"context_lines":[{"line_number":372,"context_line":"existing for the consumer. Otherwise, it should contain the integer generation"},{"line_number":373,"context_line":"that the caller understands the consumer to be at the time of the call."},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"A ``409 Conflict`` will be returned from the ``PUT"},{"line_number":376,"context_line":"/allocations/{consumer_uuid}`` if there was a mismatch between the supplied"},{"line_number":377,"context_line":"generation and the consumer\u0027s generation as known by the server. Similarly, a"},{"line_number":378,"context_line":"``409 Conflict`` will be returned if during the course of replacing the"}],"source_content_type":"text/x-rst","patch_set":29,"id":"5f7c97a3_7cfa5fba","line":375,"range":{"start_line":375,"start_character":41,"end_line":375,"end_character":44},"in_reply_to":"5f7c97a3_18c8a9a6","updated":"2018-06-21 16:11:49.000000000","message":"Done","commit_id":"449f5e8e574efd907f48ae6b4eb8554c727f8c11"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1b6352547d3a109534311b452f78bead1ec3b776","unresolved":false,"context_lines":[{"line_number":377,"context_line":"generation and the consumer\u0027s generation as known by the server. Similarly, a"},{"line_number":378,"context_line":"``409 Conflict`` will be returned if during the course of replacing the"},{"line_number":379,"context_line":"consumer\u0027s allocations another process concurrently changed the consumer\u0027s"},{"line_number":380,"context_line":"allocations. This allows the caller to react to the concurrent write by"},{"line_number":381,"context_line":"re-reading the consumer\u0027s allocations and re-issuing the call to replace"},{"line_number":382,"context_line":"allocations as needed."},{"line_number":383,"context_line":""}],"source_content_type":"text/x-rst","patch_set":29,"id":"5f7c97a3_d846b123","line":380,"updated":"2018-06-14 21:47:07.000000000","message":"worth mentioning the error codes, probably","commit_id":"449f5e8e574efd907f48ae6b4eb8554c727f8c11"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8dca36343fedb97aed8995ee99c6ac86c329ce0f","unresolved":false,"context_lines":[{"line_number":337,"context_line":"response of the ``GET /allocation_candidates`` API even if the resource class"},{"line_number":338,"context_line":"is not in the requested resources."},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"1.28 Consumer generation support"},{"line_number":341,"context_line":"--------------------------------"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"A new generation field has been added to the consumer concept. Consumers are"}],"source_content_type":"text/x-rst","patch_set":31,"id":"5f7c97a3_b3658ae3","line":340,"updated":"2018-06-21 14:03:03.000000000","message":"I\u0027m kind of surprised this doesn\u0027t mention that for older microversions, the consumer project/user are filled in using the config options.","commit_id":"092820939d53268152893a15fdaf5129554fbcb3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4711c156e827c6e1631806463116f8fff60cdde7","unresolved":false,"context_lines":[{"line_number":337,"context_line":"response of the ``GET /allocation_candidates`` API even if the resource class"},{"line_number":338,"context_line":"is not in the requested resources."},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"1.28 Consumer generation support"},{"line_number":341,"context_line":"--------------------------------"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"A new generation field has been added to the consumer concept. Consumers are"}],"source_content_type":"text/x-rst","patch_set":31,"id":"5f7c97a3_3cd70726","line":340,"in_reply_to":"5f7c97a3_b3658ae3","updated":"2018-06-21 16:11:49.000000000","message":"Done","commit_id":"092820939d53268152893a15fdaf5129554fbcb3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8dca36343fedb97aed8995ee99c6ac86c329ce0f","unresolved":false,"context_lines":[{"line_number":343,"context_line":"A new generation field has been added to the consumer concept. Consumers are"},{"line_number":344,"context_line":"the actors that are allocated resources in the placement API. When an"},{"line_number":345,"context_line":"allocation is created, a consumer UUID is specified, along with a project and"},{"line_number":346,"context_line":"user ID (after microversion 1.8)."},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"The consumer generation facilitates safe concurrent modification of an"},{"line_number":349,"context_line":"allocation."}],"source_content_type":"text/x-rst","patch_set":31,"id":"5f7c97a3_7342923d","line":346,"range":{"start_line":346,"start_character":9,"end_line":346,"end_character":14},"updated":"2018-06-21 14:03:03.000000000","message":"Technically after 1.7, or just say \u003e\u003d 1.8, or \"starting with microversion 1.8\"","commit_id":"092820939d53268152893a15fdaf5129554fbcb3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4711c156e827c6e1631806463116f8fff60cdde7","unresolved":false,"context_lines":[{"line_number":343,"context_line":"A new generation field has been added to the consumer concept. Consumers are"},{"line_number":344,"context_line":"the actors that are allocated resources in the placement API. When an"},{"line_number":345,"context_line":"allocation is created, a consumer UUID is specified, along with a project and"},{"line_number":346,"context_line":"user ID (after microversion 1.8)."},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"The consumer generation facilitates safe concurrent modification of an"},{"line_number":349,"context_line":"allocation."}],"source_content_type":"text/x-rst","patch_set":31,"id":"5f7c97a3_fcdc2f46","line":346,"range":{"start_line":346,"start_character":9,"end_line":346,"end_character":14},"in_reply_to":"5f7c97a3_7342923d","updated":"2018-06-21 16:11:49.000000000","message":"Done","commit_id":"092820939d53268152893a15fdaf5129554fbcb3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8dca36343fedb97aed8995ee99c6ac86c329ce0f","unresolved":false,"context_lines":[{"line_number":398,"context_line":"generations conflict with the server\u0027s view of those consumers or if any of the"},{"line_number":399,"context_line":"consumers involved in the request are modified by another process."},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"**WARNING**:"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"In all cases, it is absolutely **NOT SAFE** to create and modify allocations"},{"line_number":404,"context_line":"for a consumer using different microversions where one of the microversions is"}],"source_content_type":"text/x-rst","patch_set":31,"id":"5f7c97a3_93688eba","line":401,"range":{"start_line":401,"start_character":0,"end_line":401,"end_character":12},"updated":"2018-06-21 14:03:03.000000000","message":"nit: since this is a rst doc, you should do:\n\n.. warning::","commit_id":"092820939d53268152893a15fdaf5129554fbcb3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4711c156e827c6e1631806463116f8fff60cdde7","unresolved":false,"context_lines":[{"line_number":398,"context_line":"generations conflict with the server\u0027s view of those consumers or if any of the"},{"line_number":399,"context_line":"consumers involved in the request are modified by another process."},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"**WARNING**:"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"In all cases, it is absolutely **NOT SAFE** to create and modify allocations"},{"line_number":404,"context_line":"for a consumer using different microversions where one of the microversions is"}],"source_content_type":"text/x-rst","patch_set":31,"id":"5f7c97a3_5cc44360","line":401,"range":{"start_line":401,"start_character":0,"end_line":401,"end_character":12},"in_reply_to":"5f7c97a3_93688eba","updated":"2018-06-21 16:11:49.000000000","message":"Done","commit_id":"092820939d53268152893a15fdaf5129554fbcb3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3b4c557a877889de17b1338b086be6542b63aa49","unresolved":false,"context_lines":[{"line_number":400,"context_line":""},{"line_number":401,"context_line":"**WARNING**:"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"In all cases, it is absolutely **NOT SAFE** to create and modify allocations"},{"line_number":404,"context_line":"for a consumer using different microversions where one of the microversions is"},{"line_number":405,"context_line":"prior to 1.28. The only way to safely modify allocations for a consumer and"},{"line_number":406,"context_line":"satisfy expectations you have regarding the prior existence (or lack of"},{"line_number":407,"context_line":"existence) of those allocations is to always use microversion 1.28+ when"},{"line_number":408,"context_line":"calling allocations API endpoints."}],"source_content_type":"text/x-rst","patch_set":31,"id":"5f7c97a3_a4431a11","line":408,"range":{"start_line":403,"start_character":0,"end_line":408,"end_character":34},"updated":"2018-06-20 14:20:03.000000000","message":"As I said in the spec, I think this is a weird threat. AFAIK, the only warning should be that using older microversions will assume the current generation and not provide any concurrency detection. Using a combination should be fine, as long as you\u0027re aware that the older calls are going to stomp on anything, right?","commit_id":"092820939d53268152893a15fdaf5129554fbcb3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"12d10c5c3b4a9e760d6c8cac734c40f726db6ef0","unresolved":false,"context_lines":[{"line_number":400,"context_line":""},{"line_number":401,"context_line":"**WARNING**:"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"In all cases, it is absolutely **NOT SAFE** to create and modify allocations"},{"line_number":404,"context_line":"for a consumer using different microversions where one of the microversions is"},{"line_number":405,"context_line":"prior to 1.28. The only way to safely modify allocations for a consumer and"},{"line_number":406,"context_line":"satisfy expectations you have regarding the prior existence (or lack of"},{"line_number":407,"context_line":"existence) of those allocations is to always use microversion 1.28+ when"},{"line_number":408,"context_line":"calling allocations API endpoints."}],"source_content_type":"text/x-rst","patch_set":31,"id":"5f7c97a3_a44ebabf","line":408,"range":{"start_line":403,"start_character":0,"end_line":408,"end_character":34},"in_reply_to":"5f7c97a3_a4431a11","updated":"2018-06-20 14:32:02.000000000","message":"Meh, either wording conveys the issue; I don\u0027t have a strong opinion which one we should use.  Perhaps you\u0027d like to propose a specific reword in a fup and we can compare/contrast?","commit_id":"092820939d53268152893a15fdaf5129554fbcb3"}],"nova/api/openstack/placement/schemas/allocation.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    \"additionalProperties\": False"},{"line_number":161,"context_line":"}"},{"line_number":162,"context_line":"REQUIRED_GENERATION_ALLOCS_POST[\u0027required\u0027].append(\"consumer_generation\")"},{"line_number":163,"context_line":"POST_ALLOCATIONS_V1_27 \u003d copy.deepcopy(POST_ALLOCATIONS_V1_13)"},{"line_number":164,"context_line":"POST_ALLOCATIONS_V1_27[\"patternProperties\"] \u003d {"},{"line_number":165,"context_line":"    \"^[0-9a-fA-F-]{36}$\": REQUIRED_GENERATION_ALLOCS_POST"},{"line_number":166,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_9b5625ce","line":163,"range":{"start_line":163,"start_character":20,"end_line":163,"end_character":22},"updated":"2018-06-12 22:26:10.000000000","message":"28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    \"additionalProperties\": False"},{"line_number":161,"context_line":"}"},{"line_number":162,"context_line":"REQUIRED_GENERATION_ALLOCS_POST[\u0027required\u0027].append(\"consumer_generation\")"},{"line_number":163,"context_line":"POST_ALLOCATIONS_V1_27 \u003d copy.deepcopy(POST_ALLOCATIONS_V1_13)"},{"line_number":164,"context_line":"POST_ALLOCATIONS_V1_27[\"patternProperties\"] \u003d {"},{"line_number":165,"context_line":"    \"^[0-9a-fA-F-]{36}$\": REQUIRED_GENERATION_ALLOCS_POST"},{"line_number":166,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_5acb9570","line":163,"range":{"start_line":163,"start_character":20,"end_line":163,"end_character":22},"in_reply_to":"5f7c97a3_9b5625ce","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":161,"context_line":"}"},{"line_number":162,"context_line":"REQUIRED_GENERATION_ALLOCS_POST[\u0027required\u0027].append(\"consumer_generation\")"},{"line_number":163,"context_line":"POST_ALLOCATIONS_V1_27 \u003d copy.deepcopy(POST_ALLOCATIONS_V1_13)"},{"line_number":164,"context_line":"POST_ALLOCATIONS_V1_27[\"patternProperties\"] \u003d {"},{"line_number":165,"context_line":"    \"^[0-9a-fA-F-]{36}$\": REQUIRED_GENERATION_ALLOCS_POST"},{"line_number":166,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_bb59a1fd","line":164,"range":{"start_line":164,"start_character":20,"end_line":164,"end_character":22},"updated":"2018-06-12 22:26:10.000000000","message":"28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":161,"context_line":"}"},{"line_number":162,"context_line":"REQUIRED_GENERATION_ALLOCS_POST[\u0027required\u0027].append(\"consumer_generation\")"},{"line_number":163,"context_line":"POST_ALLOCATIONS_V1_27 \u003d copy.deepcopy(POST_ALLOCATIONS_V1_13)"},{"line_number":164,"context_line":"POST_ALLOCATIONS_V1_27[\"patternProperties\"] \u003d {"},{"line_number":165,"context_line":"    \"^[0-9a-fA-F-]{36}$\": REQUIRED_GENERATION_ALLOCS_POST"},{"line_number":166,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_fac5c15c","line":164,"range":{"start_line":164,"start_character":20,"end_line":164,"end_character":22},"in_reply_to":"5f7c97a3_bb59a1fd","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"}],"nova/api/openstack/placement/util.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":594,"context_line":"    :raises webob.exc.HTTPConflict if consumer generation is required and there"},{"line_number":595,"context_line":"            was a mismatch"},{"line_number":596,"context_line":"    \"\"\""},{"line_number":597,"context_line":"    requires_consumer_generation \u003d want_version.matches((1, 27))"},{"line_number":598,"context_line":"    if project_id is None:"},{"line_number":599,"context_line":"        project_id \u003d CONF.placement.incomplete_consumer_project_id"},{"line_number":600,"context_line":"        user_id \u003d CONF.placement.incomplete_consumer_user_id"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_7b6f8991","line":597,"range":{"start_line":597,"start_character":60,"end_line":597,"end_character":62},"updated":"2018-06-12 22:26:10.000000000","message":"28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":594,"context_line":"    :raises webob.exc.HTTPConflict if consumer generation is required and there"},{"line_number":595,"context_line":"            was a mismatch"},{"line_number":596,"context_line":"    \"\"\""},{"line_number":597,"context_line":"    requires_consumer_generation \u003d want_version.matches((1, 27))"},{"line_number":598,"context_line":"    if project_id is None:"},{"line_number":599,"context_line":"        project_id \u003d CONF.placement.incomplete_consumer_project_id"},{"line_number":600,"context_line":"        user_id \u003d CONF.placement.incomplete_consumer_user_id"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_baa189ab","line":597,"range":{"start_line":597,"start_character":60,"end_line":597,"end_character":62},"in_reply_to":"5f7c97a3_7b6f8991","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"}],"nova/tests/functional/api/openstack/placement/gabbits/allocations-1.28.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":1,"context_line":"fixtures:"},{"line_number":2,"context_line":"    - AllocationFixture"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"defaults:"}],"source_content_type":"text/x-yaml","patch_set":26,"id":"5f7c97a3_dbd33d37","line":1,"updated":"2018-06-12 22:26:10.000000000","message":"Need a similar suite for POST","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5e3d1e60b5a016b82e5f4e19899871b69a231d66","unresolved":false,"context_lines":[{"line_number":1,"context_line":"fixtures:"},{"line_number":2,"context_line":"    - AllocationFixture"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"defaults:"}],"source_content_type":"text/x-yaml","patch_set":26,"id":"5f7c97a3_da4fa58f","line":1,"in_reply_to":"5f7c97a3_dbd33d37","updated":"2018-06-13 15:36:45.000000000","message":"we already have an allocations POST gabbit, but I will add some gabbit tests for \u003e\u003d1.28 to it.","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":27,"context_line":"- name: old version no gen no existing"},{"line_number":28,"context_line":"  PUT: /allocations/11111111-1111-1111-1111-111111111111"},{"line_number":29,"context_line":"  request_headers:"},{"line_number":30,"context_line":"      openstack-api-version: placement 1.21"},{"line_number":31,"context_line":"  data:"},{"line_number":32,"context_line":"      allocations:"},{"line_number":33,"context_line":"          $ENVIRON[\u0027RP_UUID\u0027]:"}],"source_content_type":"text/x-yaml","patch_set":26,"id":"5f7c97a3_9b0b85d3","line":30,"range":{"start_line":30,"start_character":41,"end_line":30,"end_character":43},"updated":"2018-06-12 22:26:10.000000000","message":"may as well make this 27 :)","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":27,"context_line":"- name: old version no gen no existing"},{"line_number":28,"context_line":"  PUT: /allocations/11111111-1111-1111-1111-111111111111"},{"line_number":29,"context_line":"  request_headers:"},{"line_number":30,"context_line":"      openstack-api-version: placement 1.21"},{"line_number":31,"context_line":"  data:"},{"line_number":32,"context_line":"      allocations:"},{"line_number":33,"context_line":"          $ENVIRON[\u0027RP_UUID\u0027]:"}],"source_content_type":"text/x-yaml","patch_set":26,"id":"5f7c97a3_5a90754e","line":30,"range":{"start_line":30,"start_character":41,"end_line":30,"end_character":43},"in_reply_to":"5f7c97a3_9b0b85d3","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":136,"context_line":"- name: old version no gen existing"},{"line_number":137,"context_line":"  PUT: /allocations/44444444-4444-4444-4444-444444444444"},{"line_number":138,"context_line":"  request_headers:"},{"line_number":139,"context_line":"      openstack-api-version: placement 1.21"},{"line_number":140,"context_line":"  data:"},{"line_number":141,"context_line":"      allocations:"},{"line_number":142,"context_line":"          $ENVIRON[\u0027RP_UUID\u0027]:"}],"source_content_type":"text/x-yaml","patch_set":26,"id":"5f7c97a3_5bf96dc5","line":139,"range":{"start_line":139,"start_character":41,"end_line":139,"end_character":43},"updated":"2018-06-12 22:26:10.000000000","message":"ditto","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":136,"context_line":"- name: old version no gen existing"},{"line_number":137,"context_line":"  PUT: /allocations/44444444-4444-4444-4444-444444444444"},{"line_number":138,"context_line":"  request_headers:"},{"line_number":139,"context_line":"      openstack-api-version: placement 1.21"},{"line_number":140,"context_line":"  data:"},{"line_number":141,"context_line":"      allocations:"},{"line_number":142,"context_line":"          $ENVIRON[\u0027RP_UUID\u0027]:"}],"source_content_type":"text/x-yaml","patch_set":26,"id":"5f7c97a3_da8d6531","line":139,"range":{"start_line":139,"start_character":41,"end_line":139,"end_character":43},"in_reply_to":"5f7c97a3_5bf96dc5","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"}],"nova/tests/unit/api/openstack/placement/test_util.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":928,"context_line":"        self.consumer_id \u003d uuidsentinel.consumer"},{"line_number":929,"context_line":"        self.project_id \u003d uuidsentinel.project"},{"line_number":930,"context_line":"        self.user_id \u003d uuidsentinel.user"},{"line_number":931,"context_line":"        mv_parsed \u003d microversion_parse.Version(1, 26)"},{"line_number":932,"context_line":"        mv_parsed.max_version \u003d microversion_parse.parse_version_string("},{"line_number":933,"context_line":"            microversion.max_version_string())"},{"line_number":934,"context_line":"        mv_parsed.min_version \u003d microversion_parse.parse_version_string("}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_7be22903","line":931,"range":{"start_line":931,"start_character":50,"end_line":931,"end_character":52},"updated":"2018-06-12 22:26:10.000000000","message":"27","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":928,"context_line":"        self.consumer_id \u003d uuidsentinel.consumer"},{"line_number":929,"context_line":"        self.project_id \u003d uuidsentinel.project"},{"line_number":930,"context_line":"        self.user_id \u003d uuidsentinel.user"},{"line_number":931,"context_line":"        mv_parsed \u003d microversion_parse.Version(1, 26)"},{"line_number":932,"context_line":"        mv_parsed.max_version \u003d microversion_parse.parse_version_string("},{"line_number":933,"context_line":"            microversion.max_version_string())"},{"line_number":934,"context_line":"        mv_parsed.min_version \u003d microversion_parse.parse_version_string("}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_9a984d69","line":931,"range":{"start_line":931,"start_character":50,"end_line":931,"end_character":52},"in_reply_to":"5f7c97a3_7be22903","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":934,"context_line":"        mv_parsed.min_version \u003d microversion_parse.parse_version_string("},{"line_number":935,"context_line":"            microversion.min_version_string())"},{"line_number":936,"context_line":"        self.before_version \u003d mv_parsed"},{"line_number":937,"context_line":"        mv_parsed \u003d microversion_parse.Version(1, 27)"},{"line_number":938,"context_line":"        mv_parsed.max_version \u003d microversion_parse.parse_version_string("},{"line_number":939,"context_line":"            microversion.max_version_string())"},{"line_number":940,"context_line":"        mv_parsed.min_version \u003d microversion_parse.parse_version_string("}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_1bed35ef","line":937,"range":{"start_line":937,"start_character":50,"end_line":937,"end_character":52},"updated":"2018-06-12 22:26:10.000000000","message":"28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":934,"context_line":"        mv_parsed.min_version \u003d microversion_parse.parse_version_string("},{"line_number":935,"context_line":"            microversion.min_version_string())"},{"line_number":936,"context_line":"        self.before_version \u003d mv_parsed"},{"line_number":937,"context_line":"        mv_parsed \u003d microversion_parse.Version(1, 27)"},{"line_number":938,"context_line":"        mv_parsed.max_version \u003d microversion_parse.parse_version_string("},{"line_number":939,"context_line":"            microversion.max_version_string())"},{"line_number":940,"context_line":"        mv_parsed.min_version \u003d microversion_parse.parse_version_string("}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_3aa339a0","line":937,"range":{"start_line":937,"start_character":50,"end_line":937,"end_character":52},"in_reply_to":"5f7c97a3_1bed35ef","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"}],"placement-api-ref/source/allocations.inc":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":31,"context_line":"  resource providers for any specified resource classes or inventories"},{"line_number":32,"context_line":"  are updated by another thread while attempting the operation."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Request (microversions 1.13 - )"},{"line_number":35,"context_line":"-----------------------------------"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":".. rest_parameters:: parameters.yaml"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_fb095994","line":34,"range":{"start_line":34,"start_character":7,"end_line":34,"end_character":31},"updated":"2018-06-12 22:26:10.000000000","message":"can probably nix this, since it\u0027s mentioned on L22 and there\u0027s only the one section.","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":31,"context_line":"  resource providers for any specified resource classes or inventories"},{"line_number":32,"context_line":"  are updated by another thread while attempting the operation."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Request (microversions 1.13 - )"},{"line_number":35,"context_line":"-----------------------------------"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":".. rest_parameters:: parameters.yaml"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_9ab12de3","line":34,"range":{"start_line":34,"start_character":7,"end_line":34,"end_character":31},"in_reply_to":"5f7c97a3_fb095994","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":42,"context_line":"  - user_id: user_id_body"},{"line_number":43,"context_line":"  - allocations: allocations_dict_empty"},{"line_number":44,"context_line":"  - resources: resources"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Request example (microversions 1.13 - 1.26)"},{"line_number":47,"context_line":"-------------------------------------------"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_5bfacd74","line":45,"updated":"2018-06-12 22:26:10.000000000","message":"In this one, the examples are listed in ascending microversion order, whereas below they\u0027re descending (newest first).  Looks like we\u0027re not as consistent as we should be across the whole api-ref, but IMO the latter (newest first) is preferable.","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":42,"context_line":"  - user_id: user_id_body"},{"line_number":43,"context_line":"  - allocations: allocations_dict_empty"},{"line_number":44,"context_line":"  - resources: resources"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Request example (microversions 1.13 - 1.26)"},{"line_number":47,"context_line":"-------------------------------------------"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_3acc9968","line":45,"in_reply_to":"5f7c97a3_5bfacd74","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":43,"context_line":"  - allocations: allocations_dict_empty"},{"line_number":44,"context_line":"  - resources: resources"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Request example (microversions 1.13 - 1.26)"},{"line_number":47,"context_line":"-------------------------------------------"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":".. literalinclude:: ./samples/allocations/manage-allocations-request.json"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_fbbf19cd","line":46,"range":{"start_line":46,"start_character":40,"end_line":46,"end_character":42},"updated":"2018-06-12 22:26:10.000000000","message":"27","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":43,"context_line":"  - allocations: allocations_dict_empty"},{"line_number":44,"context_line":"  - resources: resources"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Request example (microversions 1.13 - 1.26)"},{"line_number":47,"context_line":"-------------------------------------------"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":".. literalinclude:: ./samples/allocations/manage-allocations-request.json"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_dabb25c1","line":46,"range":{"start_line":46,"start_character":40,"end_line":46,"end_character":42},"in_reply_to":"5f7c97a3_fbbf19cd","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":49,"context_line":".. literalinclude:: ./samples/allocations/manage-allocations-request.json"},{"line_number":50,"context_line":"   :language: javascript"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Request example (microversions 1.27 - )"},{"line_number":53,"context_line":"---------------------------------------"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":".. literalinclude:: ./samples/allocations/manage-allocations-request-1.27.json"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_9bb2a505","line":52,"range":{"start_line":52,"start_character":33,"end_line":52,"end_character":35},"updated":"2018-06-12 22:26:10.000000000","message":"28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":52,"context_line":"Request example (microversions 1.27 - )"},{"line_number":53,"context_line":"---------------------------------------"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":".. literalinclude:: ./samples/allocations/manage-allocations-request-1.27.json"},{"line_number":56,"context_line":"   :language: javascript"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"Response"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_bbb521ef","line":55,"range":{"start_line":55,"start_character":71,"end_line":55,"end_character":73},"updated":"2018-06-12 22:26:10.000000000","message":"28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":52,"context_line":"Request example (microversions 1.27 - )"},{"line_number":53,"context_line":"---------------------------------------"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":".. literalinclude:: ./samples/allocations/manage-allocations-request-1.27.json"},{"line_number":56,"context_line":"   :language: javascript"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"Response"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_fac14130","line":55,"range":{"start_line":55,"start_character":71,"end_line":55,"end_character":73},"in_reply_to":"5f7c97a3_bbb521ef","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":93,"context_line":"  - project_id: project_id_body_1_12"},{"line_number":94,"context_line":"  - user_id: user_id_body_1_12"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Response Example (1.27 - )"},{"line_number":97,"context_line":"--------------------------"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":".. literalinclude:: ./samples/allocations/get-allocations-1.27.json"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_3bc1114f","line":96,"range":{"start_line":96,"start_character":20,"end_line":96,"end_character":22},"updated":"2018-06-12 22:26:10.000000000","message":"28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":93,"context_line":"  - project_id: project_id_body_1_12"},{"line_number":94,"context_line":"  - user_id: user_id_body_1_12"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Response Example (1.27 - )"},{"line_number":97,"context_line":"--------------------------"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":".. literalinclude:: ./samples/allocations/get-allocations-1.27.json"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_1abd1db0","line":96,"range":{"start_line":96,"start_character":20,"end_line":96,"end_character":22},"in_reply_to":"5f7c97a3_3bc1114f","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":96,"context_line":"Response Example (1.27 - )"},{"line_number":97,"context_line":"--------------------------"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":".. literalinclude:: ./samples/allocations/get-allocations-1.27.json"},{"line_number":100,"context_line":"   :language: javascript"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"Response Example (1.12 - 1.26)"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_7b9ea954","line":99,"range":{"start_line":99,"start_character":60,"end_line":99,"end_character":62},"updated":"2018-06-12 22:26:10.000000000","message":"28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":96,"context_line":"Response Example (1.27 - )"},{"line_number":97,"context_line":"--------------------------"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":".. literalinclude:: ./samples/allocations/get-allocations-1.27.json"},{"line_number":100,"context_line":"   :language: javascript"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"Response Example (1.12 - 1.26)"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_7ae3f1d8","line":99,"range":{"start_line":99,"start_character":60,"end_line":99,"end_character":62},"in_reply_to":"5f7c97a3_7b9ea954","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":99,"context_line":".. literalinclude:: ./samples/allocations/get-allocations-1.27.json"},{"line_number":100,"context_line":"   :language: javascript"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"Response Example (1.12 - 1.26)"},{"line_number":103,"context_line":"------------------------------"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":".. literalinclude:: ./samples/allocations/get-allocations.json"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_fba4f9ba","line":102,"range":{"start_line":102,"start_character":27,"end_line":102,"end_character":29},"updated":"2018-06-12 22:26:10.000000000","message":"27","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":99,"context_line":".. literalinclude:: ./samples/allocations/get-allocations-1.27.json"},{"line_number":100,"context_line":"   :language: javascript"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"Response Example (1.12 - 1.26)"},{"line_number":103,"context_line":"------------------------------"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":".. literalinclude:: ./samples/allocations/get-allocations.json"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_9ae60de7","line":102,"range":{"start_line":102,"start_character":27,"end_line":102,"end_character":29},"in_reply_to":"5f7c97a3_fba4f9ba","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":136,"context_line":"  - user_id: user_id_body"},{"line_number":137,"context_line":"  - generation: resource_provider_generation_optional"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"Request example (microversions 1.27 - )"},{"line_number":140,"context_line":"---------------------------------------"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":".. literalinclude:: ./samples/allocations/update-allocations-request-1.27.json"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_db8fbd20","line":139,"range":{"start_line":139,"start_character":33,"end_line":139,"end_character":35},"updated":"2018-06-12 22:26:10.000000000","message":"28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":136,"context_line":"  - user_id: user_id_body"},{"line_number":137,"context_line":"  - generation: resource_provider_generation_optional"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"Request example (microversions 1.27 - )"},{"line_number":140,"context_line":"---------------------------------------"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":".. literalinclude:: ./samples/allocations/update-allocations-request-1.27.json"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_3ad1f9fb","line":139,"range":{"start_line":139,"start_character":33,"end_line":139,"end_character":35},"in_reply_to":"5f7c97a3_db8fbd20","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":139,"context_line":"Request example (microversions 1.27 - )"},{"line_number":140,"context_line":"---------------------------------------"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":".. literalinclude:: ./samples/allocations/update-allocations-request-1.27.json"},{"line_number":143,"context_line":"   :language: javascript"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"Request example (microversions 1.12 - 1.26)"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_5bd16dfa","line":142,"range":{"start_line":142,"start_character":71,"end_line":142,"end_character":73},"updated":"2018-06-12 22:26:10.000000000","message":"28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":139,"context_line":"Request example (microversions 1.27 - )"},{"line_number":140,"context_line":"---------------------------------------"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":".. literalinclude:: ./samples/allocations/update-allocations-request-1.27.json"},{"line_number":143,"context_line":"   :language: javascript"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"Request example (microversions 1.12 - 1.26)"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_5accf55f","line":142,"range":{"start_line":142,"start_character":71,"end_line":142,"end_character":73},"in_reply_to":"5f7c97a3_5bd16dfa","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":142,"context_line":".. literalinclude:: ./samples/allocations/update-allocations-request-1.27.json"},{"line_number":143,"context_line":"   :language: javascript"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"Request example (microversions 1.12 - 1.26)"},{"line_number":146,"context_line":"-------------------------------------------"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":".. literalinclude:: ./samples/allocations/update-allocations-request-1.12.json"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_9b95c534","line":145,"range":{"start_line":145,"start_character":40,"end_line":145,"end_character":42},"updated":"2018-06-12 22:26:10.000000000","message":"27","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":142,"context_line":".. literalinclude:: ./samples/allocations/update-allocations-request-1.27.json"},{"line_number":143,"context_line":"   :language: javascript"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"Request example (microversions 1.12 - 1.26)"},{"line_number":146,"context_line":"-------------------------------------------"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":".. literalinclude:: ./samples/allocations/update-allocations-request-1.12.json"}],"source_content_type":"text/x-c++src","patch_set":26,"id":"5f7c97a3_fad621f2","line":145,"range":{"start_line":145,"start_character":40,"end_line":145,"end_character":42},"in_reply_to":"5f7c97a3_9b95c534","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"}],"placement-api-ref/source/parameters.yaml":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bd4e3925be5f7a9086774677929c81523e5e243b","unresolved":false,"context_lines":[{"line_number":320,"context_line":"  required: true"},{"line_number":321,"context_line":"  min_version: 1.27"},{"line_number":322,"context_line":"  description: \u003e"},{"line_number":323,"context_line":"    The generation of the consumer. Should be set to ``None`` when indicating"},{"line_number":324,"context_line":"    the the caller expects the consumer does not yet exist."},{"line_number":325,"context_line":"consumer_uuid_body:"},{"line_number":326,"context_line":"  \u003c\u003c: *consumer_uuid"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5f7c97a3_b7bd5669","line":323,"range":{"start_line":323,"start_character":53,"end_line":323,"end_character":61},"updated":"2018-06-11 21:25:33.000000000","message":"In this context do we refer to the Python None or the JSON null? I don\u0027t know. I would guess null?","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":320,"context_line":"  required: true"},{"line_number":321,"context_line":"  min_version: 1.27"},{"line_number":322,"context_line":"  description: \u003e"},{"line_number":323,"context_line":"    The generation of the consumer. Should be set to ``None`` when indicating"},{"line_number":324,"context_line":"    the the caller expects the consumer does not yet exist."},{"line_number":325,"context_line":"consumer_uuid_body:"},{"line_number":326,"context_line":"  \u003c\u003c: *consumer_uuid"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5f7c97a3_fb871960","line":323,"range":{"start_line":323,"start_character":53,"end_line":323,"end_character":61},"in_reply_to":"5f7c97a3_b7bd5669","updated":"2018-06-12 22:26:10.000000000","message":"Right, ``null``, since this is a generic API reference, not a python client reference.","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4711c156e827c6e1631806463116f8fff60cdde7","unresolved":false,"context_lines":[{"line_number":320,"context_line":"  required: true"},{"line_number":321,"context_line":"  min_version: 1.27"},{"line_number":322,"context_line":"  description: \u003e"},{"line_number":323,"context_line":"    The generation of the consumer. Should be set to ``None`` when indicating"},{"line_number":324,"context_line":"    the the caller expects the consumer does not yet exist."},{"line_number":325,"context_line":"consumer_uuid_body:"},{"line_number":326,"context_line":"  \u003c\u003c: *consumer_uuid"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5f7c97a3_3ca5c7b5","line":323,"range":{"start_line":323,"start_character":53,"end_line":323,"end_character":61},"in_reply_to":"5f7c97a3_fb871960","updated":"2018-06-21 16:11:49.000000000","message":"Done","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bd4e3925be5f7a9086774677929c81523e5e243b","unresolved":false,"context_lines":[{"line_number":321,"context_line":"  min_version: 1.27"},{"line_number":322,"context_line":"  description: \u003e"},{"line_number":323,"context_line":"    The generation of the consumer. Should be set to ``None`` when indicating"},{"line_number":324,"context_line":"    the the caller expects the consumer does not yet exist."},{"line_number":325,"context_line":"consumer_uuid_body:"},{"line_number":326,"context_line":"  \u003c\u003c: *consumer_uuid"},{"line_number":327,"context_line":"  in: body"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5f7c97a3_378866c4","line":324,"range":{"start_line":324,"start_character":4,"end_line":324,"end_character":11},"updated":"2018-06-11 21:25:33.000000000","message":"that the","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4711c156e827c6e1631806463116f8fff60cdde7","unresolved":false,"context_lines":[{"line_number":321,"context_line":"  min_version: 1.27"},{"line_number":322,"context_line":"  description: \u003e"},{"line_number":323,"context_line":"    The generation of the consumer. Should be set to ``None`` when indicating"},{"line_number":324,"context_line":"    the the caller expects the consumer does not yet exist."},{"line_number":325,"context_line":"consumer_uuid_body:"},{"line_number":326,"context_line":"  \u003c\u003c: *consumer_uuid"},{"line_number":327,"context_line":"  in: body"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5f7c97a3_fcaaef81","line":324,"range":{"start_line":324,"start_character":4,"end_line":324,"end_character":11},"in_reply_to":"5f7c97a3_378866c4","updated":"2018-06-21 16:11:49.000000000","message":"Done","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":318,"context_line":"  type: integer"},{"line_number":319,"context_line":"  in: body"},{"line_number":320,"context_line":"  required: true"},{"line_number":321,"context_line":"  min_version: 1.27"},{"line_number":322,"context_line":"  description: \u003e"},{"line_number":323,"context_line":"    The generation of the consumer. Should be set to ``None`` when indicating"},{"line_number":324,"context_line":"    the the caller expects the consumer does not yet exist."}],"source_content_type":"text/x-yaml","patch_set":26,"id":"5f7c97a3_fb8dd930","line":321,"range":{"start_line":321,"start_character":17,"end_line":321,"end_character":19},"updated":"2018-06-12 22:26:10.000000000","message":"28\n\nBut this is *allowed* to be sent (just ignored) for POST /allocations \u003c1.28, right?","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[{"line_number":318,"context_line":"  type: integer"},{"line_number":319,"context_line":"  in: body"},{"line_number":320,"context_line":"  required: true"},{"line_number":321,"context_line":"  min_version: 1.27"},{"line_number":322,"context_line":"  description: \u003e"},{"line_number":323,"context_line":"    The generation of the consumer. Should be set to ``None`` when indicating"},{"line_number":324,"context_line":"    the the caller expects the consumer does not yet exist."}],"source_content_type":"text/x-yaml","patch_set":26,"id":"5f7c97a3_ba066985","line":321,"range":{"start_line":321,"start_character":17,"end_line":321,"end_character":19},"in_reply_to":"5f7c97a3_fb8dd930","updated":"2018-06-13 15:02:25.000000000","message":"No, it\u0027s not allowed to be sent \u003c1.28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1b6352547d3a109534311b452f78bead1ec3b776","unresolved":false,"context_lines":[{"line_number":320,"context_line":"  required: true"},{"line_number":321,"context_line":"  min_version: 1.28"},{"line_number":322,"context_line":"  description: \u003e"},{"line_number":323,"context_line":"    The generation of the consumer. Should be set to ``None`` when indicating"},{"line_number":324,"context_line":"    the the caller expects the consumer does not yet exist."},{"line_number":325,"context_line":"consumer_uuid_body:"},{"line_number":326,"context_line":"  \u003c\u003c: *consumer_uuid"}],"source_content_type":"text/x-yaml","patch_set":29,"id":"5f7c97a3_caf6cf5e","line":323,"range":{"start_line":323,"start_character":53,"end_line":323,"end_character":61},"updated":"2018-06-14 21:47:07.000000000","message":"``null``","commit_id":"449f5e8e574efd907f48ae6b4eb8554c727f8c11"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1b6352547d3a109534311b452f78bead1ec3b776","unresolved":false,"context_lines":[{"line_number":321,"context_line":"  min_version: 1.28"},{"line_number":322,"context_line":"  description: \u003e"},{"line_number":323,"context_line":"    The generation of the consumer. Should be set to ``None`` when indicating"},{"line_number":324,"context_line":"    the the caller expects the consumer does not yet exist."},{"line_number":325,"context_line":"consumer_uuid_body:"},{"line_number":326,"context_line":"  \u003c\u003c: *consumer_uuid"},{"line_number":327,"context_line":"  in: body"}],"source_content_type":"text/x-yaml","patch_set":29,"id":"5f7c97a3_8ac8d721","line":324,"range":{"start_line":324,"start_character":4,"end_line":324,"end_character":7},"updated":"2018-06-14 21:47:07.000000000","message":"that","commit_id":"449f5e8e574efd907f48ae6b4eb8554c727f8c11"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8dca36343fedb97aed8995ee99c6ac86c329ce0f","unresolved":false,"context_lines":[{"line_number":321,"context_line":"  min_version: 1.28"},{"line_number":322,"context_line":"  description: \u003e"},{"line_number":323,"context_line":"    The generation of the consumer. Should be set to ``None`` when indicating"},{"line_number":324,"context_line":"    the the caller expects the consumer does not yet exist."},{"line_number":325,"context_line":"consumer_uuid_body:"},{"line_number":326,"context_line":"  \u003c\u003c: *consumer_uuid"},{"line_number":327,"context_line":"  in: body"}],"source_content_type":"text/x-yaml","patch_set":31,"id":"5f7c97a3_735b7221","line":324,"range":{"start_line":324,"start_character":4,"end_line":324,"end_character":7},"updated":"2018-06-21 14:03:03.000000000","message":"that","commit_id":"092820939d53268152893a15fdaf5129554fbcb3"}],"placement-api-ref/source/samples/allocations/get-allocations-1.27.json":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"5f7c97a3_7b90e94e","updated":"2018-06-12 22:26:10.000000000","message":"rename file to -28","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"5f7c97a3_9affed64","in_reply_to":"5f7c97a3_7b90e94e","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"}],"placement-api-ref/source/samples/allocations/manage-allocations-request-1.27.json":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"5f7c97a3_1b9bf572","updated":"2018-06-12 22:26:10.000000000","message":"ditto","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"5f7c97a3_1aebdda3","in_reply_to":"5f7c97a3_1b9bf572","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"}],"placement-api-ref/source/samples/allocations/update-allocations-request-1.27.json":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"5f7c97a3_3b96f14a","updated":"2018-06-12 22:26:10.000000000","message":"ditto","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5d46ff6ab533a7f895b2ccd2fba41b68265902f1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"5f7c97a3_faef01ae","in_reply_to":"5f7c97a3_3b96f14a","updated":"2018-06-13 15:02:25.000000000","message":"Done","commit_id":"ed1fe0d1161b2e3cae6745d9723015db1b33e305"}],"releasenotes/notes/consumer_generation-f576ac2594b24e2e.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds a new ``generation`` column to the consumers table. This value is"},{"line_number":5,"context_line":"    incremented every time allocations are made for a consumer. The new"},{"line_number":6,"context_line":"    placement microversion 1.28 requires that all ``POST`` and ``PUT"},{"line_number":7,"context_line":"    /allocations`` requests now include the ``consumer_generation`` parameter"},{"line_number":8,"context_line":"    to ensure that if two processes are allocating resources for the same"},{"line_number":9,"context_line":"    consumer, the second one to post doesn\u0027t overwrite the first. If there is a"},{"line_number":10,"context_line":"    mismatch between the ``consumer_generation`` in the request and the current"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5f7c97a3_9bef051c","line":7,"range":{"start_line":6,"start_character":50,"end_line":7,"end_character":18},"updated":"2018-06-12 22:26:10.000000000","message":"technically ``POST /allocations`` and ``PUT /allocations/{consumer_uuid}``","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4711c156e827c6e1631806463116f8fff60cdde7","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds a new ``generation`` column to the consumers table. This value is"},{"line_number":5,"context_line":"    incremented every time allocations are made for a consumer. The new"},{"line_number":6,"context_line":"    placement microversion 1.28 requires that all ``POST`` and ``PUT"},{"line_number":7,"context_line":"    /allocations`` requests now include the ``consumer_generation`` parameter"},{"line_number":8,"context_line":"    to ensure that if two processes are allocating resources for the same"},{"line_number":9,"context_line":"    consumer, the second one to post doesn\u0027t overwrite the first. If there is a"},{"line_number":10,"context_line":"    mismatch between the ``consumer_generation`` in the request and the current"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5f7c97a3_3c8e272e","line":7,"range":{"start_line":6,"start_character":50,"end_line":7,"end_character":18},"in_reply_to":"5f7c97a3_9bef051c","updated":"2018-06-21 16:11:49.000000000","message":"Done","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    placement microversion 1.28 requires that all ``POST`` and ``PUT"},{"line_number":7,"context_line":"    /allocations`` requests now include the ``consumer_generation`` parameter"},{"line_number":8,"context_line":"    to ensure that if two processes are allocating resources for the same"},{"line_number":9,"context_line":"    consumer, the second one to post doesn\u0027t overwrite the first. If there is a"},{"line_number":10,"context_line":"    mismatch between the ``consumer_generation`` in the request and the current"},{"line_number":11,"context_line":"    value in the database, the allocation will fail, and a 409 Conflict"},{"line_number":12,"context_line":"    response will be returned. The calling process must then get the"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5f7c97a3_bbf20104","line":9,"range":{"start_line":9,"start_character":32,"end_line":9,"end_character":36},"updated":"2018-06-12 22:26:10.000000000","message":"complete?","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4711c156e827c6e1631806463116f8fff60cdde7","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    placement microversion 1.28 requires that all ``POST`` and ``PUT"},{"line_number":7,"context_line":"    /allocations`` requests now include the ``consumer_generation`` parameter"},{"line_number":8,"context_line":"    to ensure that if two processes are allocating resources for the same"},{"line_number":9,"context_line":"    consumer, the second one to post doesn\u0027t overwrite the first. If there is a"},{"line_number":10,"context_line":"    mismatch between the ``consumer_generation`` in the request and the current"},{"line_number":11,"context_line":"    value in the database, the allocation will fail, and a 409 Conflict"},{"line_number":12,"context_line":"    response will be returned. The calling process must then get the"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5f7c97a3_fc83cf01","line":9,"range":{"start_line":9,"start_character":32,"end_line":9,"end_character":36},"in_reply_to":"5f7c97a3_bbf20104","updated":"2018-06-21 16:11:49.000000000","message":"Done","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bd4e3925be5f7a9086774677929c81523e5e243b","unresolved":false,"context_lines":[{"line_number":12,"context_line":"    response will be returned. The calling process must then get the"},{"line_number":13,"context_line":"    allocations for that consumer by calling ``GET /allocations/{consumer}``."},{"line_number":14,"context_line":"    That response will now contain, in addition to the allocations, the current"},{"line_number":15,"context_line":"    value of the generation value for that consumer. The calling process should"},{"line_number":16,"context_line":"    then combine the existing allocations with the ones it is trying to post,"},{"line_number":17,"context_line":"    and re-submit with the current consumer_generation."}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5f7c97a3_37b14690","line":17,"range":{"start_line":15,"start_character":53,"end_line":17,"end_character":55},"updated":"2018-06-11 21:25:33.000000000","message":"This is one option of what they might do, but not the only one? Sometimes they might want to stop, sometimes they might want to clobber?","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4711c156e827c6e1631806463116f8fff60cdde7","unresolved":false,"context_lines":[{"line_number":12,"context_line":"    response will be returned. The calling process must then get the"},{"line_number":13,"context_line":"    allocations for that consumer by calling ``GET /allocations/{consumer}``."},{"line_number":14,"context_line":"    That response will now contain, in addition to the allocations, the current"},{"line_number":15,"context_line":"    value of the generation value for that consumer. The calling process should"},{"line_number":16,"context_line":"    then combine the existing allocations with the ones it is trying to post,"},{"line_number":17,"context_line":"    and re-submit with the current consumer_generation."}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5f7c97a3_dcacd389","line":17,"range":{"start_line":15,"start_character":53,"end_line":17,"end_character":55},"in_reply_to":"5f7c97a3_1be3f535","updated":"2018-06-21 16:11:49.000000000","message":"Done","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f988191f0031d3516449bf4fbc27f6ee4a28360","unresolved":false,"context_lines":[{"line_number":12,"context_line":"    response will be returned. The calling process must then get the"},{"line_number":13,"context_line":"    allocations for that consumer by calling ``GET /allocations/{consumer}``."},{"line_number":14,"context_line":"    That response will now contain, in addition to the allocations, the current"},{"line_number":15,"context_line":"    value of the generation value for that consumer. The calling process should"},{"line_number":16,"context_line":"    then combine the existing allocations with the ones it is trying to post,"},{"line_number":17,"context_line":"    and re-submit with the current consumer_generation."}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5f7c97a3_1be3f535","line":17,"range":{"start_line":15,"start_character":53,"end_line":17,"end_character":55},"in_reply_to":"5f7c97a3_37b14690","updated":"2018-06-12 22:26:10.000000000","message":"Agree.  The last two sentences should probably be genericized.","commit_id":"fd3f72855e0b2f54f6da70a252dd67703dc3a139"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1b6352547d3a109534311b452f78bead1ec3b776","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"5f7c97a3_0ad4c7ba","updated":"2018-06-14 21:47:07.000000000","message":"PS24 comments","commit_id":"449f5e8e574efd907f48ae6b4eb8554c727f8c11"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8dca36343fedb97aed8995ee99c6ac86c329ce0f","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":"    Adds a new ``generation`` column to the consumers table. This value is"},{"line_number":5,"context_line":"    incremented every time allocations are made for a consumer. The new"}],"source_content_type":"text/x-yaml","patch_set":31,"id":"5f7c97a3_7389326d","line":2,"updated":"2018-06-21 14:03:03.000000000","message":"Did we already mention the config option for missing project/user in pre-1.8 calls in another release note?\n\n(later)\n\nLooks like we did:\n\nhttps://docs.openstack.org/releasenotes/nova/unreleased.html\n\n\"Prior to microversion 1.8 of the placement API, one could create allocations and not supply a project or user ID for the consumer of the allocated resources. While this is no longer allowed after placement API 1.8, older allocations exist and we now ensure that a consumer record is created for these older allocations. Use the two new CONF options CONF.placement.incomplete_consumer_project_id and CONF.placement.incomplete_consumer_user_id to control the project and user identifiers that are written for these incomplete consumer records.\"","commit_id":"092820939d53268152893a15fdaf5129554fbcb3"}]}
