diff --git a/src/platform/backends/lxd/lxd_virtual_machine.cpp b/src/platform/backends/lxd/lxd_virtual_machine.cpp index 1be9e16513..a058f03958 100644 --- a/src/platform/backends/lxd/lxd_virtual_machine.cpp +++ b/src/platform/backends/lxd/lxd_virtual_machine.cpp @@ -231,8 +231,35 @@ void mp::LXDVirtualMachine::start() update_state(); } -void mp::LXDVirtualMachine::stop() +void mp::LXDVirtualMachine::stop(bool force) { + if (force) + { + auto present_state = current_state(); + + if (present_state != State::stopped && present_state != State::off) + { + const QJsonObject state_json{{"action", "stop"}, {"force", true}}; + + auto state_task = lxd_request(manager, "PUT", state_url(), state_json, 5000); + + try + { + lxd_wait(manager, base_url, state_task, 60000); + } + catch (const LXDNotFoundException&) + { + } + + state = State::stopped; + } + + if (update_shutdown_status) + update_state(); + + return; + } + std::unique_lock lock{state_mutex}; auto present_state = current_state(); @@ -263,9 +290,9 @@ void mp::LXDVirtualMachine::stop() update_state(); } -void mp::LXDVirtualMachine::shutdown() +void mp::LXDVirtualMachine::shutdown(bool force) { - stop(); + stop(force); } void mp::LXDVirtualMachine::suspend() diff --git a/src/platform/backends/lxd/lxd_virtual_machine.h b/src/platform/backends/lxd/lxd_virtual_machine.h index 58c0ef5df5..33856923fe 100644 --- a/src/platform/backends/lxd/lxd_virtual_machine.h +++ b/src/platform/backends/lxd/lxd_virtual_machine.h @@ -36,9 +36,9 @@ class LXDVirtualMachine final : public BaseVirtualMachine LXDVirtualMachine(const VirtualMachineDescription& desc, VMStatusMonitor& monitor, NetworkAccessManager* manager, const QUrl& base_url, const QString& bridge_name, const QString& storage_pool); ~LXDVirtualMachine() override; - void stop() override; + void stop(bool force = false) override; void start() override; - void shutdown() override; + void shutdown(bool force = false) override; void suspend() override; State current_state() override; int ssh_port() override;