)]}'
{"neutron_lib/exceptions/placement.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0252a2d532a5a8765e445a2fd9234f2b27ad5080","unresolved":false,"context_lines":[{"line_number":85,"context_line":"class PlacementAllocationGenerationConflict(exceptions.Conflict):"},{"line_number":86,"context_line":"    message \u003d _(\"Placement allocation generation does not match with \""},{"line_number":87,"context_line":"                \"the server side for the allocation of consumer: \""},{"line_number":88,"context_line":"                \"%(consumer)s\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_f5bfcfa7","line":88,"updated":"2020-07-17 14:01:04.000000000","message":"While what you write is correct the higher level meaning of the conflict is that the allocation has been changed while we tried to update it. \n\nI would write something like:\n\nResource allocation has been changed in Placement while Neutron tried to update it.","commit_id":"6b2186dd9429db26b21cf8297f8008f2fa09d26f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3528b0cc0294eafcc0354d1df775ff508ecec9f8","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class PlacementAllocationRpNotExists(exceptions.BadRequest):"},{"line_number":95,"context_line":"    message \u003d _(\"Resource provider %(resource_provider)s for %(consumer)s\""},{"line_number":96,"context_line":"                \"doesn\u0027t exist\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f560f44_888c5f80","line":95,"updated":"2020-08-31 13:17:52.000000000","message":"nit: a space is needed here","commit_id":"01cea64276835e2454f87c93fdad67b37e7cff82"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"87bb2a8a66690be3bb9444739b5e07ba86e76572","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class PlacementAllocationRpNotExists(exceptions.BadRequest):"},{"line_number":95,"context_line":"    message \u003d _(\"Resource provider %(resource_provider)s for %(consumer)s \""},{"line_number":96,"context_line":"                \"doesn\u0027t exist\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_75f24408","line":96,"range":{"start_line":96,"start_character":17,"end_line":96,"end_character":24},"updated":"2020-09-03 14:20:43.000000000","message":"s/does not\n\nAlthough I think doesn\u0027t should be translatable","commit_id":"737b2c34acba480fb41e44c58e937bcf463f56a0"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"22d6665e5e9569dff388a0c6f56e6bc01ac6aaaa","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class PlacementAllocationRpNotExists(exceptions.BadRequest):"},{"line_number":95,"context_line":"    message \u003d _(\"Resource provider %(resource_provider)s for %(consumer)s \""},{"line_number":96,"context_line":"                \"doesn\u0027t exist\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_358e0c27","line":96,"range":{"start_line":96,"start_character":17,"end_line":96,"end_character":24},"in_reply_to":"9f560f44_75f24408","updated":"2020-09-03 14:24:39.000000000","message":"thanks","commit_id":"737b2c34acba480fb41e44c58e937bcf463f56a0"}],"neutron_lib/placement/client.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0252a2d532a5a8765e445a2fd9234f2b27ad5080","unresolved":false,"context_lines":[{"line_number":746,"context_line":"        return self._get(url).json()"},{"line_number":747,"context_line":""},{"line_number":748,"context_line":"    # TODO(lajoskatona): Separate this to 2 method, one for low lewel put"},{"line_number":749,"context_line":"    # and one for handling the magic with retries."},{"line_number":750,"context_line":"    @_check_placement_api_available"},{"line_number":751,"context_line":"    def update_allocation(self, consumer_uuid, allocations, rp_uuid):"},{"line_number":752,"context_line":"        \"\"\"Update allocation record for given consumer and rp"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_d5f60b91","line":749,"range":{"start_line":749,"start_character":18,"end_line":749,"end_character":36},"updated":"2020-07-17 14:01:04.000000000","message":":)","commit_id":"6b2186dd9429db26b21cf8297f8008f2fa09d26f"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0252a2d532a5a8765e445a2fd9234f2b27ad5080","unresolved":false,"context_lines":[{"line_number":762,"context_line":"        for i in range(GENERATION_CONFLICT_RETRIES):"},{"line_number":763,"context_line":"            body \u003d self.list_allocations(consumer_uuid)"},{"line_number":764,"context_line":"            # This way we keep the original consumer_generation and generation"},{"line_number":765,"context_line":"            body[\u0027allocations\u0027][rp_uuid][\u0027resources\u0027].update(allocations)"},{"line_number":766,"context_line":"            try:"},{"line_number":767,"context_line":"                # Update allocations has no return body, but leave the loop"},{"line_number":768,"context_line":"                return self._put(url, body)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_980ccaed","line":765,"range":{"start_line":765,"start_character":54,"end_line":765,"end_character":73},"updated":"2020-07-17 14:01:04.000000000","message":"I think this is problematic.\n\nImagine that you have an allocation of 10 and you want to increase that by 2. In the current code the update_allocation() needs to be called with 12 so that the update result in the increase of 2. BUT if the allocation is changed in the meantime e.g. maybe decreased to 5 by somebody else, then this update will set the allocation to 12, instead of 5 + 2 \u003d 7. You have to apply the change instead of apply the end result.\n\nIn qos specific case, I think, three things can happen with an allocation while you are trying to update it here:\n\na) The whole allocation is deleted by Nova as the VM is deleted in parallel.\n\nb) The whole allocation is moved from one RP tree to another as the VM is migrated to another host in parallel\n\nc) The value of the specific BW allocation you are trying to update is changed in parallel. E.g A port is detached from the instance that allocated BW from the same device RP you try to update or a new port is attached to the VM that consumes BW from the same device RP you try to update here.\n\nAll three cases can happen between the port update request and  your first reading the allocation from placement here and also when you re-read the allocation after a generation conflict is encountered and you retry the loop.\n\nYou can detect a) by the fact that placement returns an empty allocation for a non exiting consumer. In this case I think you have to reject the qos update.\n\nstack@aio:/opt/stack/nova$ openstack --os-placement-api-version 1.28  resource provider allocation show nonexitent -f json\n[]\n\nIn case of b) you will detect the move by the fact that the rp_uuid you try to find in the allocation does not exists (as it is moved to another RP of another host). I think you have to either reject the qos update, or have to re-read your port data from the DB as the rp_uuid has been changed in the binding profile due to the move.\n\nIn case of c) you don\u0027t have to bail out but you have to (re-)apply your logic to the allocation you got from placement. E.g. you have to increase or decrease the new BW allocation. (Instead of blindly overwriting it)\n\nThere is a special case for c), when the port that you are handling here is the one that is being detached from the VM in parallel. I don\u0027t think you can easily detect that just by looking at the placement allocation as other non detached ports could consume from the same device RP. But also I\u0027m not sure if that can even happen from neutron perspective that a port is being updated from two different sources at the same time (e.g. port update by nova to unbound, and port update by the end user to update qos on the port)","commit_id":"6b2186dd9429db26b21cf8297f8008f2fa09d26f"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"d56b453fdaf183b7d7e2df0997f7b3268bf08d4a","unresolved":false,"context_lines":[{"line_number":762,"context_line":"        for i in range(GENERATION_CONFLICT_RETRIES):"},{"line_number":763,"context_line":"            body \u003d self.list_allocations(consumer_uuid)"},{"line_number":764,"context_line":"            # This way we keep the original consumer_generation and generation"},{"line_number":765,"context_line":"            body[\u0027allocations\u0027][rp_uuid][\u0027resources\u0027].update(allocations)"},{"line_number":766,"context_line":"            try:"},{"line_number":767,"context_line":"                # Update allocations has no return body, but leave the loop"},{"line_number":768,"context_line":"                return self._put(url, body)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_f6c77011","line":765,"range":{"start_line":765,"start_character":54,"end_line":765,"end_character":73},"in_reply_to":"bf51134e_980ccaed","updated":"2020-07-31 13:37:56.000000000","message":"Thanks Gibi for the detailed description, I come with new patch as soon as possible (locally it works already, but I have to clean it)","commit_id":"6b2186dd9429db26b21cf8297f8008f2fa09d26f"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"dfed300bd15af22777ec74fb65dbacc73abcdace","unresolved":false,"context_lines":[{"line_number":767,"context_line":"            # Count new min_kbps values based on the diff in alloc_diff"},{"line_number":768,"context_line":"            for drctn, min_kbps_diff in minbw_alloc_diff.items():"},{"line_number":769,"context_line":"                orig_kbps \u003d body[\u0027allocations\u0027][rp_uuid][\u0027resources\u0027][drctn]"},{"line_number":770,"context_line":"                new_kbps \u003d orig_kbps + min_kbps_diff"},{"line_number":771,"context_line":"                body[\u0027allocations\u0027][rp_uuid][\u0027resources\u0027][drctn] \u003d new_kbps"},{"line_number":772,"context_line":"            try:"},{"line_number":773,"context_line":"                # Update allocations has no return body, but leave the loop"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_7262fe0b","line":770,"range":{"start_line":770,"start_character":27,"end_line":770,"end_character":52},"updated":"2020-08-06 08:26:00.000000000","message":"yepp, this is what I wanted to see :)","commit_id":"f7f8c54d9878c994a2ccd43ed3b5f3832b5287f5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"dfed300bd15af22777ec74fb65dbacc73abcdace","unresolved":false,"context_lines":[{"line_number":775,"context_line":"            except ks_exc.Conflict as e:"},{"line_number":776,"context_line":"                if e.response.json()["},{"line_number":777,"context_line":"                        \u0027errors\u0027][0][\u0027code\u0027] \u003d\u003d \u0027placement.concurrent_update\u0027:"},{"line_number":778,"context_line":"                    continue"},{"line_number":779,"context_line":"                else:"},{"line_number":780,"context_line":"                    raise"},{"line_number":781,"context_line":"        raise n_exc.PlacementAllocationGenerationConflict("}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_92287297","line":778,"updated":"2020-08-06 08:26:00.000000000","message":"Wondering if we want to leave some breadcrumbs (i.e. debug log lines about the retry) for helping the troubleshooting.","commit_id":"f7f8c54d9878c994a2ccd43ed3b5f3832b5287f5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"dfed300bd15af22777ec74fb65dbacc73abcdace","unresolved":false,"context_lines":[{"line_number":791,"context_line":"        url \u003d \u0027/allocations/%s\u0027 % consumer_uuid"},{"line_number":792,"context_line":"        try:"},{"line_number":793,"context_line":"            self._put(url, allocations)"},{"line_number":794,"context_line":"        except ks_exc.Conflict:"},{"line_number":795,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_72795ec6","line":795,"range":{"start_line":794,"start_character":1,"end_line":795,"end_character":17},"updated":"2020-08-06 08:26:00.000000000","message":"This is unnecessary. Catching an re-raising is the same as simply not catching and letting it propagate up the callstack.","commit_id":"f7f8c54d9878c994a2ccd43ed3b5f3832b5287f5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"c2725a78676c4b8fcef33c21abe9a4f2d745c84f","unresolved":false,"context_lines":[{"line_number":791,"context_line":"        url \u003d \u0027/allocations/%s\u0027 % consumer_uuid"},{"line_number":792,"context_line":"        try:"},{"line_number":793,"context_line":"            self._put(url, allocations)"},{"line_number":794,"context_line":"        except ks_exc.Conflict:"},{"line_number":795,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_eddf3a0a","line":795,"range":{"start_line":794,"start_character":1,"end_line":795,"end_character":17},"in_reply_to":"9f560f44_72795ec6","updated":"2020-08-07 09:49:17.000000000","message":"Done","commit_id":"f7f8c54d9878c994a2ccd43ed3b5f3832b5287f5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3528b0cc0294eafcc0354d1df775ff508ecec9f8","unresolved":false,"context_lines":[{"line_number":757,"context_line":"        :param rp_uuid: uuid of the resource provider for which the"},{"line_number":758,"context_line":"                        allocations are to be updated."},{"line_number":759,"context_line":"        \"\"\""},{"line_number":760,"context_line":"        for i in range(GENERATION_CONFLICT_RETRIES):"},{"line_number":761,"context_line":"            body \u003d self.list_allocations(consumer_uuid)"},{"line_number":762,"context_line":"            if not body[\u0027allocations\u0027]:"},{"line_number":763,"context_line":"                raise n_exc.PlacementAllocationRemoved(consumer\u003dconsumer_uuid)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f560f44_08cfafb0","line":760,"updated":"2020-08-31 13:17:52.000000000","message":"nit, out of context: we \"really\" need a restfull call to \"update\" (increase/decrease) an allocation, instead of reading the current value and sending the updated one.\n\nWith a restfull (and atomic) operation, you don\u0027t need to worry about having a possible update conflict.","commit_id":"01cea64276835e2454f87c93fdad67b37e7cff82"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6fdea36b2f83908632f8cb507ff033a162a7615b","unresolved":false,"context_lines":[{"line_number":777,"context_line":"                        \u0027errors\u0027][0][\u0027code\u0027] \u003d\u003d \u0027placement.concurrent_update\u0027:"},{"line_number":778,"context_line":"                    continue"},{"line_number":779,"context_line":"                else:"},{"line_number":780,"context_line":"                    raise"},{"line_number":781,"context_line":"        raise n_exc.PlacementAllocationGenerationConflict("},{"line_number":782,"context_line":"            consumer\u003dconsumer_uuid)"},{"line_number":783,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9f560f44_2f712277","line":780,"updated":"2020-08-07 15:09:19.000000000","message":"At this point we can assume that there was not enough inventory for the request. I guess upper layers will handle this case.","commit_id":"01cea64276835e2454f87c93fdad67b37e7cff82"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"61940527e64468cd3b01749704da51122caea3c6","unresolved":false,"context_lines":[{"line_number":777,"context_line":"                        \u0027errors\u0027][0][\u0027code\u0027] \u003d\u003d \u0027placement.concurrent_update\u0027:"},{"line_number":778,"context_line":"                    continue"},{"line_number":779,"context_line":"                else:"},{"line_number":780,"context_line":"                    raise"},{"line_number":781,"context_line":"        raise n_exc.PlacementAllocationGenerationConflict("},{"line_number":782,"context_line":"            consumer\u003dconsumer_uuid)"},{"line_number":783,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9f560f44_248b3268","line":780,"in_reply_to":"9f560f44_2f712277","updated":"2020-08-24 10:10:04.000000000","message":"yes, that part will be in neutron side code","commit_id":"01cea64276835e2454f87c93fdad67b37e7cff82"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"426d15d2748c4e999534aaf177b41e172cabd45a","unresolved":false,"context_lines":[{"line_number":773,"context_line":"                # Update allocations has no return body, but leave the loop"},{"line_number":774,"context_line":"                return self.update_allocation(consumer_uuid, body)"},{"line_number":775,"context_line":"            except ks_exc.Conflict as e:"},{"line_number":776,"context_line":"                if e.response.json()["},{"line_number":777,"context_line":"                        \u0027errors\u0027][0][\u0027code\u0027] \u003d\u003d \u0027placement.concurrent_update\u0027:"},{"line_number":778,"context_line":"                    continue"},{"line_number":779,"context_line":"                else:"},{"line_number":780,"context_line":"                    raise"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_476f95c4","line":777,"range":{"start_line":776,"start_character":19,"end_line":777,"end_character":44},"updated":"2020-09-03 16:01:22.000000000","message":"super nit: This kind of new lines is tricky. Perhaps we can assign a variable and then use it in the if clause. Of course it is not a blcoker.","commit_id":"45f166cb8cc757be855a64dacf115290e09cfc5d"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"27050d45a9d5064bfd623c9c451d8fbb589424d3","unresolved":false,"context_lines":[{"line_number":773,"context_line":"                # Update allocations has no return body, but leave the loop"},{"line_number":774,"context_line":"                return self.update_allocation(consumer_uuid, body)"},{"line_number":775,"context_line":"            except ks_exc.Conflict as e:"},{"line_number":776,"context_line":"                if e.response.json()["},{"line_number":777,"context_line":"                        \u0027errors\u0027][0][\u0027code\u0027] \u003d\u003d \u0027placement.concurrent_update\u0027:"},{"line_number":778,"context_line":"                    continue"},{"line_number":779,"context_line":"                else:"},{"line_number":780,"context_line":"                    raise"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f560f44_53a47308","line":777,"range":{"start_line":776,"start_character":19,"end_line":777,"end_character":44},"in_reply_to":"9f560f44_476f95c4","updated":"2020-09-03 20:09:55.000000000","message":"Done","commit_id":"45f166cb8cc757be855a64dacf115290e09cfc5d"}],"neutron_lib/tests/unit/placement/test_client.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"dfed300bd15af22777ec74fb65dbacc73abcdace","unresolved":false,"context_lines":[{"line_number":712,"context_line":"                RESOURCE_PROVIDER_UUID: {\u0027resources\u0027: {\u0027a\u0027: 10}}"},{"line_number":713,"context_line":"            }"},{"line_number":714,"context_line":"        }"},{"line_number":715,"context_line":"        self.placement_fixture.mock_get.side_effect \u003d [mock_rsp]"},{"line_number":716,"context_line":"        self.placement_api_client.update_allocation("},{"line_number":717,"context_line":"            CONSUMER_UUID,"},{"line_number":718,"context_line":"            {\u0027allocations\u0027: {"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_92019209","line":715,"range":{"start_line":715,"start_character":40,"end_line":715,"end_character":64},"updated":"2020-08-06 08:26:00.000000000","message":"ohh, is this side_effect with a single response instead of a return_value to assert that there is only one call to the mock? Clever.","commit_id":"f7f8c54d9878c994a2ccd43ed3b5f3832b5287f5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"dfed300bd15af22777ec74fb65dbacc73abcdace","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"9f560f44_3556b007","line":814,"updated":"2020-08-06 08:26:00.000000000","message":"You are missing test for the logic that update_qos_minbw_allocation adds the diff to the original allocation instead of overwriting it.","commit_id":"f7f8c54d9878c994a2ccd43ed3b5f3832b5287f5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"c2725a78676c4b8fcef33c21abe9a4f2d745c84f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"9f560f44_4dce265a","line":814,"in_reply_to":"9f560f44_3556b007","updated":"2020-08-07 09:49:17.000000000","message":"Thanks, I added","commit_id":"f7f8c54d9878c994a2ccd43ed3b5f3832b5287f5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3528b0cc0294eafcc0354d1df775ff508ecec9f8","unresolved":false,"context_lines":[{"line_number":700,"context_line":"        )"},{"line_number":701,"context_line":"        self.assertEqual(1, self.placement_fixture.mock_put.call_count)"},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"    def test_list_allocations(self):"},{"line_number":704,"context_line":"        self.placement_api_client.list_allocations(CONSUMER_UUID)"},{"line_number":705,"context_line":"        self.placement_fixture.mock_get.assert_called_once_with("},{"line_number":706,"context_line":"            \u0027/allocations/%s\u0027 % CONSUMER_UUID)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f560f44_6848eb2d","line":703,"updated":"2020-08-31 13:17:52.000000000","message":"good list of tests!!","commit_id":"01cea64276835e2454f87c93fdad67b37e7cff82"}],"releasenotes/notes/allocations_api-1ae5fd78c83353df.yaml":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3528b0cc0294eafcc0354d1df775ff508ecec9f8","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":"    - Bump ``PlacementAPIClient\u0027s`` max supported microversion to ``1.28``,"},{"line_number":5,"context_line":"      as from that version ``allocations`` API handles generations in a general"},{"line_number":6,"context_line":"      way."},{"line_number":7,"context_line":"    - Add ``list_allocations`` and ``update_allocation`` methods."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"9f560f44_e834fbae","line":4,"range":{"start_line":4,"start_character":11,"end_line":4,"end_character":35},"updated":"2020-08-31 13:17:52.000000000","message":"are those quotes correct here?","commit_id":"01cea64276835e2454f87c93fdad67b37e7cff82"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"023939ee58809c8226b750336f7d07f16f1d7eb5","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":"    - Bump ``PlacementAPIClient\u0027s`` max supported microversion to ``1.28``,"},{"line_number":5,"context_line":"      as from that version ``allocations`` API handles generations in a general"},{"line_number":6,"context_line":"      way."},{"line_number":7,"context_line":"    - Add ``list_allocations`` and ``update_allocation`` methods."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"9f560f44_dbe387a3","line":4,"range":{"start_line":4,"start_character":11,"end_line":4,"end_character":35},"in_reply_to":"9f560f44_e834fbae","updated":"2020-09-03 10:27:31.000000000","message":"as I see the rendered release notes it is correct","commit_id":"01cea64276835e2454f87c93fdad67b37e7cff82"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"87bb2a8a66690be3bb9444739b5e07ba86e76572","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    - Bump ``PlacementAPIClient\u0027s`` max supported microversion to ``1.28``,"},{"line_number":5,"context_line":"      as from that version ``allocations`` API handles generations in a general"},{"line_number":6,"context_line":"      way."},{"line_number":7,"context_line":"    - Add ``list_allocations`` and ``update_allocation`` methods."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"9f560f44_552aa02b","line":7,"updated":"2020-09-03 14:20:43.000000000","message":"And there was a qos method added as well.","commit_id":"737b2c34acba480fb41e44c58e937bcf463f56a0"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"97cb50b6edc6db6c43ca256a001bf0445d43ccb4","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    - Bump ``PlacementAPIClient\u0027s`` max supported microversion to ``1.28``,"},{"line_number":5,"context_line":"      as from that version ``allocations`` API handles generations in a general"},{"line_number":6,"context_line":"      way."},{"line_number":7,"context_line":"    - Add ``list_allocations`` and ``update_allocation`` methods."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"9f560f44_a7fcb1b5","line":7,"updated":"2020-09-03 16:13:00.000000000","message":"I had a comment in the last PS for this that also applies to the commit message - update_qos_minbw_allocation method was also added to the client.","commit_id":"45f166cb8cc757be855a64dacf115290e09cfc5d"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"27050d45a9d5064bfd623c9c451d8fbb589424d3","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    - Bump ``PlacementAPIClient\u0027s`` max supported microversion to ``1.28``,"},{"line_number":5,"context_line":"      as from that version ``allocations`` API handles generations in a general"},{"line_number":6,"context_line":"      way."},{"line_number":7,"context_line":"    - Add ``list_allocations`` and ``update_allocation`` methods."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"9f560f44_d3908398","line":7,"in_reply_to":"9f560f44_a7fcb1b5","updated":"2020-09-03 20:09:55.000000000","message":"Done","commit_id":"45f166cb8cc757be855a64dacf115290e09cfc5d"}]}
