)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"da6614f2359499b4269deb8193ca07241916631c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"d847da40_a33afa09","updated":"2021-12-15 11:38:25.000000000","message":"This feels like something that would probably warrant a release note? It\u0027s a change in behavior, and while users shouldn\u0027t have to opt into non-broken behavior (i.e. no microversion), it\u0027s something that they might run into (see: Tempest) and that we should therefore document _somewhere_. The -1 is for this.\n\nAlso, we have docs on AZs both in the main docs and the api-ref. Is it worth adding a limitation section to one or the other to indicate the kinds of things you *can\u0027t* do with AZs? This could be a follow-up if you prefer.","commit_id":"6ba0f5383a7e8b4abc53df2722ea9f068c522fc1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3d74293b2be6b36a8c82b4b7d0a4ef8269f9956a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"8a635689_da60dd13","updated":"2021-12-13 09:31:18.000000000","message":"We hit a problem. Tempest actually has test cases where we move hosts around AZs having instances and those test cases now failing with the rejection I added. So probably we have bad tempest test cases, or we have parallel test cases interfering.","commit_id":"6ba0f5383a7e8b4abc53df2722ea9f068c522fc1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"164c4b666cd94e1b30f65526e87de74fb3da2c53","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"23e9136a_c0c9ee59","updated":"2021-12-13 17:32:01.000000000","message":"we are still discussing how to fix the tempest tests for this. But from API change point of view, even there is change in API return code but that is valid bug fix for server stuck with other AZ than what their host is in. So I agree to fix this as bug fix and does not require microversion bump..","commit_id":"6ba0f5383a7e8b4abc53df2722ea9f068c522fc1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"77ae783649e933a81a133f519fc8f65d46a308f7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"9654515c_a9ccc7eb","in_reply_to":"d847da40_a33afa09","updated":"2022-01-14 16:53:00.000000000","message":"I\u0027ve added a reno and updated the docs","commit_id":"6ba0f5383a7e8b4abc53df2722ea9f068c522fc1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9bf357cf2b78e08df7c845848e2677fe59c3d072","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6a816901_b3af0b4c","updated":"2022-02-14 10:14:15.000000000","message":"Actually, missed the whitespace in the release note. If you can fix that, I\u0027m +2","commit_id":"6111b73447ef1e188a075f99f0f6530003210a4b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"44ba0543fa764fffb072ca9ebe7f0db3801ddc38","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"48bc9676_ae93fd58","updated":"2022-01-15 08:40:47.000000000","message":"One AZ tests is still failing ","commit_id":"6111b73447ef1e188a075f99f0f6530003210a4b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"38b58f4c3ed6e2ca2f7f71eb466aec57d3137056","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8529f001_9ee834a1","updated":"2022-02-10 17:31:14.000000000","message":"recheck","commit_id":"6111b73447ef1e188a075f99f0f6530003210a4b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4706726863a40a1fdfc7da4f95bb0f5fc8289803","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"be97211f_c1ba15f0","updated":"2022-01-17 13:48:38.000000000","message":"recheck updated the tempest patches","commit_id":"6111b73447ef1e188a075f99f0f6530003210a4b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"abe3604a54077576a634bfc6152695cd0b774d75","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"7ed3586f_ed50a7e7","updated":"2022-06-03 08:03:49.000000000","message":"recheck [    4.456397] ---[ end Kernel panic - not syncing: IO-APIC + timer doesn\u0027t work!  Boot with apic\u003ddebug and send a report.  Then try booting with the \u0027noapic\u0027 option. ]---\n","commit_id":"459658ee78990f358a2e866c0837bcb35ebed426"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"041c652d774ba50b881436924f5d2c49b346a7e8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"fe0f8933_69aad48e","updated":"2023-01-17 00:42:42.000000000","message":"recheck connection timeout in volume attached test ","commit_id":"459658ee78990f358a2e866c0837bcb35ebed426"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"63ee749a1afa0b61bcf0c03d47840fad59a846c6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"a1b8a054_01cb1edc","updated":"2023-02-07 09:44:23.000000000","message":"recheck tempest dependency has been merged this is ready to go now","commit_id":"459658ee78990f358a2e866c0837bcb35ebed426"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e85c57a9bb87d405d880c4274761175651702ff1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"819cf5dd_2b19a326","updated":"2023-01-16 12:12:17.000000000","message":"recheck validate if latest tempest change still works","commit_id":"459658ee78990f358a2e866c0837bcb35ebed426"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"01314d5a3755dee283e115062f238d2367739b42","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"2471662e_f998f395","updated":"2023-01-16 18:55:42.000000000","message":"the functional test failure is not related to the code and it passed on py310 anyway\n\ni think this might be memory related btu basically there is a db error.\n\nit shoudl be using sqlite3 i think in this case so we dont have an external db but im wondiign if the exceeivne rpc logs is causing nay issues or what in the env could have cause the sqlachemy error.\n\nim going to hold recheckign for now since we need to wait for tempest anyway","commit_id":"459658ee78990f358a2e866c0837bcb35ebed426"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8be0cb8528652c84735f8502060358523a771268","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"88d38f57_3af5740a","in_reply_to":"fe0f8933_69aad48e","updated":"2023-01-17 00:43:35.000000000","message":"ah, wanted to do this on tempest patch but mistakenly did here.","commit_id":"459658ee78990f358a2e866c0837bcb35ebed426"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c02bf41ebda5fe9ea040ba3a7e0176de590a2f8b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"01111cea_7ed3c160","updated":"2024-05-03 06:55:28.000000000","message":"recheck tempest job timeout","commit_id":"a0506570b340e1cdc3395daa5e7fe3246e79c3d8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b51e3aacbd5fbb757341e6f249f5a93c41a43a7b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"ef635b99_c0f342c6","updated":"2024-05-08 15:14:17.000000000","message":"Assuming CI is happy, this is *long* overdue.","commit_id":"3c0eadae0b9ec48586087ea6c0c4e9176f0aa3bc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f5feb5220334dec5d27ddb7df45e300d179c013a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"6c9b5c17_1b7a7b45","updated":"2024-05-09 15:52:13.000000000","message":"recheck","commit_id":"3c0eadae0b9ec48586087ea6c0c4e9176f0aa3bc"}],"nova/compute/api.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"da6614f2359499b4269deb8193ca07241916631c","unresolved":true,"context_lines":[{"line_number":6422,"context_line":"        if old_az !\u003d new_az:"},{"line_number":6423,"context_line":"            msg \u003d _("},{"line_number":6424,"context_line":"                \"The host cannot be added to the aggregate as the \""},{"line_number":6425,"context_line":"                \"availability zone of the host would change from %s to %s but \""},{"line_number":6426,"context_line":"                \"the host already has %d instances. Changing the AZ of an \""},{"line_number":6427,"context_line":"                \"existing instance is not supported\""},{"line_number":6428,"context_line":"            ) % (old_az, new_az, len(instances))"}],"source_content_type":"text/x-python","patch_set":1,"id":"43335f19_ba3656a9","line":6425,"range":{"start_line":6425,"start_character":65,"end_line":6425,"end_character":67},"updated":"2021-12-15 11:38:25.000000000","message":"nit: Should we quote this? Can AZ names contain spaces?","commit_id":"6ba0f5383a7e8b4abc53df2722ea9f068c522fc1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"044171fbd0a391dfcd2688e701ce3540d53e6fbe","unresolved":false,"context_lines":[{"line_number":6422,"context_line":"        if old_az !\u003d new_az:"},{"line_number":6423,"context_line":"            msg \u003d _("},{"line_number":6424,"context_line":"                \"The host cannot be added to the aggregate as the \""},{"line_number":6425,"context_line":"                \"availability zone of the host would change from %s to %s but \""},{"line_number":6426,"context_line":"                \"the host already has %d instances. Changing the AZ of an \""},{"line_number":6427,"context_line":"                \"existing instance is not supported\""},{"line_number":6428,"context_line":"            ) % (old_az, new_az, len(instances))"}],"source_content_type":"text/x-python","patch_set":1,"id":"f7138ef1_6b07b61e","line":6425,"range":{"start_line":6425,"start_character":65,"end_line":6425,"end_character":67},"in_reply_to":"43335f19_ba3656a9","updated":"2022-01-14 16:52:04.000000000","message":"Done","commit_id":"6ba0f5383a7e8b4abc53df2722ea9f068c522fc1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"da6614f2359499b4269deb8193ca07241916631c","unresolved":true,"context_lines":[{"line_number":6423,"context_line":"            msg \u003d _("},{"line_number":6424,"context_line":"                \"The host cannot be added to the aggregate as the \""},{"line_number":6425,"context_line":"                \"availability zone of the host would change from %s to %s but \""},{"line_number":6426,"context_line":"                \"the host already has %d instances. Changing the AZ of an \""},{"line_number":6427,"context_line":"                \"existing instance is not supported\""},{"line_number":6428,"context_line":"            ) % (old_az, new_az, len(instances))"},{"line_number":6429,"context_line":"            self._raise_invalid_aggregate_exc("}],"source_content_type":"text/x-python","patch_set":1,"id":"759f4800_31845fb1","line":6426,"range":{"start_line":6426,"start_character":41,"end_line":6426,"end_character":50},"updated":"2021-12-15 11:38:25.000000000","message":"nit: instance(s)","commit_id":"6ba0f5383a7e8b4abc53df2722ea9f068c522fc1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"044171fbd0a391dfcd2688e701ce3540d53e6fbe","unresolved":false,"context_lines":[{"line_number":6423,"context_line":"            msg \u003d _("},{"line_number":6424,"context_line":"                \"The host cannot be added to the aggregate as the \""},{"line_number":6425,"context_line":"                \"availability zone of the host would change from %s to %s but \""},{"line_number":6426,"context_line":"                \"the host already has %d instances. Changing the AZ of an \""},{"line_number":6427,"context_line":"                \"existing instance is not supported\""},{"line_number":6428,"context_line":"            ) % (old_az, new_az, len(instances))"},{"line_number":6429,"context_line":"            self._raise_invalid_aggregate_exc("}],"source_content_type":"text/x-python","patch_set":1,"id":"4a64f6f5_b8fe66f3","line":6426,"range":{"start_line":6426,"start_character":41,"end_line":6426,"end_character":50},"in_reply_to":"759f4800_31845fb1","updated":"2022-01-14 16:52:04.000000000","message":"Done","commit_id":"6ba0f5383a7e8b4abc53df2722ea9f068c522fc1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bcca77f47ab3bb27ad2bb6e900b423c5915b9c41","unresolved":true,"context_lines":[{"line_number":6455,"context_line":"            action\u003dfields_obj.NotificationAction.ADD_HOST,"},{"line_number":6456,"context_line":"            phase\u003dfields_obj.NotificationPhase.START)"},{"line_number":6457,"context_line":""},{"line_number":6458,"context_line":"        self.is_safe_to_update_az(context, aggregate.metadata,"},{"line_number":6459,"context_line":"                                  hosts\u003d[host_name], aggregate\u003daggregate)"},{"line_number":6460,"context_line":"        self.ensure_no_instances_need_to_move_az_when_host_added("},{"line_number":6461,"context_line":"            context, aggregate, host_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"c7759da1_22482ac6","line":6458,"updated":"2021-12-13 17:50:15.000000000","message":"is_safe_to_update_az was actully ment to check adding and removing hosts form the host aggreate too.\nthat is why this check exists in this function to begin with.","commit_id":"6ba0f5383a7e8b4abc53df2722ea9f068c522fc1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"044171fbd0a391dfcd2688e701ce3540d53e6fbe","unresolved":false,"context_lines":[{"line_number":6455,"context_line":"            action\u003dfields_obj.NotificationAction.ADD_HOST,"},{"line_number":6456,"context_line":"            phase\u003dfields_obj.NotificationPhase.START)"},{"line_number":6457,"context_line":""},{"line_number":6458,"context_line":"        self.is_safe_to_update_az(context, aggregate.metadata,"},{"line_number":6459,"context_line":"                                  hosts\u003d[host_name], aggregate\u003daggregate)"},{"line_number":6460,"context_line":"        self.ensure_no_instances_need_to_move_az_when_host_added("},{"line_number":6461,"context_line":"            context, aggregate, host_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"4a956636_24950076","line":6458,"in_reply_to":"c7759da1_22482ac6","updated":"2022-01-14 16:52:04.000000000","message":"See below","commit_id":"6ba0f5383a7e8b4abc53df2722ea9f068c522fc1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"164c4b666cd94e1b30f65526e87de74fb3da2c53","unresolved":true,"context_lines":[{"line_number":6457,"context_line":""},{"line_number":6458,"context_line":"        self.is_safe_to_update_az(context, aggregate.metadata,"},{"line_number":6459,"context_line":"                                  hosts\u003d[host_name], aggregate\u003daggregate)"},{"line_number":6460,"context_line":"        self.ensure_no_instances_need_to_move_az_when_host_added("},{"line_number":6461,"context_line":"            context, aggregate, host_name)"},{"line_number":6462,"context_line":""},{"line_number":6463,"context_line":"        aggregate.add_host(host_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9d26cf63_36b88b99","line":6460,"updated":"2021-12-13 17:32:01.000000000","message":"I am just wondering why we are not doing this before notification (before L6437 notify_about_aggregate_update) so that we do not send notification if we are rejecting the request to add host. even same for is_safe_to_update_az() ?","commit_id":"6ba0f5383a7e8b4abc53df2722ea9f068c522fc1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d1e2dd8aea55290214578315f5fc0ec8d8422469","unresolved":false,"context_lines":[{"line_number":6457,"context_line":""},{"line_number":6458,"context_line":"        self.is_safe_to_update_az(context, aggregate.metadata,"},{"line_number":6459,"context_line":"                                  hosts\u003d[host_name], aggregate\u003daggregate)"},{"line_number":6460,"context_line":"        self.ensure_no_instances_need_to_move_az_when_host_added("},{"line_number":6461,"context_line":"            context, aggregate, host_name)"},{"line_number":6462,"context_line":""},{"line_number":6463,"context_line":"        aggregate.add_host(host_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a59b3c4_35014a0a","line":6460,"in_reply_to":"3eba1ac4_9535590f","updated":"2024-05-03 09:56:56.000000000","message":"Ack","commit_id":"6ba0f5383a7e8b4abc53df2722ea9f068c522fc1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"044171fbd0a391dfcd2688e701ce3540d53e6fbe","unresolved":true,"context_lines":[{"line_number":6457,"context_line":""},{"line_number":6458,"context_line":"        self.is_safe_to_update_az(context, aggregate.metadata,"},{"line_number":6459,"context_line":"                                  hosts\u003d[host_name], aggregate\u003daggregate)"},{"line_number":6460,"context_line":"        self.ensure_no_instances_need_to_move_az_when_host_added("},{"line_number":6461,"context_line":"            context, aggregate, host_name)"},{"line_number":6462,"context_line":""},{"line_number":6463,"context_line":"        aggregate.add_host(host_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3eba1ac4_9535590f","line":6460,"in_reply_to":"6b61b6a7_767a2e18","updated":"2022-01-14 16:52:04.000000000","message":"I have multiple reasons not to merge:\n\n1) is_safe_to_update_az is not called when a host is removed from an AZ\n2) is_safe_to_update_az is called for other aggregate updates where ensure_no_instances_need_to_move_az_when_[host_added|host_removed] check is not needed. So there would be ugly branching based on AGGREGATE_ACTION_* constants :/\n\n\n@Gmann: 1) @warp_exception will send an error notification 2) is_safe_to_update_az also after the START notification","commit_id":"6ba0f5383a7e8b4abc53df2722ea9f068c522fc1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bcca77f47ab3bb27ad2bb6e900b423c5915b9c41","unresolved":true,"context_lines":[{"line_number":6457,"context_line":""},{"line_number":6458,"context_line":"        self.is_safe_to_update_az(context, aggregate.metadata,"},{"line_number":6459,"context_line":"                                  hosts\u003d[host_name], aggregate\u003daggregate)"},{"line_number":6460,"context_line":"        self.ensure_no_instances_need_to_move_az_when_host_added("},{"line_number":6461,"context_line":"            context, aggregate, host_name)"},{"line_number":6462,"context_line":""},{"line_number":6463,"context_line":"        aggregate.add_host(host_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"dd75b0fc_7a793739","line":6460,"in_reply_to":"9d26cf63_36b88b99","updated":"2021-12-13 17:50:15.000000000","message":"this can be done here i guess but really i think it should be part fo is_safe_to_update_az\n\naddig or removing an host form an az is really an aggreate update in my view as its updating the membership of the hosts.\n\ni assume you did not extend the existing fucntion because you did not want to do this check if you were updating meatdata ectra.","commit_id":"6ba0f5383a7e8b4abc53df2722ea9f068c522fc1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"da6614f2359499b4269deb8193ca07241916631c","unresolved":true,"context_lines":[{"line_number":6457,"context_line":""},{"line_number":6458,"context_line":"        self.is_safe_to_update_az(context, aggregate.metadata,"},{"line_number":6459,"context_line":"                                  hosts\u003d[host_name], aggregate\u003daggregate)"},{"line_number":6460,"context_line":"        self.ensure_no_instances_need_to_move_az_when_host_added("},{"line_number":6461,"context_line":"            context, aggregate, host_name)"},{"line_number":6462,"context_line":""},{"line_number":6463,"context_line":"        aggregate.add_host(host_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"6b61b6a7_767a2e18","line":6460,"in_reply_to":"dd75b0fc_7a793739","updated":"2021-12-15 11:38:25.000000000","message":"Yeah, I\u0027m inclined to agree with Sean here and suggest that this should be merged into \u0027is_safe_to_update_az\u0027. It\u0027s purely semantics, but this is another safety check IMO","commit_id":"6ba0f5383a7e8b4abc53df2722ea9f068c522fc1"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"ba9ddee52b63c1609ad2b2f538520cf7e5336cfe","unresolved":true,"context_lines":[{"line_number":6432,"context_line":"                \"The host cannot be added to the aggregate as the \""},{"line_number":6433,"context_line":"                \"availability zone of the host would change from \u0027%s\u0027 to \u0027%s\u0027 \""},{"line_number":6434,"context_line":"                \"but the host already has %d instance(s). Changing the AZ of \""},{"line_number":6435,"context_line":"                \"an existing instance is not supported\""},{"line_number":6436,"context_line":"            ) % (old_az, new_az, len(instances))"},{"line_number":6437,"context_line":"            self._raise_invalid_aggregate_exc("},{"line_number":6438,"context_line":"                AGGREGATE_ACTION_ADD, aggregate.id, msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"39866dff_53599e1e","line":6435,"updated":"2022-06-01 11:15:39.000000000","message":"Should we not mention unshelving to an AZ ? Something like,\n\"Changing the AZ of an existing instance online is not supported, but it can be achieved using shelve/unshelve.\"","commit_id":"f651f56689dbd7f06c5437db81e829141da56f08"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"525d1f35e6f253b5d4aa52483838f278f9f3e4b6","unresolved":false,"context_lines":[{"line_number":6432,"context_line":"                \"The host cannot be added to the aggregate as the \""},{"line_number":6433,"context_line":"                \"availability zone of the host would change from \u0027%s\u0027 to \u0027%s\u0027 \""},{"line_number":6434,"context_line":"                \"but the host already has %d instance(s). Changing the AZ of \""},{"line_number":6435,"context_line":"                \"an existing instance is not supported\""},{"line_number":6436,"context_line":"            ) % (old_az, new_az, len(instances))"},{"line_number":6437,"context_line":"            self._raise_invalid_aggregate_exc("},{"line_number":6438,"context_line":"                AGGREGATE_ACTION_ADD, aggregate.id, msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"a84a3346_bfe79afd","line":6435,"in_reply_to":"39866dff_53599e1e","updated":"2022-06-02 09:46:46.000000000","message":"Thanks I extended the message","commit_id":"f651f56689dbd7f06c5437db81e829141da56f08"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d1e2dd8aea55290214578315f5fc0ec8d8422469","unresolved":true,"context_lines":[{"line_number":6647,"context_line":"                                                  msg)"},{"line_number":6648,"context_line":"            same_az_name \u003d (aggregate.availability_zone \u003d\u003d"},{"line_number":6649,"context_line":"                            metadata[\u0027availability_zone\u0027])"},{"line_number":6650,"context_line":"            if check_no_instances_in_az and not same_az_name:"},{"line_number":6651,"context_line":"                instance_count_by_cell \u003d ("},{"line_number":6652,"context_line":"                    nova_context.scatter_gather_skip_cell0("},{"line_number":6653,"context_line":"                        context,"}],"source_content_type":"text/x-python","patch_set":5,"id":"bc293155_ab8a5830","line":6650,"updated":"2024-05-03 09:56:56.000000000","message":"So in this branch, if the stored AZ","commit_id":"a0506570b340e1cdc3395daa5e7fe3246e79c3d8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d3eb5910a4f1a7ccd0c123e068870d9a6e3e26e5","unresolved":false,"context_lines":[{"line_number":6647,"context_line":"                                                  msg)"},{"line_number":6648,"context_line":"            same_az_name \u003d (aggregate.availability_zone \u003d\u003d"},{"line_number":6649,"context_line":"                            metadata[\u0027availability_zone\u0027])"},{"line_number":6650,"context_line":"            if check_no_instances_in_az and not same_az_name:"},{"line_number":6651,"context_line":"                instance_count_by_cell \u003d ("},{"line_number":6652,"context_line":"                    nova_context.scatter_gather_skip_cell0("},{"line_number":6653,"context_line":"                        context,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1468d2ff_edc4a48a","line":6650,"in_reply_to":"bc293155_ab8a5830","updated":"2024-05-03 09:57:31.000000000","message":"Ignore this. Remnants of a half-baked idea I decided against","commit_id":"a0506570b340e1cdc3395daa5e7fe3246e79c3d8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d1e2dd8aea55290214578315f5fc0ec8d8422469","unresolved":true,"context_lines":[{"line_number":6693,"context_line":""},{"line_number":6694,"context_line":"    def ensure_no_instances_need_to_move_az_when_host_added("},{"line_number":6695,"context_line":"        self, context, aggregate, host_name"},{"line_number":6696,"context_line":"    ):"},{"line_number":6697,"context_line":"        instances \u003d objects.InstanceList.get_by_host(context, host_name)"},{"line_number":6698,"context_line":"        if not instances:"},{"line_number":6699,"context_line":"            # if no instance then nothing moves"}],"source_content_type":"text/x-python","patch_set":5,"id":"782b6062_342e6804","line":6696,"updated":"2024-05-03 09:56:56.000000000","message":"This is effectively identical to `ensure_no_instances_need_to_move_az_when_host_removed`, save for some logs and the addition of an exclude for the the current aggregate in the latter (which would be a no-op here). I wonder if we want to make the logs more generic (\"The host cannot be added to or removed from this aggregate...\") and combine the methods?","commit_id":"a0506570b340e1cdc3395daa5e7fe3246e79c3d8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b1951d029db26df5d3afe8534fc46a0d81c22dfc","unresolved":true,"context_lines":[{"line_number":6693,"context_line":""},{"line_number":6694,"context_line":"    def ensure_no_instances_need_to_move_az_when_host_added("},{"line_number":6695,"context_line":"        self, context, aggregate, host_name"},{"line_number":6696,"context_line":"    ):"},{"line_number":6697,"context_line":"        instances \u003d objects.InstanceList.get_by_host(context, host_name)"},{"line_number":6698,"context_line":"        if not instances:"},{"line_number":6699,"context_line":"            # if no instance then nothing moves"}],"source_content_type":"text/x-python","patch_set":5,"id":"adf85b74_1ffc805e","line":6696,"in_reply_to":"782b6062_342e6804","updated":"2024-05-08 12:57:46.000000000","message":"You are right the implementation looks similar, but the actual explanation why we can do this implementation to decide the given question is fairly different. E.g. if you read the comments in the two implementations they give two different mental walk-through of the logic. So I rather not combine them as it would lead to a harder to understand solution.","commit_id":"a0506570b340e1cdc3395daa5e7fe3246e79c3d8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b51e3aacbd5fbb757341e6f249f5a93c41a43a7b","unresolved":false,"context_lines":[{"line_number":6693,"context_line":""},{"line_number":6694,"context_line":"    def ensure_no_instances_need_to_move_az_when_host_added("},{"line_number":6695,"context_line":"        self, context, aggregate, host_name"},{"line_number":6696,"context_line":"    ):"},{"line_number":6697,"context_line":"        instances \u003d objects.InstanceList.get_by_host(context, host_name)"},{"line_number":6698,"context_line":"        if not instances:"},{"line_number":6699,"context_line":"            # if no instance then nothing moves"}],"source_content_type":"text/x-python","patch_set":5,"id":"54cfbeac_8000dedd","line":6696,"in_reply_to":"adf85b74_1ffc805e","updated":"2024-05-08 15:14:17.000000000","message":"Acknowledged","commit_id":"a0506570b340e1cdc3395daa5e7fe3246e79c3d8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c5475b2e6b37e72850ad644ad3e80497992ecf39","unresolved":true,"context_lines":[{"line_number":6693,"context_line":""},{"line_number":6694,"context_line":"    def ensure_no_instances_need_to_move_az_when_host_added("},{"line_number":6695,"context_line":"        self, context, aggregate, host_name"},{"line_number":6696,"context_line":"    ):"},{"line_number":6697,"context_line":"        instances \u003d objects.InstanceList.get_by_host(context, host_name)"},{"line_number":6698,"context_line":"        if not instances:"},{"line_number":6699,"context_line":"            # if no instance then nothing moves"}],"source_content_type":"text/x-python","patch_set":5,"id":"85804040_bcf544f4","line":6696,"in_reply_to":"adf85b74_1ffc805e","updated":"2024-05-09 12:18:15.000000000","message":"in both cases, the reason should be the same.\n\nwe moved the az info of an instance to the api db by looking up the compute service an instance is mapped to and then determining if its a member of an az.\n\nif a host has any instance on it that will potentially change the reported az\nreturned by the host.\n\nthe exact meanings fo that are subtly different but the underlying reason is the same\n\nmoving host with an instance on it into or out of an az is always invalid\neven if the instances are not pinned to an az.\n\nit would still change the az reported to neutron/cider for any of those instances for example\n\nI am mostly ok with keeping these separate even if the code is very similar but i dont really object to combining","commit_id":"a0506570b340e1cdc3395daa5e7fe3246e79c3d8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d1e2dd8aea55290214578315f5fc0ec8d8422469","unresolved":true,"context_lines":[{"line_number":6694,"context_line":"    def ensure_no_instances_need_to_move_az_when_host_added("},{"line_number":6695,"context_line":"        self, context, aggregate, host_name"},{"line_number":6696,"context_line":"    ):"},{"line_number":6697,"context_line":"        instances \u003d objects.InstanceList.get_by_host(context, host_name)"},{"line_number":6698,"context_line":"        if not instances:"},{"line_number":6699,"context_line":"            # if no instance then nothing moves"},{"line_number":6700,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":5,"id":"9e06f578_bfbc1b52","line":6697,"updated":"2024-05-03 09:56:56.000000000","message":"Random, mostly unrelated question: why do we need to wrap `InstanceList.get_count_by_hosts` in `nova_context.scatter_gather_skip_cell0` yet we don\u0027t need to wrap `InstanceList.get_by_host`? Again mostly unrelated but I wonder if we could add a note so this is more apparent to future reviewers?","commit_id":"a0506570b340e1cdc3395daa5e7fe3246e79c3d8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b51e3aacbd5fbb757341e6f249f5a93c41a43a7b","unresolved":false,"context_lines":[{"line_number":6694,"context_line":"    def ensure_no_instances_need_to_move_az_when_host_added("},{"line_number":6695,"context_line":"        self, context, aggregate, host_name"},{"line_number":6696,"context_line":"    ):"},{"line_number":6697,"context_line":"        instances \u003d objects.InstanceList.get_by_host(context, host_name)"},{"line_number":6698,"context_line":"        if not instances:"},{"line_number":6699,"context_line":"            # if no instance then nothing moves"},{"line_number":6700,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":5,"id":"e63c7576_dc7e4d6b","line":6697,"in_reply_to":"948cebf7_e5350f7e","updated":"2024-05-08 15:14:17.000000000","message":"Acknowledged","commit_id":"a0506570b340e1cdc3395daa5e7fe3246e79c3d8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b1951d029db26df5d3afe8534fc46a0d81c22dfc","unresolved":true,"context_lines":[{"line_number":6694,"context_line":"    def ensure_no_instances_need_to_move_az_when_host_added("},{"line_number":6695,"context_line":"        self, context, aggregate, host_name"},{"line_number":6696,"context_line":"    ):"},{"line_number":6697,"context_line":"        instances \u003d objects.InstanceList.get_by_host(context, host_name)"},{"line_number":6698,"context_line":"        if not instances:"},{"line_number":6699,"context_line":"            # if no instance then nothing moves"},{"line_number":6700,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":5,"id":"948cebf7_e5350f7e","line":6697,"in_reply_to":"9e06f578_bfbc1b52","updated":"2024-05-08 12:57:46.000000000","message":"I think the cont_by_hosts needs to look into multiple cell DBs for instances as it returns a count for each host potentially in different cells.\nIn the other hand get_by_host is only looking for a single host and therefore to a single cell DB.","commit_id":"a0506570b340e1cdc3395daa5e7fe3246e79c3d8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d1e2dd8aea55290214578315f5fc0ec8d8422469","unresolved":true,"context_lines":[{"line_number":6865,"context_line":"            aggregate\u003daggregate,"},{"line_number":6866,"context_line":"            action\u003dfields_obj.NotificationAction.REMOVE_HOST,"},{"line_number":6867,"context_line":"            phase\u003dfields_obj.NotificationPhase.START)"},{"line_number":6868,"context_line":""},{"line_number":6869,"context_line":"        self.ensure_no_instances_need_to_move_az_when_host_removed("},{"line_number":6870,"context_line":"            context, aggregate, host_name)"},{"line_number":6871,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"d6eb025d_1e18b046","line":6868,"updated":"2024-05-03 09:56:56.000000000","message":"Based on your reponse to gmann above, I suspect you don\u0027t want to add a call to `is_safe_to_update_az` here, but I see you explicitly handling `action_name \u003d\u003d AGGREGATE_ACTION_DELETE` in there. Do we need to add a call here or can we remove the handling of `AGGREGATE_ACTION_DELETE` from `is_safe_to_update_az`?","commit_id":"a0506570b340e1cdc3395daa5e7fe3246e79c3d8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b51e3aacbd5fbb757341e6f249f5a93c41a43a7b","unresolved":false,"context_lines":[{"line_number":6865,"context_line":"            aggregate\u003daggregate,"},{"line_number":6866,"context_line":"            action\u003dfields_obj.NotificationAction.REMOVE_HOST,"},{"line_number":6867,"context_line":"            phase\u003dfields_obj.NotificationPhase.START)"},{"line_number":6868,"context_line":""},{"line_number":6869,"context_line":"        self.ensure_no_instances_need_to_move_az_when_host_removed("},{"line_number":6870,"context_line":"            context, aggregate, host_name)"},{"line_number":6871,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"8fc2e3d2_567526df","line":6868,"in_reply_to":"c2384e15_5b6b3bc6","updated":"2024-05-08 15:14:17.000000000","message":"Done","commit_id":"a0506570b340e1cdc3395daa5e7fe3246e79c3d8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b1951d029db26df5d3afe8534fc46a0d81c22dfc","unresolved":true,"context_lines":[{"line_number":6865,"context_line":"            aggregate\u003daggregate,"},{"line_number":6866,"context_line":"            action\u003dfields_obj.NotificationAction.REMOVE_HOST,"},{"line_number":6867,"context_line":"            phase\u003dfields_obj.NotificationPhase.START)"},{"line_number":6868,"context_line":""},{"line_number":6869,"context_line":"        self.ensure_no_instances_need_to_move_az_when_host_removed("},{"line_number":6870,"context_line":"            context, aggregate, host_name)"},{"line_number":6871,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"c2384e15_5b6b3bc6","line":6868,"in_reply_to":"d6eb025d_1e18b046","updated":"2024-05-08 12:57:46.000000000","message":"honestly I lost all the context of this patch over the years. With my current eyes I think the change in is_safe_to_update_az is unnecessary, as both add and delete are handled separately. I will push a new revision.","commit_id":"a0506570b340e1cdc3395daa5e7fe3246e79c3d8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c5475b2e6b37e72850ad644ad3e80497992ecf39","unresolved":true,"context_lines":[{"line_number":6754,"context_line":"            action\u003dfields_obj.NotificationAction.ADD_HOST,"},{"line_number":6755,"context_line":"            phase\u003dfields_obj.NotificationPhase.START)"},{"line_number":6756,"context_line":""},{"line_number":6757,"context_line":"        self.is_safe_to_update_az(context, aggregate.metadata,"},{"line_number":6758,"context_line":"                                  hosts\u003d[host_name], aggregate\u003daggregate)"},{"line_number":6759,"context_line":"        self.ensure_no_instances_need_to_move_az_when_host_added("},{"line_number":6760,"context_line":"            context, aggregate, host_name)"},{"line_number":6761,"context_line":""},{"line_number":6762,"context_line":"        aggregate.add_host(host_name)"},{"line_number":6763,"context_line":"        self.query_client.update_aggregates(context, [aggregate])"},{"line_number":6764,"context_line":"        nodes \u003d objects.ComputeNodeList.get_all_by_host(context, host_name)"},{"line_number":6765,"context_line":"        node_name \u003d nodes[0].hypervisor_hostname"}],"source_content_type":"text/x-python","patch_set":6,"id":"fb9b6d7b_ca33498b","line":6762,"range":{"start_line":6757,"start_character":0,"end_line":6762,"end_character":37},"updated":"2024-05-09 12:18:15.000000000","message":"note: technically while this is an improvement we can still race here.\n\nwe do not have a way to do a distributed lock such that no instance can spwan on this host while we are doing this aggregate update.\n\nthis is still better then before.\n\nin the add cases where the host is moving from the default AZ to an actual az this should not cause any issues.\n\nwhile you can explicitly pin to the default az we document that you should not do that.\n\nfor the remove case its possible that when the host was selected by the schduler/placement thet host was a member of a requested AZ but by the time the vm spwan request arrives on the compute it wont be.\n\nwe cant fix that via a change to only the api.\n\nits not a regression in this patch but its somethign we should be aware of.\n\nthe only way to fix that would be for the compute node to try and confirm that the requested az in the az matches its current az.\n\nhowever i belive on the compute node that info is cached so it could also be out of date.\n\nso tl;dr this will fix the main gap in 95% of cases but there will be a small window where the bevhior might not be exactly as we would hop.","commit_id":"3c0eadae0b9ec48586087ea6c0c4e9176f0aa3bc"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c5475b2e6b37e72850ad644ad3e80497992ecf39","unresolved":true,"context_lines":[{"line_number":6760,"context_line":"            context, aggregate, host_name)"},{"line_number":6761,"context_line":""},{"line_number":6762,"context_line":"        aggregate.add_host(host_name)"},{"line_number":6763,"context_line":"        self.query_client.update_aggregates(context, [aggregate])"},{"line_number":6764,"context_line":"        nodes \u003d objects.ComputeNodeList.get_all_by_host(context, host_name)"},{"line_number":6765,"context_line":"        node_name \u003d nodes[0].hypervisor_hostname"},{"line_number":6766,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"0a94b434_9b3ca06d","line":6763,"updated":"2024-05-09 12:18:15.000000000","message":"ohter side note ^ is also problematic\n\nthere is an open bug for this but tldrif you make parallel request to modify aggreates the attarge/host cache in the sechdler can get out of sync.\n\nhttps://bugs.launchpad.net/nova/+bug/1542491\n\nthat might aggreate the problem but its a seperate issue form what this is trying to adress.","commit_id":"3c0eadae0b9ec48586087ea6c0c4e9176f0aa3bc"}],"releasenotes/notes/reject-az-changes-of-an-instance-during-aggregate-update-64d319d0717ed704.yaml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9bf357cf2b78e08df7c845848e2677fe59c3d072","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Nova now ensures that an instance cannot move between availability zones "},{"line_number":5,"context_line":"    when the host of the instance is added or removed to an aggregate that is "},{"line_number":6,"context_line":"    part of another availability zone. Moving from or to the default "},{"line_number":7,"context_line":"    availability zone is also rejected."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"eff158cd_418b9c30","line":4,"range":{"start_line":4,"start_character":76,"end_line":4,"end_character":77},"updated":"2022-02-14 10:14:15.000000000","message":"whoops","commit_id":"6111b73447ef1e188a075f99f0f6530003210a4b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1678f08061943dc5cfdbd7974f174c840f9621f3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Nova now ensures that an instance cannot move between availability zones "},{"line_number":5,"context_line":"    when the host of the instance is added or removed to an aggregate that is "},{"line_number":6,"context_line":"    part of another availability zone. Moving from or to the default "},{"line_number":7,"context_line":"    availability zone is also rejected."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"d49ff3ff_5d540877","line":4,"range":{"start_line":4,"start_character":76,"end_line":4,"end_character":77},"in_reply_to":"eff158cd_418b9c30","updated":"2022-06-01 09:26:52.000000000","message":"Done","commit_id":"6111b73447ef1e188a075f99f0f6530003210a4b"}]}
