From 560aa7c988a4226591b2f72f55914068939ac685 Mon Sep 17 00:00:00 2001 From: Justin Cinkelj Date: Tue, 14 Mar 2023 11:16:10 +0100 Subject: [PATCH] Wait of VMs to finish ACPI shutdown Signed-off-by: Justin Cinkelj --- .../tasks/shutdown_vms.yml | 6 +++ .../tasks/wait_vm_shutdown.yml | 45 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 roles/version_update_single_node/tasks/wait_vm_shutdown.yml diff --git a/roles/version_update_single_node/tasks/shutdown_vms.yml b/roles/version_update_single_node/tasks/shutdown_vms.yml index 7b9769571..411a90e82 100644 --- a/roles/version_update_single_node/tasks/shutdown_vms.yml +++ b/roles/version_update_single_node/tasks/shutdown_vms.yml @@ -15,6 +15,12 @@ register: vm_shutdown_result ignore_errors: true # if VMs fail to shut down without force, error will occur, so we skip and try on to shut down with force +# Wait up to 300 sec (30*10) +- name: Wait until VMs shutdown + include_tasks: wait_vm_shutdown.yml + loop: "{{ range(0, 30) | list }}" + when: version_update_all_vms_stopped | default(true) + - name: Show shutdown results ansible.builtin.debug: var: vm_shutdown_result diff --git a/roles/version_update_single_node/tasks/wait_vm_shutdown.yml b/roles/version_update_single_node/tasks/wait_vm_shutdown.yml new file mode 100644 index 000000000..50b171b84 --- /dev/null +++ b/roles/version_update_single_node/tasks/wait_vm_shutdown.yml @@ -0,0 +1,45 @@ +--- +- name: Wait on VMs to shutdown + block: + - name: Get all available running VMs + scale_computing.hypercore.vm_info: + register: version_update_vms + + - name: Show unique VM power states + ansible.builtin.debug: + msg: Unique VM power states {{ version_update_vms.records | map(attribute='power_state') | unique }} + +# HyperCore states +# RUNNING Currently running +# BLOCKED Blocked on a resource +# PAUSED Paused by the user +# SHUTDOWN Shutting down +# SHUTOFF Shut off +# CRASHED Crashed +# In ansible we have power_state (see FROM_HYPERCORE_TO_ANSIBLE_POWER_STATE): +# RUNNING="started", +# SHUTOFF="stopped", +# BLOCKED="blocked", +# PAUSED="paused", +# SHUTDOWN="shutdown", +# CRASHED="crashed", +# Do not include 'shutdown' - it means "shutting_down" +# States paused, blocked - might be safe to include, might not. Do not include yet. + - name: Set fact version_update_all_vms_stopped + ansible.builtin.set_fact: + version_update_all_vms_stopped: | + {{ + ( + version_update_vms.records | map(attribute='power_state') | unique) | + ansible.builtin.difference(['stopped', 'crashed'] + ) == [] + }} + + - name: Are all VMs stopped? + ansible.builtin.debug: + var: version_update_all_vms_stopped + + - name: Wait if VMs are still running + when: not version_update_all_vms_stopped + ansible.builtin.pause: + seconds: 10