diff --git a/tests/test_backups.py b/tests/test_backups.py index 4b5e7ec..943469c 100644 --- a/tests/test_backups.py +++ b/tests/test_backups.py @@ -643,3 +643,20 @@ def test_late_restart_watch_is_cancelled_by_user_action(fast_worker, monkeypatch watchers[0].join(timeout=5) assert not watchers[0].is_alive() and ["virsh", "start", "web01"] not in virsh.calls assert "Наблюдение снято" in core.read_operation(operation["id"])["log_tail"] + + +def test_late_restart_rechecks_cancel_after_shutdown(fast_worker, monkeypatch): + virsh = FakeVirsh(running=True, shuts_down=False) + monkeypatch.setattr(core, "run_cmd", virsh) + monkeypatch.setattr(backups, "LATE_SHUTDOWN_WATCH", 5.0) + operation = core.new_operation("backup", "Резервная копия web01", vm_name="web01") + + def shut_down_by_user(vm): + backups.cancel_late_restart(vm) # «Выключить» нажали, пока наблюдатель спрашивал состояние машины + return False + + monkeypatch.setattr(core, "vm_is_running", shut_down_by_user) + backups.restart_after_late_shutdown(operation, "web01") + assert ["virsh", "start", "web01"] not in virsh.calls + assert "Наблюдение снято" in core.read_operation(operation["id"])["log_tail"] + assert "web01" not in backups.LATE_WATCHES diff --git a/web/features/backups.py b/web/features/backups.py index e0a1a75..4c4e2a3 100644 --- a/web/features/backups.py +++ b/web/features/backups.py @@ -473,6 +473,9 @@ def restart_after_late_shutdown(operation: dict[str, Any], vm: str) -> None: core.append_operation_log(operation["id"], "Наблюдение снято: машиной занялись вручную или новой задачей.") return if not core.vm_is_running(vm): + if cancelled.is_set(): # «Выключить» нажали, пока virsh отвечал на вопрос о состоянии + core.append_operation_log(operation["id"], "Наблюдение снято: машиной занялись вручную или новой задачей.") + return if any(other["id"] != operation["id"] for other in core.active_operations_for(vm, OPERATION_TYPES)): core.append_operation_log(operation["id"], "Машина выключилась, но с ней уже работает другая задача — не запускаем.") return