)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5ebf3f9842f3a2b51042e0063d9dd723ef5bd64d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"ab6dcb11_2a99e17a","updated":"2023-05-22 17:23:56.000000000","message":"Don\u0027t we want/need a reno for this? AFAICT, this is an (intentional) change to the behavior of unshelve in certain circumstances, right? I would think that\u0027s worth signaling. TBH, it kinda feels like it needs a microversion, even though I know that would kinda suck. Presumably the argument against that is that we need to close the loophole because people could maybe legitimately massively oversubscribe themselves (once) with a bunch of create, shelve and then a bunch of unshelves?","commit_id":"c72d33d359a937711de7c29ec9568a0a577e02c9"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d6ab266f1ac174818d5d12b337a16ca6972950bd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"d726f57c_b6a3b364","updated":"2023-05-22 19:50:13.000000000","message":"Need to add a reno and try and improve some style things.","commit_id":"c72d33d359a937711de7c29ec9568a0a577e02c9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6b4f2e5a3a71be31a83e844bd132a7c0120d0820","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"75a17fb5_6a196e5f","in_reply_to":"1cc64ad7_d8cff64a","updated":"2023-05-22 19:41:09.000000000","message":"No, I get that this how it was supposed to be. My point is, it\u0027s been *not* this way for quite a while, so it just seems like it\u0027s worth mentioning that it\u0027s been a bug but is now fixed. I feel like it\u0027s one of those things where users will complain to admins that they used to be able to unshelve and now can\u0027t and the operators would like to be able to find some easy bullet point reason and then be able to explain that it\u0027s a change. AFAIK, that\u0027s kinda the point of our \u0027fixes\u0027 section right? For fixes that are likely to be quite visible or impactful...","commit_id":"c72d33d359a937711de7c29ec9568a0a577e02c9"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d6ab266f1ac174818d5d12b337a16ca6972950bd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"0a1231ea_71194d08","in_reply_to":"75a17fb5_6a196e5f","updated":"2023-05-22 19:50:13.000000000","message":"Oh, I was thinking of a feature release note. I\u0027m so rarely in a situation appropriate for a Fixes reno, I forget about it.\n\nI agree a Fixes note is a good idea.","commit_id":"c72d33d359a937711de7c29ec9568a0a577e02c9"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7a7f5d75843730b3f4fd88776d054a37fff02cd9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"1cc64ad7_d8cff64a","in_reply_to":"ab6dcb11_2a99e17a","updated":"2023-05-22 19:21:55.000000000","message":"There was a release note for it back when counting from placement was added:\n\nhttps://docs.openstack.org/releasenotes/nova/train.html#relnotes-20-0-0-stable-train-upgrade-notes\n\nbut ... I think it\u0027s my fault for the commit message summary here making it sound like this is new. I guess it is new technically but it was a bug that it wasn\u0027t working as documented in the reno and docs.\n\nThere\u0027s other behavior changes mentioned in the Train reno as well and the content from the reno was also included in the docs here:\n\nhttps://docs.openstack.org/nova/latest/admin/quotas.html#quota-usage-from-placement","commit_id":"c72d33d359a937711de7c29ec9568a0a577e02c9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3ccf8ede25af0081a44104fdf50cb28749831841","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"7b07e143_398de58d","updated":"2023-05-29 17:01:03.000000000","message":"recheck TestServerVolumeAttachScenarioOldVersion fail to connect to metadata","commit_id":"6f79d6321e7c3edaab2eb911198b7b7f851371b3"}],"nova/api/openstack/compute/shelve.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7a07b038875fddd03fef6b310362222a0c500714","unresolved":true,"context_lines":[{"line_number":143,"context_line":"        ) as e:"},{"line_number":144,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de.format_message())"},{"line_number":145,"context_line":"        except exception.OverQuota as e:"},{"line_number":146,"context_line":"            raise exc.HTTPForbidden(explanation\u003de.format_message())"}],"source_content_type":"text/x-python","patch_set":4,"id":"dff18198_7d03e78c","line":146,"range":{"start_line":146,"start_character":22,"end_line":146,"end_character":35},"updated":"2023-05-29 12:02:57.000000000","message":"i would gone with 409 personally but i can see where you are coming form with 403","commit_id":"6f79d6321e7c3edaab2eb911198b7b7f851371b3"}],"nova/compute/api.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6b4f2e5a3a71be31a83e844bd132a7c0120d0820","unresolved":false,"context_lines":[{"line_number":4553,"context_line":"        # Do the same for unified limits."},{"line_number":4554,"context_line":"        placement_limits.enforce_num_instances_and_flavor("},{"line_number":4555,"context_line":"            context, context.project_id, instance.flavor, request_spec.is_bfv,"},{"line_number":4556,"context_line":"            0, 0, delta_updates\u003d{\u0027servers\u0027: 0})"},{"line_number":4557,"context_line":""},{"line_number":4558,"context_line":"    @block_extended_resource_request"},{"line_number":4559,"context_line":"    @check_instance_lock"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ca9deca_36cd6bef","line":4556,"range":{"start_line":4556,"start_character":18,"end_line":4556,"end_character":46},"updated":"2023-05-22 19:41:09.000000000","message":"ack, here.","commit_id":"c72d33d359a937711de7c29ec9568a0a577e02c9"}],"nova/conductor/manager.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5ebf3f9842f3a2b51042e0063d9dd723ef5bd64d","unresolved":true,"context_lines":[{"line_number":1100,"context_line":"                            CONF.quota.count_usage_from_placement or"},{"line_number":1101,"context_line":"                            limit_utils.use_unified_limits()"},{"line_number":1102,"context_line":"                        ):"},{"line_number":1103,"context_line":"                            self._recheck_quota("},{"line_number":1104,"context_line":"                                context, instance.flavor, request_spec, 0,"},{"line_number":1105,"context_line":"                                project_id\u003dinstance.project_id,"},{"line_number":1106,"context_line":"                                user_id\u003dinstance.user_id"}],"source_content_type":"text/x-python","patch_set":3,"id":"4876b6b7_e15344aa","line":1103,"updated":"2023-05-22 17:23:56.000000000","message":"This will only do its thing if recheck_quota\u003dTrue, but for the shelve case you always want to run that don\u0027t you?","commit_id":"c72d33d359a937711de7c29ec9568a0a577e02c9"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7a7f5d75843730b3f4fd88776d054a37fff02cd9","unresolved":true,"context_lines":[{"line_number":1100,"context_line":"                            CONF.quota.count_usage_from_placement or"},{"line_number":1101,"context_line":"                            limit_utils.use_unified_limits()"},{"line_number":1102,"context_line":"                        ):"},{"line_number":1103,"context_line":"                            self._recheck_quota("},{"line_number":1104,"context_line":"                                context, instance.flavor, request_spec, 0,"},{"line_number":1105,"context_line":"                                project_id\u003dinstance.project_id,"},{"line_number":1106,"context_line":"                                user_id\u003dinstance.user_id"}],"source_content_type":"text/x-python","patch_set":3,"id":"4fc7f036_374175be","line":1103,"in_reply_to":"4876b6b7_e15344aa","updated":"2023-05-22 19:21:55.000000000","message":"Yeah, the first quota check is in compute/api and if recheck_quota\u003dTrue there will also be a check in conductor after resources are allocated. So if you have recheck_quota\u003dFalse, you won\u0027t have a check in conductor at all. It\u0027s the same as for schedule_and_build_instances.","commit_id":"c72d33d359a937711de7c29ec9568a0a577e02c9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6b4f2e5a3a71be31a83e844bd132a7c0120d0820","unresolved":false,"context_lines":[{"line_number":1100,"context_line":"                            CONF.quota.count_usage_from_placement or"},{"line_number":1101,"context_line":"                            limit_utils.use_unified_limits()"},{"line_number":1102,"context_line":"                        ):"},{"line_number":1103,"context_line":"                            self._recheck_quota("},{"line_number":1104,"context_line":"                                context, instance.flavor, request_spec, 0,"},{"line_number":1105,"context_line":"                                project_id\u003dinstance.project_id,"},{"line_number":1106,"context_line":"                                user_id\u003dinstance.user_id"}],"source_content_type":"text/x-python","patch_set":3,"id":"1aa64a3e_3a332f3e","line":1103,"in_reply_to":"4fc7f036_374175be","updated":"2023-05-22 19:41:09.000000000","message":"Oh right of course. I guess I read L1094 first and then had it in my head that this was the primary check for unshelve.","commit_id":"c72d33d359a937711de7c29ec9568a0a577e02c9"}],"nova/limit/placement.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5ebf3f9842f3a2b51042e0063d9dd723ef5bd64d","unresolved":true,"context_lines":[{"line_number":156,"context_line":"    is_bfvm: bool,"},{"line_number":157,"context_line":"    min_count: int,"},{"line_number":158,"context_line":"    max_count: int,"},{"line_number":159,"context_line":"    enforcer: ty.Optional[limit.Enforcer] \u003d None,"},{"line_number":160,"context_line":"    delta_updates: ty.Optional[ty.Dict[str, int]] \u003d None,"},{"line_number":161,"context_line":") -\u003e int:"},{"line_number":162,"context_line":"    \"\"\"Return max instances possible, else raise TooManyInstances exception.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"c276d7b4_eb2283e0","line":159,"updated":"2023-05-22 17:23:56.000000000","message":"Am I missing where you need to use this?","commit_id":"c72d33d359a937711de7c29ec9568a0a577e02c9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6b4f2e5a3a71be31a83e844bd132a7c0120d0820","unresolved":false,"context_lines":[{"line_number":156,"context_line":"    is_bfvm: bool,"},{"line_number":157,"context_line":"    min_count: int,"},{"line_number":158,"context_line":"    max_count: int,"},{"line_number":159,"context_line":"    enforcer: ty.Optional[limit.Enforcer] \u003d None,"},{"line_number":160,"context_line":"    delta_updates: ty.Optional[ty.Dict[str, int]] \u003d None,"},{"line_number":161,"context_line":") -\u003e int:"},{"line_number":162,"context_line":"    \"\"\"Return max instances possible, else raise TooManyInstances exception.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"17f44df7_0747b15d","line":159,"in_reply_to":"683f052b_8f8ad401","updated":"2023-05-22 19:41:09.000000000","message":"Sorry, I was interpreting the changed line as an added line, so I was looking for another added line that passed this.","commit_id":"c72d33d359a937711de7c29ec9568a0a577e02c9"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7a7f5d75843730b3f4fd88776d054a37fff02cd9","unresolved":true,"context_lines":[{"line_number":156,"context_line":"    is_bfvm: bool,"},{"line_number":157,"context_line":"    min_count: int,"},{"line_number":158,"context_line":"    max_count: int,"},{"line_number":159,"context_line":"    enforcer: ty.Optional[limit.Enforcer] \u003d None,"},{"line_number":160,"context_line":"    delta_updates: ty.Optional[ty.Dict[str, int]] \u003d None,"},{"line_number":161,"context_line":") -\u003e int:"},{"line_number":162,"context_line":"    \"\"\"Return max instances possible, else raise TooManyInstances exception.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"683f052b_8f8ad401","line":159,"in_reply_to":"c276d7b4_eb2283e0","updated":"2023-05-22 19:21:55.000000000","message":"This one is used here:\n\nhttps://review.opendev.org/c/openstack/nova/+/872471/3/nova/limit/placement.py#187","commit_id":"c72d33d359a937711de7c29ec9568a0a577e02c9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5ebf3f9842f3a2b51042e0063d9dd723ef5bd64d","unresolved":true,"context_lines":[{"line_number":157,"context_line":"    min_count: int,"},{"line_number":158,"context_line":"    max_count: int,"},{"line_number":159,"context_line":"    enforcer: ty.Optional[limit.Enforcer] \u003d None,"},{"line_number":160,"context_line":"    delta_updates: ty.Optional[ty.Dict[str, int]] \u003d None,"},{"line_number":161,"context_line":") -\u003e int:"},{"line_number":162,"context_line":"    \"\"\"Return max instances possible, else raise TooManyInstances exception.\"\"\""},{"line_number":163,"context_line":"    if not limit_utils.use_unified_limits():"}],"source_content_type":"text/x-python","patch_set":3,"id":"85a04197_0ac8d7a2","line":160,"updated":"2023-05-22 17:23:56.000000000","message":"Hmm, and this too.. I must be missing it.","commit_id":"c72d33d359a937711de7c29ec9568a0a577e02c9"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7a7f5d75843730b3f4fd88776d054a37fff02cd9","unresolved":true,"context_lines":[{"line_number":157,"context_line":"    min_count: int,"},{"line_number":158,"context_line":"    max_count: int,"},{"line_number":159,"context_line":"    enforcer: ty.Optional[limit.Enforcer] \u003d None,"},{"line_number":160,"context_line":"    delta_updates: ty.Optional[ty.Dict[str, int]] \u003d None,"},{"line_number":161,"context_line":") -\u003e int:"},{"line_number":162,"context_line":"    \"\"\"Return max instances possible, else raise TooManyInstances exception.\"\"\""},{"line_number":163,"context_line":"    if not limit_utils.use_unified_limits():"}],"source_content_type":"text/x-python","patch_set":3,"id":"a6b86124_36f74031","line":160,"in_reply_to":"85a04197_0ac8d7a2","updated":"2023-05-22 19:21:55.000000000","message":"This one is used here:\n\nhttps://review.opendev.org/c/openstack/nova/+/872471/3/nova/compute/api.py#4556","commit_id":"c72d33d359a937711de7c29ec9568a0a577e02c9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6b4f2e5a3a71be31a83e844bd132a7c0120d0820","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    min_count: int,"},{"line_number":158,"context_line":"    max_count: int,"},{"line_number":159,"context_line":"    enforcer: ty.Optional[limit.Enforcer] \u003d None,"},{"line_number":160,"context_line":"    delta_updates: ty.Optional[ty.Dict[str, int]] \u003d None,"},{"line_number":161,"context_line":") -\u003e int:"},{"line_number":162,"context_line":"    \"\"\"Return max instances possible, else raise TooManyInstances exception.\"\"\""},{"line_number":163,"context_line":"    if not limit_utils.use_unified_limits():"}],"source_content_type":"text/x-python","patch_set":3,"id":"55629fca_e56407cb","line":160,"in_reply_to":"a6b86124_36f74031","updated":"2023-05-22 19:41:09.000000000","message":"I see now. I was looking for a use of enforcer and delta_updates (thinking the former was also new, since I can\u0027t read) and thus didn\u0027t look very hard for this second one.","commit_id":"c72d33d359a937711de7c29ec9568a0a577e02c9"}]}
