From 852d971d50fc9daf1bf3813f6a467b1888cdefb0 Mon Sep 17 00:00:00 2001 From: Arnaud Morin Date: Mon, 5 Dec 2022 09:23:48 +0100 Subject: [PATCH] Add reboot and reboot_hard actions on server Reboot actions (both SOFT and HARD) were missing in ansible actions. Reboot is different than stop and start, because reboot (HARD) is asking openstack nova to recreate the libvirt XML, which is sometimes needed. Signed-off-by: Arnaud Morin Change-Id: I43a42010e7474f47020c8df2839f8584157c97a4 --- ci/roles/server/tasks/server_actions.yml | 44 ++++++++++++++++++++++-- plugins/modules/server_action.py | 24 ++++++++++--- 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/ci/roles/server/tasks/server_actions.yml b/ci/roles/server/tasks/server_actions.yml index 83ca9ba2..c5bc0de5 100644 --- a/ci/roles/server/tasks/server_actions.yml +++ b/ci/roles/server/tasks/server_actions.yml @@ -536,6 +536,46 @@ - info24.servers.0.status == 'ACTIVE' - server is not changed +- name: Reboot server (SOFT) + openstack.cloud.server_action: + cloud: "{{ cloud }}" + server: "{{ server_name }}" + action: reboot_soft + wait: true + register: server + +- name: Get info about server + openstack.cloud.server_info: + cloud: "{{ cloud }}" + server: "{{ server_name }}" + register: info25 + +- name: Ensure status for server is ACTIVE + assert: + that: + - info25.servers.0.status == 'ACTIVE' + - server is not changed + +- name: Reboot server (HARD) + openstack.cloud.server_action: + cloud: "{{ cloud }}" + server: "{{ server_name }}" + action: reboot_hard + wait: true + register: server + +- name: Get info about server + openstack.cloud.server_info: + cloud: "{{ cloud }}" + server: "{{ server_name }}" + register: info26 + +- name: Ensure status for server is ACTIVE + assert: + that: + - info26.servers.0.status == 'ACTIVE' + - server is not changed + - name: Delete server openstack.cloud.server: cloud: "{{ cloud }}" @@ -573,12 +613,12 @@ openstack.cloud.server_info: cloud: "{{ cloud_alt }}" server: "{{ server_alt_name }}" - register: info25 + register: info27 - name: Ensure status for server in alternate project is ACTIVE assert: that: - - info25.servers.0.status == 'ACTIVE' + - info27.servers.0.status == 'ACTIVE' - name: Try to stop server in alternate project openstack.cloud.server_action: diff --git a/plugins/modules/server_action.py b/plugins/modules/server_action.py index 77c3befa..87a03bab 100644 --- a/plugins/modules/server_action.py +++ b/plugins/modules/server_action.py @@ -34,8 +34,9 @@ options: description: - Perform the given action. The lock and unlock actions always return changed as the servers API does not provide lock status. - choices: [stop, start, pause, unpause, lock, unlock, suspend, resume, - rebuild, shelve, shelve_offload, unshelve] + choices: [stop, start, pause, unpause, lock, unlock, suspend, + reboot_soft, reboot_hard, resume, rebuild, shelve, + shelve_offload, unshelve] type: str required: true image: @@ -106,6 +107,8 @@ _action_map = {'stop': ['SHUTOFF'], 'lock': ['ACTIVE'], # API doesn't show lock/unlock status 'unlock': ['ACTIVE'], 'suspend': ['SUSPENDED'], + 'reboot_soft': ['ACTIVE'], + 'reboot_hard': ['ACTIVE'], 'resume': ['ACTIVE'], 'rebuild': ['ACTIVE'], 'shelve': ['SHELVED_OFFLOADED', 'SHELVED'], @@ -120,7 +123,7 @@ class ServerActionModule(OpenStackModule): server=dict(required=True), action=dict(required=True, choices=['stop', 'start', 'pause', 'unpause', - 'lock', 'unlock', 'suspend', 'resume', + 'lock', 'unlock', 'suspend', 'reboot_soft', 'reboot_hard', 'resume', 'rebuild', 'shelve', 'shelve_offload', 'unshelve']), image=dict(), admin_password=dict(no_log=True), @@ -165,12 +168,25 @@ class ServerActionModule(OpenStackModule): # shelve_offload is not supported in OpenstackSDK return self._action(os_server, json={'shelveOffload': None}) action_name = self.params['action'] + "_server" + + # reboot_* actions are using reboot_server method with an extra param + if self.params['action'] == 'reboot_soft' or self.params['action'] == 'reboot_hard': + action_name = 'reboot_server' + + # Try to grab method from OpenstackSDK try: func_name = getattr(self.conn.compute, action_name) except AttributeError: self.fail_json( msg="Method %s wasn't found in OpenstackSDK compute" % action_name) - func_name(os_server) + + # Do the action + if self.params['action'] == 'reboot_soft': + func_name(os_server, 'SOFT') + elif self.params['action'] == 'reboot_hard': + func_name(os_server, 'HARD') + else: + func_name(os_server) def _rebuild_server(self, os_server): # rebuild should ensure images exists