)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"787565b54fb347fb8021db9d689cec536950cade","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"00460bae_9f7e704c","updated":"2026-04-30 17:04:59.000000000","message":"Made a few of the clear updates and left the other comments open for further discussion.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"14ead111a36a34ea909fded6262a83d94a9f6cf8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"abd25424_5e2d298c","updated":"2026-04-30 14:18:01.000000000","message":"Thanks Rene!","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"ac4f7ad3620735969f19cbb656205923b72634c2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"cb6d8c2f_e56f5c85","updated":"2026-04-30 13:52:28.000000000","message":"Thanks for the spec Dan! I think there are a few areas that could use some clarification, and I\u0027ve also left some suggestions that I hope will be helpful.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"bba8d9a7b7db02eb803e8badc382bb8fef83e009","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"0a4c0878_c291cdc2","updated":"2026-05-05 13:26:52.000000000","message":"Overall the spec looks good to me. I\u0027m putting a -1 to flag the need for\nfunctional tests and the blueprint creation. Once those are addressed,\nI\u0027ll be happy to approve.","commit_id":"ea6ef766e7474f8d791aea0beba3281b5fc08eb1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"f402b6515f7207b0170177d48399f7c4c8d87f1b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"799f39f2_1d9466a4","updated":"2026-05-02 04:53:30.000000000","message":"lgtm, I am -1 for only one use case of updating the old pinned AZ to current AZ. At least, i would like to know if any issue in that.","commit_id":"ea6ef766e7474f8d791aea0beba3281b5fc08eb1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"84d27009aa3eb885d2f498f458071c3cbcb8fb9f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"9d81010a_e35aefcc","updated":"2026-05-06 13:44:48.000000000","message":"Gibi, I\u0027m not sure if you\u0027re opposed to this in general (I don\u0027t remember any push back at the PTG) or if you just have a problem with the quoted use-case. If you want me to adjust or just remove that let me know. Hopefully this is obviously useful enough to continue with regardless of if you want to trim that case out to avoid \"over promising\".","commit_id":"c6b77f93fd81844daaa06efc181e7e0261031b63"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"548ab9cc9221b346bc905667c451d19d4a02578c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"499835bc_ff10a59c","updated":"2026-05-06 07:35:55.000000000","message":"I think we need to clarify the use cases to say only those that can really be achieved after this change is implemented as I think currently this spec is over-promising","commit_id":"c6b77f93fd81844daaa06efc181e7e0261031b63"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"fcbcdc7a6cc49cb13d092d4e9a4ecad5d837d2d2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"4fe5ebcb_11a84fa7","updated":"2026-05-05 16:56:37.000000000","message":"I\u0027m happy with the spec. Thanks Dan.","commit_id":"c6b77f93fd81844daaa06efc181e7e0261031b63"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"befdd7cb0fe8f714b7ccdf533d0b21c45ab4a0b4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"8d4f5c0b_7372f077","updated":"2026-05-05 17:27:54.000000000","message":"thanks, lgtm","commit_id":"c6b77f93fd81844daaa06efc181e7e0261031b63"}],"specs/2026.2/approved/unpin-az.rst":[{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"785b0ca460e4d84f6e9f56441e7270c675c5ecb3","unresolved":true,"context_lines":[{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Include the URL of your launchpad blueprint:"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"https://blueprints.launchpad.net/nova/+spec/unpin-az"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Currently, an instance is forever pinned to an availability zone if one was"},{"line_number":16,"context_line":"selected at create time. This is often not ideal for long-running instances,"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1deb5486_2a91f96f","line":13,"range":{"start_line":12,"start_character":0,"end_line":13,"end_character":52},"updated":"2026-04-30 14:09:20.000000000","message":"The link is not working.\nDid you create the BP already ?","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"76f77c4d7f83751c49a651ffb7cc812f28176004","unresolved":true,"context_lines":[{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Include the URL of your launchpad blueprint:"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"https://blueprints.launchpad.net/nova/+spec/unpin-az"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Currently, an instance is forever pinned to an availability zone if one was"},{"line_number":16,"context_line":"selected at create time. This is often not ideal for long-running instances,"}],"source_content_type":"text/x-rst","patch_set":2,"id":"cda8c79a_c6c134f2","line":13,"range":{"start_line":12,"start_character":0,"end_line":13,"end_character":52},"in_reply_to":"1deb5486_2a91f96f","updated":"2026-04-30 14:21:26.000000000","message":"No, I always say this: I think it\u0027s silly for us to create the blueprint in LP before the spec is approved. The spec could not be approved, or change substantially, etc, and there\u0027s no need for the link to actually work until we commit to doing this. If you require it, then I\u0027ll create it, but I see no reason :)\n\nIn fact, what I\u0027d like is to amend the template to say something like \"this does not need to be pre-created unless you\u0027re also working on code in parallel and need to capture links to the topic\".","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"bba8d9a7b7db02eb803e8badc382bb8fef83e009","unresolved":true,"context_lines":[{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Include the URL of your launchpad blueprint:"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"https://blueprints.launchpad.net/nova/+spec/unpin-az"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Currently, an instance is forever pinned to an availability zone if one was"},{"line_number":16,"context_line":"selected at create time. This is often not ideal for long-running instances,"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ff8ecc8a_21c88fbf","line":13,"range":{"start_line":12,"start_character":0,"end_line":13,"end_character":52},"in_reply_to":"cda8c79a_c6c134f2","updated":"2026-05-05 13:26:52.000000000","message":"I understand the point, but I think having the blueprint created upfront\nis important for tracking purposes. It helps differentiate between proposed,\naccepted, and implemented work items, and as PTL I rely on this to keep a clear\npicture of what\u0027s in flight vs. what\u0027s just been discussed. The spec could\nchange or be rejected, sure, but the blueprint can be updated accordingly,\nthat\u0027s part of my tracking workflow. So please, let\u0027s keep this process as is.\n\nIf you don\u0027t want to create it yourself, just let me know and I\u0027ll do it.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"48027528fb190708427adf3099abbd524b856e13","unresolved":false,"context_lines":[{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Include the URL of your launchpad blueprint:"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"https://blueprints.launchpad.net/nova/+spec/unpin-az"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Currently, an instance is forever pinned to an availability zone if one was"},{"line_number":16,"context_line":"selected at create time. This is often not ideal for long-running instances,"}],"source_content_type":"text/x-rst","patch_set":2,"id":"d37272f1_8329e98b","line":13,"range":{"start_line":12,"start_character":0,"end_line":13,"end_character":52},"in_reply_to":"ff8ecc8a_21c88fbf","updated":"2026-05-05 14:03:26.000000000","message":"Done","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"ac4f7ad3620735969f19cbb656205923b72634c2","unresolved":true,"context_lines":[{"line_number":23,"context_line":"Instance availability zone assignments are currently one-way and immutable."},{"line_number":24,"context_line":"This does not fit the operational reality where things may need to be moved"},{"line_number":25,"context_line":"around for a variety of reasons over time."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Use Cases"},{"line_number":29,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"0932ec2f_8a23a01f","line":26,"updated":"2026-04-30 13:52:28.000000000","message":"It might be worth mentioning in the problem description that there is\ncurrently a partial workaround via unshelve-to-host (microversion 2.91),\nwhich allows moving an instance to a different AZ. However, this requires\nshelving the instance first, meaning it implies downtime, which makes it\nunsuitable for long-running workloads.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"14ead111a36a34ea909fded6262a83d94a9f6cf8","unresolved":true,"context_lines":[{"line_number":23,"context_line":"Instance availability zone assignments are currently one-way and immutable."},{"line_number":24,"context_line":"This does not fit the operational reality where things may need to be moved"},{"line_number":25,"context_line":"around for a variety of reasons over time."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Use Cases"},{"line_number":29,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9810c55c_914aefc1","line":26,"in_reply_to":"0932ec2f_8a23a01f","updated":"2026-04-30 14:18:01.000000000","message":"I didn\u0027t say anything about/like this because that\u0027s a very admin-focused thing and I\u0027m viewing this as a more user-focused one (even though an admin might use it). But, I can add it and mention why it\u0027s specifically not relevant to the case I particularly care about.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"787565b54fb347fb8021db9d689cec536950cade","unresolved":false,"context_lines":[{"line_number":23,"context_line":"Instance availability zone assignments are currently one-way and immutable."},{"line_number":24,"context_line":"This does not fit the operational reality where things may need to be moved"},{"line_number":25,"context_line":"around for a variety of reasons over time."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Use Cases"},{"line_number":29,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9df9e5ca_70821c80","line":26,"in_reply_to":"9810c55c_914aefc1","updated":"2026-04-30 17:04:59.000000000","message":"Done","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"ac4f7ad3620735969f19cbb656205923b72634c2","unresolved":true,"context_lines":[{"line_number":37,"context_line":"  changing HA needs."},{"line_number":38,"context_line":"- As an application deployer I may need to reverse a decision to pin"},{"line_number":39,"context_line":"  an instance to a given AZ without having to delete and recreate the instance."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Proposed change"},{"line_number":42,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"e38111b1_0bb22f4c","line":40,"updated":"2026-04-30 13:52:28.000000000","message":"There might also be a use case worth considering around storage AZ affinity\n I recall discussions about scenarios where unpinning the compute AZ would\n allow relying on the storage (Cinder) AZ as the primary placement constraint\n instead. I can\u0027t recall the exact details and don\u0027t want to say something\n wrong, but I think it is linked to cross_az_attach\u003dFalse.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"f402b6515f7207b0170177d48399f7c4c8d87f1b","unresolved":true,"context_lines":[{"line_number":37,"context_line":"  changing HA needs."},{"line_number":38,"context_line":"- As an application deployer I may need to reverse a decision to pin"},{"line_number":39,"context_line":"  an instance to a given AZ without having to delete and recreate the instance."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Proposed change"},{"line_number":42,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"e37335e6_8e071eda","line":40,"in_reply_to":"ce3dd40a_8ebf1cf9","updated":"2026-05-02 04:53:30.000000000","message":"Yeah, I wrote about the cross_az_attach\u003dFalse case in PTG etherpad and initially thought that we should honour the cross_az_attach\u003dFalse case when unpinning AZ, but after PTG discussion and the use case of storage (as Dan mentioned), the correct way is to leave it on the operators to handle the cross_az_attach\u003dFalse case.\n\nIf they are unpinning the AZ of VM they know that it has side effect for example cross_az_attach\u003dFalse case. As discussed in PTG, let\u0027s document it and let Nova always unpin it when it is requested.\n\n- https://etherpad.opendev.org/p/nova-2026.2-ptg#L399","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"bba8d9a7b7db02eb803e8badc382bb8fef83e009","unresolved":false,"context_lines":[{"line_number":37,"context_line":"  changing HA needs."},{"line_number":38,"context_line":"- As an application deployer I may need to reverse a decision to pin"},{"line_number":39,"context_line":"  an instance to a given AZ without having to delete and recreate the instance."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Proposed change"},{"line_number":42,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"f7040b54_f7cc0e87","line":40,"in_reply_to":"e37335e6_8e071eda","updated":"2026-05-05 13:26:52.000000000","message":"Makes sense, agreed on documenting it and leaving it to the operators to\nhandle the cross_az_attach\u003dFalse implications. Thanks for the PTG etherpad\nlink Ghanshyam.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"14ead111a36a34ea909fded6262a83d94a9f6cf8","unresolved":true,"context_lines":[{"line_number":37,"context_line":"  changing HA needs."},{"line_number":38,"context_line":"- As an application deployer I may need to reverse a decision to pin"},{"line_number":39,"context_line":"  an instance to a given AZ without having to delete and recreate the instance."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Proposed change"},{"line_number":42,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"ce3dd40a_8ebf1cf9","line":40,"in_reply_to":"e38111b1_0bb22f4c","updated":"2026-04-30 14:18:01.000000000","message":"I\u0027m not sure how that would work... if you have `cross_az_attach\u003dFalse` then you would already be in the same AZ as your storage and unpinning your AZ would keep you pinned there by way of your storage so it would defeat the point of unpinning I think. Can you dig up a reference?\n\nIn fact, the origin of this feature is from cinder, which wants to be able to live migrate instances and storage from one AZ to another by unpinning them both, moving, and then re-pinning. Perhaps unpinning both would make them able to transit AZs in a `cross-az-attach\u003dFalse` world, but I\u0027m not sure.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"ac4f7ad3620735969f19cbb656205923b72634c2","unresolved":true,"context_lines":[{"line_number":47,"context_line":"field) to be changed RESTfully in an update (``PUT``) request. Only"},{"line_number":48,"context_line":"two transitions will actually be allowed:"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"1. Moving from a pinned AZ to an unpinned state"},{"line_number":51,"context_line":"   (i.e. ``pinned_availability_zone`` is changed from some"},{"line_number":52,"context_line":"   non-``null`` value to ``null``)"},{"line_number":53,"context_line":"2. Moving from an unpinned state (i.e. ``pinned_availability_zone`` is"}],"source_content_type":"text/x-rst","patch_set":2,"id":"2ffaba97_5d4cedc9","line":50,"updated":"2026-04-30 13:52:28.000000000","message":"The REST API impact section would benefit from a concrete request/response example. My understanding is that unpinning would look like:\n\n```\n PUT /servers/{server_id}\n X-OpenStack-Nova-API-Version: 2.XX\n\n {\n     \"server\": {\n         \"pinned_availability_zone\": null\n     }\n }\n```\n\nSorry, I\u0027m a simple person and a good example is just so much more tangible to me :)","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"14ead111a36a34ea909fded6262a83d94a9f6cf8","unresolved":false,"context_lines":[{"line_number":47,"context_line":"field) to be changed RESTfully in an update (``PUT``) request. Only"},{"line_number":48,"context_line":"two transitions will actually be allowed:"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"1. Moving from a pinned AZ to an unpinned state"},{"line_number":51,"context_line":"   (i.e. ``pinned_availability_zone`` is changed from some"},{"line_number":52,"context_line":"   non-``null`` value to ``null``)"},{"line_number":53,"context_line":"2. Moving from an unpinned state (i.e. ``pinned_availability_zone`` is"}],"source_content_type":"text/x-rst","patch_set":2,"id":"86391735_6fd3a5a0","line":50,"in_reply_to":"2ffaba97_5d4cedc9","updated":"2026-04-30 14:18:01.000000000","message":"Acknowledged","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"ac4f7ad3620735969f19cbb656205923b72634c2","unresolved":true,"context_lines":[{"line_number":50,"context_line":"1. Moving from a pinned AZ to an unpinned state"},{"line_number":51,"context_line":"   (i.e. ``pinned_availability_zone`` is changed from some"},{"line_number":52,"context_line":"   non-``null`` value to ``null``)"},{"line_number":53,"context_line":"2. Moving from an unpinned state (i.e. ``pinned_availability_zone`` is"},{"line_number":54,"context_line":"   ``null``) to a pinned state where the new AZ is the one the"},{"line_number":55,"context_line":"   instance is currently in.  Specifically the"},{"line_number":56,"context_line":"   ``pinned_availability_zone`` value can (only) move from ``null`` to"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bfca9c90_70bc530d","line":53,"updated":"2026-04-30 13:52:28.000000000","message":"ditto here for the example.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"14ead111a36a34ea909fded6262a83d94a9f6cf8","unresolved":false,"context_lines":[{"line_number":50,"context_line":"1. Moving from a pinned AZ to an unpinned state"},{"line_number":51,"context_line":"   (i.e. ``pinned_availability_zone`` is changed from some"},{"line_number":52,"context_line":"   non-``null`` value to ``null``)"},{"line_number":53,"context_line":"2. Moving from an unpinned state (i.e. ``pinned_availability_zone`` is"},{"line_number":54,"context_line":"   ``null``) to a pinned state where the new AZ is the one the"},{"line_number":55,"context_line":"   instance is currently in.  Specifically the"},{"line_number":56,"context_line":"   ``pinned_availability_zone`` value can (only) move from ``null`` to"}],"source_content_type":"text/x-rst","patch_set":2,"id":"abc24c5e_eaa4e88c","line":53,"in_reply_to":"bfca9c90_70bc530d","updated":"2026-04-30 14:18:01.000000000","message":"Acknowledged","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"ac4f7ad3620735969f19cbb656205923b72634c2","unresolved":true,"context_lines":[{"line_number":63,"context_line":"instance (via forced migration) between AZs and fixing up the"},{"line_number":64,"context_line":"inconsistency afterwards. This is in support of a potential further"},{"line_number":65,"context_line":"optimization for move operations themselves."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"Further optimization"},{"line_number":68,"context_line":"--------------------"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"10c4c674_dc3553fb","line":66,"updated":"2026-04-30 13:52:28.000000000","message":"The spec doesn\u0027t mention in which instance state this operation is\nallowed. Should it work when the instance is STOPPED?  I\u0027d assume any stable\nstate (ACTIVE, STOPPED) should be fine, but states involving an in-progress\noperation like PAUSE, SHELVED, RESIZE, VERIFY_RESIZE should probably block\nthe action to avoid inconsistencies.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"ac4f7ad3620735969f19cbb656205923b72634c2","unresolved":true,"context_lines":[{"line_number":63,"context_line":"instance (via forced migration) between AZs and fixing up the"},{"line_number":64,"context_line":"inconsistency afterwards. This is in support of a potential further"},{"line_number":65,"context_line":"optimization for move operations themselves."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"Further optimization"},{"line_number":68,"context_line":"--------------------"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"07601043_635ba38a","line":66,"updated":"2026-04-30 13:52:28.000000000","message":"The spec doesn\u0027t mention which policy rule will govern\n this new capability. Will it simply fall under the existing\n os_compute_api:servers:update policy, or will a dedicated policy rule be\n introduced (e.g. os_compute_api:servers:update:pinned_availability_zone)?\n\n This matters because an operator may want to restrict who can unpin/repin\n an instance. For example, allowing regular project members to unpin could\n have unintended consequences if they don\u0027t understand the implications\n (e.g. a subsequent migration could land the instance anywhere). A dedicated\n policy would let operators grant this to admins only while keeping normal\n server updates available to project members.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"14ead111a36a34ea909fded6262a83d94a9f6cf8","unresolved":true,"context_lines":[{"line_number":63,"context_line":"instance (via forced migration) between AZs and fixing up the"},{"line_number":64,"context_line":"inconsistency afterwards. This is in support of a potential further"},{"line_number":65,"context_line":"optimization for move operations themselves."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"Further optimization"},{"line_number":68,"context_line":"--------------------"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"76ad6871_559f4f51","line":66,"in_reply_to":"07601043_635ba38a","updated":"2026-04-30 14:18:01.000000000","message":"Well, I thought about it and should have said something here.\n\nTo me, the AZ is fully under the user\u0027s control at boot and thus should be here as well. Thus I\u0027d prefer this not be a point of interoperability that an admin can \"break\" by disabling. But if people have a strong use-case or opinion I\u0027d like to hear it.\n\nI guess I\u0027ll place an explanation for not having a separate policy in here and we can let someone else argue if they disagree.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"14ead111a36a34ea909fded6262a83d94a9f6cf8","unresolved":true,"context_lines":[{"line_number":63,"context_line":"instance (via forced migration) between AZs and fixing up the"},{"line_number":64,"context_line":"inconsistency afterwards. This is in support of a potential further"},{"line_number":65,"context_line":"optimization for move operations themselves."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"Further optimization"},{"line_number":68,"context_line":"--------------------"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"e23bdafe_121999be","line":66,"in_reply_to":"10c4c674_dc3553fb","updated":"2026-04-30 14:18:01.000000000","message":"It doesn\u0027t because I don\u0027t know why we would limit any of them, TBH. I don\u0027t think we need the usual state locking for this since we\u0027re just updating the \"next request to the scheduler\" field, which is in the API database and an ongoing operation on the compute won\u0027t even know about it.\n\nI\u0027m sure I\u0027m missing something - why would a PAUSED or even VERIFY_RESIZE instance need to disallow this change?","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"bba8d9a7b7db02eb803e8badc382bb8fef83e009","unresolved":false,"context_lines":[{"line_number":63,"context_line":"instance (via forced migration) between AZs and fixing up the"},{"line_number":64,"context_line":"inconsistency afterwards. This is in support of a potential further"},{"line_number":65,"context_line":"optimization for move operations themselves."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"Further optimization"},{"line_number":68,"context_line":"--------------------"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"0962bcbc_d4c98878","line":66,"in_reply_to":"4f4d8608_f89e6328","updated":"2026-05-05 13:26:52.000000000","message":"Agreed, the argument that the user already has full control over AZ selection at boot time is a good one. No need \nfor a separate policy then.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"787565b54fb347fb8021db9d689cec536950cade","unresolved":false,"context_lines":[{"line_number":63,"context_line":"instance (via forced migration) between AZs and fixing up the"},{"line_number":64,"context_line":"inconsistency afterwards. This is in support of a potential further"},{"line_number":65,"context_line":"optimization for move operations themselves."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"Further optimization"},{"line_number":68,"context_line":"--------------------"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"4f4d8608_f89e6328","line":66,"in_reply_to":"76ad6871_559f4f51","updated":"2026-04-30 17:04:59.000000000","message":"Done","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"bba8d9a7b7db02eb803e8badc382bb8fef83e009","unresolved":false,"context_lines":[{"line_number":63,"context_line":"instance (via forced migration) between AZs and fixing up the"},{"line_number":64,"context_line":"inconsistency afterwards. This is in support of a potential further"},{"line_number":65,"context_line":"optimization for move operations themselves."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"Further optimization"},{"line_number":68,"context_line":"--------------------"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"e28a0ce2_03b4c17d","line":66,"in_reply_to":"a8d63564_5cef851e","updated":"2026-05-05 13:26:52.000000000","message":"Fair point. My initial thought was to block certain states that wouldn\u0027t\ntrigger a new scheduler call, so the user wouldn\u0027t be misled into thinking\nthe change had an immediate effect. But you\u0027re right, since this is just an\nupdate to the request_spec in the API DB and the scheduler will only pick it\nup on the next move operation, there\u0027s no real reason to restrict based\non instance state. It also keeps the code simpler. I withdraw my comment on\nthis one.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"f402b6515f7207b0170177d48399f7c4c8d87f1b","unresolved":true,"context_lines":[{"line_number":63,"context_line":"instance (via forced migration) between AZs and fixing up the"},{"line_number":64,"context_line":"inconsistency afterwards. This is in support of a potential further"},{"line_number":65,"context_line":"optimization for move operations themselves."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"Further optimization"},{"line_number":68,"context_line":"--------------------"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"a8d63564_5cef851e","line":66,"in_reply_to":"e23bdafe_121999be","updated":"2026-05-02 04:53:30.000000000","message":"yeah, I am not sure this is restricted from any operation wise as it is just update in API DB.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"ac4f7ad3620735969f19cbb656205923b72634c2","unresolved":true,"context_lines":[{"line_number":92,"context_line":"---------------"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"In a new microversion, we will provide mutability of the"},{"line_number":95,"context_line":"``pinned_availability_zone`` field via ``PUT"},{"line_number":96,"context_line":"/servers/{server_id}``. Normal response code will be HTTP 200. If the"},{"line_number":97,"context_line":"availability zone is changed to a non-``null`` value that does not"},{"line_number":98,"context_line":"match the current AZ, or the current ``pinned_availability_zone``"},{"line_number":99,"context_line":"value is not ``null``, an HTTP 409 Conflict response will be returned."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"No additional schema changes are needed."},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"8f3a79f7_fdbcec6b","line":99,"range":{"start_line":95,"start_character":0,"end_line":99,"end_character":70},"updated":"2026-04-30 13:52:28.000000000","message":"I would probably remove this and link to the proposal change above.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"14ead111a36a34ea909fded6262a83d94a9f6cf8","unresolved":true,"context_lines":[{"line_number":92,"context_line":"---------------"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"In a new microversion, we will provide mutability of the"},{"line_number":95,"context_line":"``pinned_availability_zone`` field via ``PUT"},{"line_number":96,"context_line":"/servers/{server_id}``. Normal response code will be HTTP 200. If the"},{"line_number":97,"context_line":"availability zone is changed to a non-``null`` value that does not"},{"line_number":98,"context_line":"match the current AZ, or the current ``pinned_availability_zone``"},{"line_number":99,"context_line":"value is not ``null``, an HTTP 409 Conflict response will be returned."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"No additional schema changes are needed."},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"d49e2c86_d61beb0e","line":99,"range":{"start_line":95,"start_character":0,"end_line":99,"end_character":70},"in_reply_to":"8f3a79f7_fdbcec6b","updated":"2026-04-30 14:18:01.000000000","message":"I\u0027m not sure what you mean here. Link to what?","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"787565b54fb347fb8021db9d689cec536950cade","unresolved":false,"context_lines":[{"line_number":92,"context_line":"---------------"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"In a new microversion, we will provide mutability of the"},{"line_number":95,"context_line":"``pinned_availability_zone`` field via ``PUT"},{"line_number":96,"context_line":"/servers/{server_id}``. Normal response code will be HTTP 200. If the"},{"line_number":97,"context_line":"availability zone is changed to a non-``null`` value that does not"},{"line_number":98,"context_line":"match the current AZ, or the current ``pinned_availability_zone``"},{"line_number":99,"context_line":"value is not ``null``, an HTTP 409 Conflict response will be returned."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"No additional schema changes are needed."},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"138fedb8_b09a6b96","line":99,"range":{"start_line":95,"start_character":0,"end_line":99,"end_character":70},"in_reply_to":"d49e2c86_d61beb0e","updated":"2026-04-30 17:04:59.000000000","message":"I think maybe this meant to just put the REST snippets here, which I\u0027ve done. If not, please clarify :)","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"ac4f7ad3620735969f19cbb656205923b72634c2","unresolved":true,"context_lines":[{"line_number":167,"context_line":"Testing"},{"line_number":168,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"Unit tests should be sufficient in-tree. A tempest test should be"},{"line_number":171,"context_line":"added to verify that the value can be unset, reset to the current AZ,"},{"line_number":172,"context_line":"and not to any other AZ."},{"line_number":173,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"6863221c_fa6b5b5a","line":170,"updated":"2026-04-30 13:52:28.000000000","message":"Why no in-tree functional tests? I think functional tests would be valuable\nhere to cover some of the trickier scenarios, like ensuring the operation\nis blocked during certain instance states (e.g. RESIZE) or verifying the 409\nConflict behavior.\nThese feel like they\u0027d be easier to test thoroughly in the functional\nframework than in tempest alone.\n\nBut maybe I\u0027m missing something or haven\u0027t looked closely enough at what we currently have in that area.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"14ead111a36a34ea909fded6262a83d94a9f6cf8","unresolved":true,"context_lines":[{"line_number":167,"context_line":"Testing"},{"line_number":168,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"Unit tests should be sufficient in-tree. A tempest test should be"},{"line_number":171,"context_line":"added to verify that the value can be unset, reset to the current AZ,"},{"line_number":172,"context_line":"and not to any other AZ."},{"line_number":173,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"78d52a79_f14dedb6","line":170,"in_reply_to":"6863221c_fa6b5b5a","updated":"2026-04-30 14:18:01.000000000","message":"Well, because (per above) I don\u0027t think we need to create a bunch of \"trickier scenarios\" and this becomes a pretty simple workflow. But if you/others disagree with my comment above then perhaps this needs to change :)","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"bba8d9a7b7db02eb803e8badc382bb8fef83e009","unresolved":true,"context_lines":[{"line_number":167,"context_line":"Testing"},{"line_number":168,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"Unit tests should be sufficient in-tree. A tempest test should be"},{"line_number":171,"context_line":"added to verify that the value can be unset, reset to the current AZ,"},{"line_number":172,"context_line":"and not to any other AZ."},{"line_number":173,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"bd670834_6f6c3d5f","line":170,"in_reply_to":"78d52a79_f14dedb6","updated":"2026-05-05 13:26:52.000000000","message":"I still think having a couple of functional tests would be valuable here. Even\nif the scenarios are straightforward, having a few in-tree functional tests\nto validate this new API behavior (unpin, repin, 409 on invalid transition)\nwould make me more comfortable.\nIt\u0027s a new API capability and I think it deserves at least some functional coverage beyond unit tests.\nPlus, functional tests also serve as living documentation and a reference for\nfuture similar work.\nYes, I know I\u0027m being a bit annoying on this one :)","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"48027528fb190708427adf3099abbd524b856e13","unresolved":false,"context_lines":[{"line_number":167,"context_line":"Testing"},{"line_number":168,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"Unit tests should be sufficient in-tree. A tempest test should be"},{"line_number":171,"context_line":"added to verify that the value can be unset, reset to the current AZ,"},{"line_number":172,"context_line":"and not to any other AZ."},{"line_number":173,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"5c96800f_0f537e98","line":170,"in_reply_to":"bd670834_6f6c3d5f","updated":"2026-05-05 14:03:26.000000000","message":"Done","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"ac4f7ad3620735969f19cbb656205923b72634c2","unresolved":true,"context_lines":[{"line_number":184,"context_line":"only possible at create time) will be adjusted. Text will also be"},{"line_number":185,"context_line":"added to explain the unpinning workflow, with the requirements for"},{"line_number":186,"context_line":"re-pinning."},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"References"},{"line_number":189,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"e25ec294_d43cd3d6","line":187,"updated":"2026-04-30 13:52:28.000000000","message":"The Documentation section could also cover the operational consequences of\nunpinning. If I recall correctly, this was discussed during the PTG — once\nunpinned, a subsequent migration could land the instance on any host in any\nAZ, which might not be what the user expects.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"bba8d9a7b7db02eb803e8badc382bb8fef83e009","unresolved":false,"context_lines":[{"line_number":184,"context_line":"only possible at create time) will be adjusted. Text will also be"},{"line_number":185,"context_line":"added to explain the unpinning workflow, with the requirements for"},{"line_number":186,"context_line":"re-pinning."},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"References"},{"line_number":189,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fd2dfa26_5d75aaa0","line":187,"in_reply_to":"24cca08a_276133a6","updated":"2026-05-05 13:26:52.000000000","message":"Ok, fine with handling this in the doc patch. Just making sure we cover\nboth the unpinning workflow implications and the cross_az_attach\u003dFalse case\nas discussed.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"14ead111a36a34ea909fded6262a83d94a9f6cf8","unresolved":true,"context_lines":[{"line_number":184,"context_line":"only possible at create time) will be adjusted. Text will also be"},{"line_number":185,"context_line":"added to explain the unpinning workflow, with the requirements for"},{"line_number":186,"context_line":"re-pinning."},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"References"},{"line_number":189,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"24cca08a_276133a6","line":187,"in_reply_to":"e25ec294_d43cd3d6","updated":"2026-04-30 14:18:01.000000000","message":"I think that\u0027s covered in \"explain the unpinning workflow\", in my head at least. I think it should probably be reasonably clear when discussing it as \"removing a pin\" that it would be migrate-able anywhere at the time. Especially since a regular user would only be able to unpin but not do the (targeted) migration on their own, there\u0027s really no outcome of unpinning _other_ than potentially moving to another AZ on the next migration :)\n\nEither way, I think we can hash that out in the patch to add the docs unless you think we need actual verbiage here for pre-approval.","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"ac4f7ad3620735969f19cbb656205923b72634c2","unresolved":false,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"* Nova 2026.2 PTG `discussion`_"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":".. _discussion: https://etherpad.opendev.org/p/nova-2026.2-ptg"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"History"}],"source_content_type":"text/x-rst","patch_set":2,"id":"d0cfe3d4_c9b8bca1","line":193,"updated":"2026-04-30 13:52:28.000000000","message":"+1 cool to link to the PTG discussion","commit_id":"345faaf0b0a2166ace39e80a319f0d08b608d18b"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"f402b6515f7207b0170177d48399f7c4c8d87f1b","unresolved":true,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"If the AZ is changed to a non-``null`` value that does not match the"},{"line_number":63,"context_line":"current AZ, an HTTP 409 Conflict response will be returned. The"},{"line_number":64,"context_line":"ability to go from one AZ directly to another (even if current) AZ is"},{"line_number":65,"context_line":"not allowed because we do not want to further support moving the"},{"line_number":66,"context_line":"instance (via forced migration) between AZs and fixing up the"},{"line_number":67,"context_line":"inconsistency afterwards. This is in support of a potential further"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9594da90_49b3538d","line":64,"range":{"start_line":64,"start_character":46,"end_line":64,"end_character":63},"updated":"2026-05-02 04:53:30.000000000","message":"I am thinking if we can support this case if AZ is directing updated to the current one. I am thinking of use case where compute host is moved to new AZ and operator want to move that compute\u0027s VMs of the old to new AZ of compute host.\n\nWith the current proposal, it will be a two steps process 1. unpin AZ 2. pin it to new AZ. Which is also fine but if it can be just a single step then it is more better 1. update AZ to current AZ.","commit_id":"ea6ef766e7474f8d791aea0beba3281b5fc08eb1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"55948f390e8a0fdeaefc50ea7a3e4110028f2a0f","unresolved":true,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"If the AZ is changed to a non-``null`` value that does not match the"},{"line_number":63,"context_line":"current AZ, an HTTP 409 Conflict response will be returned. The"},{"line_number":64,"context_line":"ability to go from one AZ directly to another (even if current) AZ is"},{"line_number":65,"context_line":"not allowed because we do not want to further support moving the"},{"line_number":66,"context_line":"instance (via forced migration) between AZs and fixing up the"},{"line_number":67,"context_line":"inconsistency afterwards. This is in support of a potential further"}],"source_content_type":"text/x-rst","patch_set":3,"id":"dd270005_6c768ea1","line":64,"range":{"start_line":64,"start_character":46,"end_line":64,"end_character":63},"in_reply_to":"4eb825db_43299c75","updated":"2026-05-05 16:33:35.000000000","message":"Those words are trying to say the same thing here, but perhaps the lossy compression has made it too complicated. I will reword L113 to make it clearer.","commit_id":"ea6ef766e7474f8d791aea0beba3281b5fc08eb1"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"bba8d9a7b7db02eb803e8badc382bb8fef83e009","unresolved":true,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"If the AZ is changed to a non-``null`` value that does not match the"},{"line_number":63,"context_line":"current AZ, an HTTP 409 Conflict response will be returned. The"},{"line_number":64,"context_line":"ability to go from one AZ directly to another (even if current) AZ is"},{"line_number":65,"context_line":"not allowed because we do not want to further support moving the"},{"line_number":66,"context_line":"instance (via forced migration) between AZs and fixing up the"},{"line_number":67,"context_line":"inconsistency afterwards. This is in support of a potential further"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bf90d53f_6c995592","line":64,"range":{"start_line":64,"start_character":46,"end_line":64,"end_character":63},"in_reply_to":"9594da90_49b3538d","updated":"2026-05-05 13:26:52.000000000","message":"I don\u0027t have a strong opinion on this one. Requiring a systematic unpin/repin\nfeels more natural to me, but I can see the value of a single-step update for\nthe use case Ghanshyam describes. I\u0027ll defer to what the majority prefers here.","commit_id":"ea6ef766e7474f8d791aea0beba3281b5fc08eb1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"48027528fb190708427adf3099abbd524b856e13","unresolved":true,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"If the AZ is changed to a non-``null`` value that does not match the"},{"line_number":63,"context_line":"current AZ, an HTTP 409 Conflict response will be returned. The"},{"line_number":64,"context_line":"ability to go from one AZ directly to another (even if current) AZ is"},{"line_number":65,"context_line":"not allowed because we do not want to further support moving the"},{"line_number":66,"context_line":"instance (via forced migration) between AZs and fixing up the"},{"line_number":67,"context_line":"inconsistency afterwards. This is in support of a potential further"}],"source_content_type":"text/x-rst","patch_set":3,"id":"c64bc394_52f246f8","line":64,"range":{"start_line":64,"start_character":46,"end_line":64,"end_character":63},"in_reply_to":"bf90d53f_6c995592","updated":"2026-05-05 14:03:26.000000000","message":"Ah, gmann you\u0027re talking about a case where the operator has force-migrated the instance to a place that violates the current pin and you want to be able to just fix it in a single operation if it matches?\n\nI guess I can see that argument and I\u0027m not necessarily opposed to it. However, it just seems more simple and clear (from a \"rules\" point of view) to make it only ever az-\u003enull and null-\u003eaz, even if that specific case would require two operations instead of one. But if you or others feel strongly I can remove that \"(even if current)\" restriction and change the language accordingly.","commit_id":"ea6ef766e7474f8d791aea0beba3281b5fc08eb1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"98051849fe2ccd9aa1cffeea35d76f938120ec8a","unresolved":true,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"If the AZ is changed to a non-``null`` value that does not match the"},{"line_number":63,"context_line":"current AZ, an HTTP 409 Conflict response will be returned. The"},{"line_number":64,"context_line":"ability to go from one AZ directly to another (even if current) AZ is"},{"line_number":65,"context_line":"not allowed because we do not want to further support moving the"},{"line_number":66,"context_line":"instance (via forced migration) between AZs and fixing up the"},{"line_number":67,"context_line":"inconsistency afterwards. This is in support of a potential further"}],"source_content_type":"text/x-rst","patch_set":3,"id":"4eb825db_43299c75","line":64,"range":{"start_line":64,"start_character":46,"end_line":64,"end_character":63},"in_reply_to":"c64bc394_52f246f8","updated":"2026-05-05 15:34:43.000000000","message":"I am fine with two steps also (\u0027rules\u0027 or a simple, strict policy is a good point, especially for AZ modification from API point of view). CLI can make it single step if needed.\n\nOne update request, L113 stats different whihc mean it is allowed to update az-\u003eaz (or is it just my bad reading?) (https://review.opendev.org/c/openstack/nova-specs/+/986539/comment/35ebcbe4_fb186d06/)","commit_id":"ea6ef766e7474f8d791aea0beba3281b5fc08eb1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0ed1b6f19a013d622b2fe689e3ada1a51a316aee","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"If the AZ is changed to a non-``null`` value that does not match the"},{"line_number":63,"context_line":"current AZ, an HTTP 409 Conflict response will be returned. The"},{"line_number":64,"context_line":"ability to go from one AZ directly to another (even if current) AZ is"},{"line_number":65,"context_line":"not allowed because we do not want to further support moving the"},{"line_number":66,"context_line":"instance (via forced migration) between AZs and fixing up the"},{"line_number":67,"context_line":"inconsistency afterwards. This is in support of a potential further"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f05099a_4cd325b5","line":64,"range":{"start_line":64,"start_character":46,"end_line":64,"end_character":63},"in_reply_to":"dd270005_6c768ea1","updated":"2026-05-05 16:50:13.000000000","message":"Done","commit_id":"ea6ef766e7474f8d791aea0beba3281b5fc08eb1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"f402b6515f7207b0170177d48399f7c4c8d87f1b","unresolved":false,"context_lines":[{"line_number":62,"context_line":"If the AZ is changed to a non-``null`` value that does not match the"},{"line_number":63,"context_line":"current AZ, an HTTP 409 Conflict response will be returned. The"},{"line_number":64,"context_line":"ability to go from one AZ directly to another (even if current) AZ is"},{"line_number":65,"context_line":"not allowed because we do not want to further support moving the"},{"line_number":66,"context_line":"instance (via forced migration) between AZs and fixing up the"},{"line_number":67,"context_line":"inconsistency afterwards. This is in support of a potential further"},{"line_number":68,"context_line":"optimization for move operations themselves."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Since the AZ is normally something fully under the control of the"}],"source_content_type":"text/x-rst","patch_set":3,"id":"8d52fffe_cdb2b2bf","line":67,"range":{"start_line":65,"start_character":12,"end_line":67,"end_character":26},"updated":"2026-05-02 04:53:30.000000000","message":"++, agree on that and if we need then it should be supported in moving operations instead of allowing AZ update to something which can be problematic.","commit_id":"ea6ef766e7474f8d791aea0beba3281b5fc08eb1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"f402b6515f7207b0170177d48399f7c4c8d87f1b","unresolved":false,"context_lines":[{"line_number":108,"context_line":"---------------"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"In a new microversion, we will provide mutability of the"},{"line_number":111,"context_line":"``pinned_availability_zone`` field via ``PUT"},{"line_number":112,"context_line":"/servers/{server_id}``. Normal response code will be HTTP 200. If the"},{"line_number":113,"context_line":"availability zone is changed to a non-``null`` value that does not"},{"line_number":114,"context_line":"match the current AZ, or the current ``pinned_availability_zone``"}],"source_content_type":"text/x-rst","patch_set":3,"id":"d451bf7a_30f7a689","line":111,"range":{"start_line":111,"start_character":2,"end_line":111,"end_character":26},"updated":"2026-05-02 04:53:30.000000000","message":"++ on matching it with existing response field.","commit_id":"ea6ef766e7474f8d791aea0beba3281b5fc08eb1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"f402b6515f7207b0170177d48399f7c4c8d87f1b","unresolved":true,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":"In a new microversion, we will provide mutability of the"},{"line_number":111,"context_line":"``pinned_availability_zone`` field via ``PUT"},{"line_number":112,"context_line":"/servers/{server_id}``. Normal response code will be HTTP 200. If the"},{"line_number":113,"context_line":"availability zone is changed to a non-``null`` value that does not"},{"line_number":114,"context_line":"match the current AZ, or the current ``pinned_availability_zone``"},{"line_number":115,"context_line":"value is not ``null``, an HTTP 409 Conflict response will be returned."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"The \"unpin\" operation would be::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"35ebcbe4_fb186d06","line":114,"range":{"start_line":112,"start_character":63,"end_line":114,"end_character":21},"updated":"2026-05-02 04:53:30.000000000","message":"this means user can update AZ from old to new AZ(current AZ) if so then that is what conflicting with the L64. I think we should support this.","commit_id":"ea6ef766e7474f8d791aea0beba3281b5fc08eb1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0ed1b6f19a013d622b2fe689e3ada1a51a316aee","unresolved":false,"context_lines":[{"line_number":109,"context_line":""},{"line_number":110,"context_line":"In a new microversion, we will provide mutability of the"},{"line_number":111,"context_line":"``pinned_availability_zone`` field via ``PUT"},{"line_number":112,"context_line":"/servers/{server_id}``. Normal response code will be HTTP 200. If the"},{"line_number":113,"context_line":"availability zone is changed to a non-``null`` value that does not"},{"line_number":114,"context_line":"match the current AZ, or the current ``pinned_availability_zone``"},{"line_number":115,"context_line":"value is not ``null``, an HTTP 409 Conflict response will be returned."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"The \"unpin\" operation would be::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"97521aa1_4a263208","line":114,"range":{"start_line":112,"start_character":63,"end_line":114,"end_character":21},"in_reply_to":"35ebcbe4_fb186d06","updated":"2026-05-05 16:50:13.000000000","message":"Acknowledged","commit_id":"ea6ef766e7474f8d791aea0beba3281b5fc08eb1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"548ab9cc9221b346bc905667c451d19d4a02578c","unresolved":true,"context_lines":[{"line_number":37,"context_line":"  being retired to a new one because of an upgrade."},{"line_number":38,"context_line":"- As an application deployer, I may need to move an instance to a"},{"line_number":39,"context_line":"  different AZ than the one I originally selected in order to adapt to"},{"line_number":40,"context_line":"  changing HA needs."},{"line_number":41,"context_line":"- As an application deployer I may need to reverse a decision to pin"},{"line_number":42,"context_line":"  an instance to a given AZ without having to delete and recreate the instance."},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"b867b4d0_f731d4e9","line":40,"updated":"2026-05-06 07:35:55.000000000","message":"What are the steps to fulfill this need with the proposed solution? Assume current AZ is A and desired AZ is B.\n0. VM has pinnned_availablity_zone \u003d A, OS-EXT-AZ:availability_zone \u003d A\n1. app deployer uses the new PUT request to set pinnned_availablity_zone to null\n2. ??? somehow the VM is moved so that OS-EXT-AZ:availability_zone \u003d B\n3. app deployer uses the new PUT request to set pinnned_availablity_zone to B\n\nWhat is step 2? Is it live migration with target host in AZ B? That is an admin operation so the application deployer cannot do it. Is it shelve / unshelve with target host in AZ B? That is not really different from the today\u0027s way to move across AZs really so the app deployer gain nothing with the new workflow.\n\n---\nI\u0027m a bit confused how this will really help to move to a specific AZ. I see it helps with allowing that future admin action, if ever happens, moves the VM out from current AZ. But it does not give a way to the user to specify which AZ, or to trigger the actual move.","commit_id":"c6b77f93fd81844daaa06efc181e7e0261031b63"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0e0e30d3f0900fe3e3ee67057b0d548442d77350","unresolved":true,"context_lines":[{"line_number":37,"context_line":"  being retired to a new one because of an upgrade."},{"line_number":38,"context_line":"- As an application deployer, I may need to move an instance to a"},{"line_number":39,"context_line":"  different AZ than the one I originally selected in order to adapt to"},{"line_number":40,"context_line":"  changing HA needs."},{"line_number":41,"context_line":"- As an application deployer I may need to reverse a decision to pin"},{"line_number":42,"context_line":"  an instance to a given AZ without having to delete and recreate the instance."},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"dd9e74f9_48ded2b8","line":40,"in_reply_to":"23b980f5_03220501","updated":"2026-05-06 18:10:44.000000000","message":"I imagine gibi is done for the day already, so I\u0027ll amend this to make it clear that this case does not magically imply users being able to migrate their instances across AZs. Hopefully that will address the concern enough but if not, we can iterate from there.","commit_id":"c6b77f93fd81844daaa06efc181e7e0261031b63"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3b733508d47895f7795e51dea3abc4c157840726","unresolved":true,"context_lines":[{"line_number":37,"context_line":"  being retired to a new one because of an upgrade."},{"line_number":38,"context_line":"- As an application deployer, I may need to move an instance to a"},{"line_number":39,"context_line":"  different AZ than the one I originally selected in order to adapt to"},{"line_number":40,"context_line":"  changing HA needs."},{"line_number":41,"context_line":"- As an application deployer I may need to reverse a decision to pin"},{"line_number":42,"context_line":"  an instance to a given AZ without having to delete and recreate the instance."},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"23b980f5_03220501","line":40,"in_reply_to":"94579cdb_04b4206d","updated":"2026-05-06 17:51:36.000000000","message":"I thought of a manager role user who can live-migrate their VMs. If their VMs are not in the same AZ as the compute host (e.g., the compute host has been moved to a new AZ or AZs are mismatched by some other way), they can unblock the migration by fixing the pinned AZ.","commit_id":"c6b77f93fd81844daaa06efc181e7e0261031b63"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"84d27009aa3eb885d2f498f458071c3cbcb8fb9f","unresolved":true,"context_lines":[{"line_number":37,"context_line":"  being retired to a new one because of an upgrade."},{"line_number":38,"context_line":"- As an application deployer, I may need to move an instance to a"},{"line_number":39,"context_line":"  different AZ than the one I originally selected in order to adapt to"},{"line_number":40,"context_line":"  changing HA needs."},{"line_number":41,"context_line":"- As an application deployer I may need to reverse a decision to pin"},{"line_number":42,"context_line":"  an instance to a given AZ without having to delete and recreate the instance."},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"94579cdb_04b4206d","line":40,"in_reply_to":"b867b4d0_f731d4e9","updated":"2026-05-06 13:44:48.000000000","message":"Maybe I should choose a different name other than \"application deployer\" to describe this entity. I\u0027m thinking about private clouds where Nova is just IaaS (like a lot of telco clouds) and the user/operator are close or there are additional roles here for higher-trust people. We specifically used live-migration as an example to justify the existence of the project-manager role:\n\nhttps://governance.openstack.org/tc/goals/selected/consistent-and-secure-rbac.html#phase-3\n\nSomeone adding local policy like that could have the additional permissions in order to manage workloads and move things around (think the octavia backup balancer).\n\nAlso (and maybe I should have just added this as a separate item), watcher would be another good example of an external not-quite-admin entity that would need to be able to unpin in order to do what it does, which is migrate things around according to various strategies.\n\nEither way, even when we do close on adding target AZ to migration operations, that wouldn\u0027t really open it up directly to the user either. Users can only really resize by default, so yeah they could resize just to move AZs, but that would involve cost and downtime which is kinda the thing we\u0027re trying to avoid here in the first place. So, I don\u0027t think that makes this any more or less true.","commit_id":"c6b77f93fd81844daaa06efc181e7e0261031b63"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"548ab9cc9221b346bc905667c451d19d4a02578c","unresolved":true,"context_lines":[{"line_number":86,"context_line":"In the future, we should add the ability for move operations to"},{"line_number":87,"context_line":"specifically move an instance to a specific AZ (i.e. the AZ equivalent"},{"line_number":88,"context_line":"of target host). This spec does not include this work, and only opens"},{"line_number":89,"context_line":"the workflow of unpin-move-repin."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"Alternatives"},{"line_number":92,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"a5dea586_13eac7f1","line":89,"range":{"start_line":89,"start_character":16,"end_line":89,"end_character":33},"updated":"2026-05-06 07:35:55.000000000","message":"unfortunately we have a mistamtch of who can do what in the unpin-move-repin sequence. Admin can move, user can unpin and repin. See my comment above","commit_id":"c6b77f93fd81844daaa06efc181e7e0261031b63"}]}
