)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":38814,"name":"Marco","display_name":"Marco Favero","email":"m.faverof@gmail.com","username":"m-faverof"},"change_message_id":"bffb9305b849100a75d0a0d7b537b1b3da4d0d9e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"8e589be6_3b94457d","updated":"2026-02-04 15:57:04.000000000","message":"Hello, I\u0027m still interested on this patch. Could you reopen it?","commit_id":"089017f98a60c8420844c971c71c43d738124d64"},{"author":{"_account_id":38814,"name":"Marco","display_name":"Marco Favero","email":"m.faverof@gmail.com","username":"m-faverof"},"change_message_id":"adb95c1eceba68cf6a8c8c0b34f13252d1c0f8f9","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"6e27fdfe_20ad35aa","updated":"2026-02-10 10:16:38.000000000","message":"I\u0027m rebasing this patch.\n\nWhat do you think about the following?\n\n```\nTASK [Try server action RESIZE] *******************************************************************************************************************************************************************\nfatal: [localhost]: FAILED! \u003d\u003e {\"changed\": false, \"msg\": \"When resizing, instances must change flavor! Got: my-flavor\"}\n```\n\nIf I set the same flavor already present in the instance, I wonder if the task should fail as written by @biryukov.andrej2000@mail.ru, or if the task should return \"ok\", like the idempotency of Ansible suggests.","commit_id":"089017f98a60c8420844c971c71c43d738124d64"},{"author":{"_account_id":32962,"name":"Jakob Meng","email":"code@jakobmeng.de","username":"jakobmeng@web.de"},"change_message_id":"c3b551e6b7f71f9fa41f2cbf8ac9040b75eb953d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"f5970194_c7dc50b0","updated":"2022-06-27 07:16:06.000000000","message":"Thank you for your patch 😊 Unfortunately our server module is broken with openstacksdk 0.99.x/1.0.0 and has not been fixed yet, its work in progress. We will get back to your patch once the module is done and our ci for that module is working again","commit_id":"089017f98a60c8420844c971c71c43d738124d64"},{"author":{"_account_id":34958,"name":"Andrew Biryukov","display_name":"biryukov-andrej","email":"biryukov.andrej2000@mail.ru","username":"biryukov-andrej"},"change_message_id":"31868d87172fe763a9ba05ebd8014b9a95d57320","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"b4a21814_75a88944","in_reply_to":"478cd0ca_e56d9494","updated":"2026-02-10 13:41:00.000000000","message":"I pushed the proposed changes and it seems I fixed the Zuul tests, but I still need the review to be approved","commit_id":"089017f98a60c8420844c971c71c43d738124d64"},{"author":{"_account_id":34958,"name":"Andrew Biryukov","display_name":"biryukov-andrej","email":"biryukov.andrej2000@mail.ru","username":"biryukov-andrej"},"change_message_id":"ed86382d5965c41fe3e2345b1d894b5ee415a2f1","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"b4ae4557_81625cd5","in_reply_to":"6e27fdfe_20ad35aa","updated":"2026-02-10 10:27:45.000000000","message":"Hello! Thank you for your interest in my old PR. You are absolutely right — if the same flavor as the instance was specified, the module should work as expected. However, it seems that at that time the OpenStack SDK behaved this way — if it was given the same flavor as input, it would crash with an error.","commit_id":"089017f98a60c8420844c971c71c43d738124d64"},{"author":{"_account_id":38814,"name":"Marco","display_name":"Marco Favero","email":"m.faverof@gmail.com","username":"m-faverof"},"change_message_id":"5a2e79434db754c4ecbd0aa2fe586477a1981d49","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"a16e73e6_683b2f66","in_reply_to":"8e589be6_3b94457d","updated":"2026-02-10 10:15:33.000000000","message":"Done","commit_id":"089017f98a60c8420844c971c71c43d738124d64"},{"author":{"_account_id":38814,"name":"Marco","display_name":"Marco Favero","email":"m.faverof@gmail.com","username":"m-faverof"},"change_message_id":"a96ab9ef175b8269afe2c51763eeceee65a474dd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"3cd64d0a_6e5d6193","in_reply_to":"94a438c2_15e0d388","updated":"2026-02-10 15:12:22.000000000","message":"Thank you!","commit_id":"089017f98a60c8420844c971c71c43d738124d64"},{"author":{"_account_id":34958,"name":"Andrew Biryukov","display_name":"biryukov-andrej","email":"biryukov.andrej2000@mail.ru","username":"biryukov-andrej"},"change_message_id":"f86463d559bd6fbc0977aa34658407f37b2abae0","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"478cd0ca_e56d9494","in_reply_to":"958dc040_62f00cd2","updated":"2026-02-10 13:15:07.000000000","message":"Thanks for the patch! I adopted the changes!","commit_id":"089017f98a60c8420844c971c71c43d738124d64"},{"author":{"_account_id":38814,"name":"Marco","display_name":"Marco Favero","email":"m.faverof@gmail.com","username":"m-faverof"},"change_message_id":"ada776fe9b80f3cac5bdc3723f1369e9953ec7b1","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"f7059eea_a2482d5e","in_reply_to":"b4a21814_75a88944","updated":"2026-02-10 13:50:59.000000000","message":"Wow, thank you @biryukov.andrej2000@mail.ru!\nIf you would like, you coud add the entire server object to the result. In end of `def run()`:\n```\n-        self.exit_json(changed\u003dTrue)\n+        result\u003d{\"changed\": True, \"server\": server.to_dict(computed\u003dFalse)}\n+        self.exit_json(**result)\n```","commit_id":"089017f98a60c8420844c971c71c43d738124d64"},{"author":{"_account_id":38814,"name":"Marco","display_name":"Marco Favero","email":"m.faverof@gmail.com","username":"m-faverof"},"change_message_id":"1b714b5980ea72e435f441013ecb47461d041c34","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"958dc040_62f00cd2","in_reply_to":"b4ae4557_81625cd5","updated":"2026-02-10 12:46:54.000000000","message":"Hello Andrej,\n  thank you for submitting a rebased patch! Great work.\n  \nI would like to submit my one, but it seems I can\u0027t. I created an account and I reset the HTTP password, but I can\u0027t authenticate in `git review` (`Authentication failed for \u0027https://opendev.org/openstack/ansible-collections-openstack.git/`).\n\nI leave my contribute here if something could help:\n\n```\ndiff --git a/plugins/modules/server_action.py b/plugins/modules/server_action.py\nindex 9af103c..94036cd 100644\n--- a/plugins/modules/server_action.py\n+++ b/plugins/modules/server_action.py\n@@ -18,7 +18,7 @@ options:\n       - By default, only server owners and administrators are allowed to\n         perform actions C(pause), C(unpause), C(suspend), C(resume), C(lock),\n         C(unlock) and C(shelve_offload).\n-    choices: [lock, pause, reboot_hard, reboot_soft, rebuild, resume, shelve,\n+    choices: [lock, pause, reboot_hard, reboot_soft, rebuild, resize, confirm_resize, revert_resize, resume, shelve,\n               shelve_offload, start, stop, suspend, unlock, unpause, unshelve]\n     type: str\n     required: true\n@@ -32,6 +32,10 @@ options:\n         only.\n     type: bool\n     default: false\n+  flavor:\n+    description:\n+      - Flavor the server should be resized with.\n+    type: str\n   image:\n     description:\n       - Image name or ID the server should be rebuilt with.\n@@ -53,6 +57,22 @@ EXAMPLES \u003d r\u0027\u0027\u0027\n     action: pause\n     server: vm1\n     timeout: 200\n+\n+# Resize a compute instance\n+- openstack.cloud.server_action:\n+    action: resize\n+    server: server_name\n+    flavor: new_flavor_name\n+\n+# Confirm resize of a compute instance\n+- openstack.cloud.server_action:\n+    action: confirm_resize\n+    server: server_name\n+\n+# Revert resize of a compute instance\n+- openstack.cloud.server_action:\n+    action: revert_resize\n+    server: server_name\n \u0027\u0027\u0027\n\n from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule\n@@ -63,16 +83,21 @@ class ServerActionModule(OpenStackModule):\n         action\u003ddict(required\u003dTrue,\n                     choices\u003d[\u0027stop\u0027, \u0027start\u0027, \u0027pause\u0027, \u0027unpause\u0027,\n                              \u0027lock\u0027, \u0027unlock\u0027, \u0027suspend\u0027, \u0027reboot_soft\u0027,\n-                             \u0027reboot_hard\u0027, \u0027resume\u0027, \u0027rebuild\u0027, \u0027shelve\u0027,\n-                             \u0027shelve_offload\u0027, \u0027unshelve\u0027]),\n+                             \u0027reboot_hard\u0027, \u0027resume\u0027, \u0027rebuild\u0027, \u0027resize\u0027,\n+                             \u0027confirm_resize\u0027, \u0027revert_resize\u0027, \u0027shelve\u0027, \u0027shelve_offload\u0027,\n+                             \u0027unshelve\u0027]),\n         admin_password\u003ddict(no_log\u003dTrue),\n         all_projects\u003ddict(type\u003d\u0027bool\u0027, default\u003dFalse),\n+        flavor\u003ddict(type\u003d\u0027str\u0027),\n         image\u003ddict(),\n         name\u003ddict(required\u003dTrue, aliases\u003d[\u0027server\u0027]),\n     )\n\n     module_kwargs \u003d dict(\n-        required_if\u003d[(\u0027action\u0027, \u0027rebuild\u0027, [\u0027image\u0027])],\n+        required_if\u003d[\n+            (\u0027action\u0027, \u0027rebuild\u0027, [\u0027image\u0027]),\n+            (\u0027action\u0027, \u0027resize\u0027, [\u0027flavor\u0027]),\n+        ],\n         supports_check_mode\u003dTrue,\n     )\n\n@@ -114,10 +139,52 @@ class ServerActionModule(OpenStackModule):\n                    \u0027reboot_hard\u0027: [\u0027ACTIVE\u0027],\n                    \u0027resume\u0027: [\u0027ACTIVE\u0027],\n                    \u0027rebuild\u0027: [\u0027ACTIVE\u0027],\n+                   \u0027resize\u0027: [\u0027VERIFY_RESIZE\u0027],\n+                   \u0027confirm_resize\u0027: [\u0027ACTIVE\u0027],\n+                   \u0027revert_resize\u0027: [\u0027ACTIVE\u0027],\n                    \u0027shelve\u0027: [\u0027SHELVED_OFFLOADED\u0027, \u0027SHELVED\u0027],\n                    \u0027shelve_offload\u0027: [\u0027SHELVED_OFFLOADED\u0027],\n                    \u0027unshelve\u0027: [\u0027ACTIVE\u0027]}\n\n+    def _confirm_resize_server(self, server):\n+        if server[\u0027status\u0027] \u003d\u003d self._action_map[\u0027resize\u0027][0]:\n+            self.conn.compute.confirm_server_resize(\n+                server\u003dserver\n+            )\n+        elif server[\u0027status\u0027] !\u003d self._action_map[\u0027confirm_resize\u0027][0]:\n+            self.fail_json(\n+                msg\u003d\"Status must be %s. Got: %s\" % (self._action_map[\u0027resize\u0027][0], server[\u0027status\u0027]))\n+\n+    def _revert_resize_server(self, server):\n+        if server[\u0027status\u0027] \u003d\u003d self._action_map[\u0027resize\u0027][0]:\n+            self.conn.compute.revert_server_resize(\n+                server\u003dserver\n+            )\n+        elif server[\u0027status\u0027] !\u003d self._action_map[\u0027revert_resize\u0027][0]:\n+            self.fail_json(\n+                msg\u003d\"Status must be %s. Got: %s\" % (self._action_map[\u0027resize\u0027][0], server[\u0027status\u0027]))\n+\n+    def _resize_server(self, server):\n+        # resize should ensure flavor exists\n+        try:\n+            flavor \u003d self.conn.compute.find_flavor(self.params[\u0027flavor\u0027])\n+        except Exception as e:\n+            self.fail_json(\n+                msg\u003d\"Can\u0027t find the flavor %s: %s\" % (self.params[\u0027flavor\u0027], e))\n+        if not flavor:\n+            self.fail_json(msg\u003d\"Flavor %s was not found!\" % self.params[\u0027flavor\u0027])\n+        if flavor.name \u003d\u003d server.flavor[\u0027original_name\u0027]:\n+            result\u003d{\"changed\": False, \"msg\": f\"When resizing, instances should change flavor! Got: {self.params[\u0027flavor\u0027]}\"}\n+            self.exit_json(**result)\n+        try:\n+            self.conn.compute.resize_server(\n+                server\u003dserver,\n+                flavor\u003dflavor[\u0027id\u0027]\n+            )\n+        except Exception as e:\n+            self.fail_json(\n+                msg\u003d f\"Resize failed: {e}\")\n+\n     def run(self):\n         # TODO: Replace with self.conn.compute.find_server(\n         #       self.params[\u0027name\u0027], all_projects\u003dself.params[\u0027all_projects\u0027],\n@@ -146,9 +213,11 @@ class ServerActionModule(OpenStackModule):\n                                              in self._action_map[action]])\n\n         if not will_change:\n-            self.exit_json(changed\u003dFalse)\n+            result \u003d {\"changed\": False}\n+            self.exit_json(**result)\n         elif self.ansible.check_mode:\n-            self.exit_json(changed\u003dTrue)\n+            result \u003d {\"changed\": True, \"server\": server.to_dict(computed\u003dFalse)}\n+            self.exit_json(**result)\n         # else perform action\n\n         if action \u003d\u003d \u0027rebuild\u0027:\n@@ -164,6 +233,12 @@ class ServerActionModule(OpenStackModule):\n                 kwargs[\u0027admin_password\u0027] \u003d admin_password\n\n             self.conn.compute.rebuild_server(**kwargs)\n+        elif action \u003d\u003d \u0027resize\u0027:\n+            self._resize_server(server)\n+        elif action \u003d\u003d \u0027confirm_resize\u0027:\n+            self._confirm_resize_server(server)\n+        elif action \u003d\u003d \u0027revert_resize\u0027:\n+            self._revert_resize_server(server)\n         elif action \u003d\u003d \u0027shelve_offload\u0027:\n             # TODO: Replace with shelve_offload function call when [0] has been\n             #       merged.\n@@ -208,13 +283,13 @@ class ServerActionModule(OpenStackModule):\n                 if server.status.lower() in states:\n                     break\n\n-        self.exit_json(changed\u003dTrue)\n+        result\u003d{\"changed\": True, \"server\": server.to_dict(computed\u003dFalse)}\n+        self.exit_json(**result)\n\n\n def main():\n     module \u003d ServerActionModule()\n     module()\n\n-\n if __name__ \u003d\u003d \u0027__main__\u0027:\n     main()\n```\n\n- I changed the action names \"confirm\" and \"revert\" in order to explicit the link with resize.\n- I added the server dict to the returned result as it happen in the server module.\n- I changed to ok the result when a resize action with the current flavor happens.","commit_id":"089017f98a60c8420844c971c71c43d738124d64"},{"author":{"_account_id":34958,"name":"Andrew Biryukov","display_name":"biryukov-andrej","email":"biryukov.andrej2000@mail.ru","username":"biryukov-andrej"},"change_message_id":"6d543bc43245da50a2021c88dac5205e2c6d022a","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"94a438c2_15e0d388","in_reply_to":"f7059eea_a2482d5e","updated":"2026-02-10 13:55:13.000000000","message":"Of course! Sorry, I missed that. Thanks!","commit_id":"089017f98a60c8420844c971c71c43d738124d64"},{"author":{"_account_id":38814,"name":"Marco","display_name":"Marco Favero","email":"m.faverof@gmail.com","username":"m-faverof"},"change_message_id":"5d636bbf76b83a21609450d2fb030ff5a42504e3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"3ac9dec7_08ab27b8","updated":"2026-02-10 15:08:44.000000000","message":"Excellent! Thank you very much","commit_id":"f3146a67174af9084a2164f220b1042ec45e04da"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"4d5a2f5fcdaa5f0783ca4897a92ed6ec813d4895","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"5c40432e_fdacefc0","updated":"2026-02-19 10:31:04.000000000","message":"recheck cinder internal error once again","commit_id":"f3146a67174af9084a2164f220b1042ec45e04da"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"c7cceba340f6a543588c8df33c056f133254d0a9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"4354d8e4_b18e19fb","updated":"2026-02-17 11:06:36.000000000","message":"recheck cinder internal server error","commit_id":"f3146a67174af9084a2164f220b1042ec45e04da"}]}
