Удаление машины больше не стирает вставленный установочный ISO: вместо --remove-all-storage удаляются только диски машины из папки машин
Этот коммит содержится в:
@@ -140,13 +140,6 @@ def vm_disks(name: str) -> list[dict[str, str]]:
|
||||
return [disk for disk in presenters.parse_domblklist(result["stdout"]) if disk["device"] == "disk" and disk["source"]]
|
||||
|
||||
|
||||
def vm_cdroms_with_media(name: str) -> list[dict[str, str]]:
|
||||
result = run(["virsh", "domblklist", name, "--details"], timeout=10)
|
||||
if not result["ok"]:
|
||||
return []
|
||||
return [disk for disk in presenters.parse_domblklist(result["stdout"]) if disk["device"] == "cdrom" and disk["source"]]
|
||||
|
||||
|
||||
def existing_parent(path: Path) -> Path:
|
||||
"""Сам путь или ближайший существующий родитель — чтобы спросить у ФС о разделе."""
|
||||
target = path
|
||||
@@ -691,16 +684,12 @@ def remove_vm(operation: dict[str, Any], name: str) -> None:
|
||||
result = run(["virsh", "destroy", name], timeout=30)
|
||||
if not result["ok"]:
|
||||
raise BackupError("Не удалось выключить старую машину: " + core.cmd_error(result, "virsh destroy"))
|
||||
for cdrom in vm_cdroms_with_media(name):
|
||||
# Иначе `undefine --remove-all-storage` удалит и вставленный ISO-образ.
|
||||
result = run(["virsh", "change-media", name, cdrom["target"], "--eject", "--config"], timeout=20)
|
||||
if not result["ok"]:
|
||||
raise BackupError(f"Не удалось извлечь образ из привода {cdrom['target']}: " + core.cmd_error(result, "virsh change-media"))
|
||||
log(f"Образ извлечён из привода {cdrom['target']}, чтобы он не был удалён вместе с машиной.")
|
||||
result = run(["virsh", "undefine", name, "--remove-all-storage", "--nvram", "--managed-save", "--snapshots-metadata"], timeout=180)
|
||||
if not result["ok"]:
|
||||
raise BackupError("Не удалось удалить старую машину: " + core.cmd_error(result, "virsh undefine"))
|
||||
ok, error, _removed, kept = core.undefine_vm(name) # вставленный ISO остаётся на месте
|
||||
if not ok:
|
||||
raise BackupError("Не удалось удалить старую машину: " + error)
|
||||
log(f"Старая машина {name} удалена вместе с дисками.")
|
||||
if kept:
|
||||
log("Диски вне папки машин не удалены: " + ", ".join(str(path) for path in kept))
|
||||
|
||||
|
||||
def restore_worker(operation: dict[str, Any]) -> None:
|
||||
|
||||
Ссылка в новой задаче
Block a user