Удаление машины больше не стирает вставленный установочный ISO: вместо --remove-all-storage удаляются только диски машины из папки машин
Этот коммит содержится в:
@@ -227,6 +227,43 @@ def vm_is_running(name: str) -> bool:
|
||||
return vm_state(name) in ("running", "idle", "blocked", "paused", "pmsuspended", "in shutdown")
|
||||
|
||||
|
||||
def vm_disk_files(name: str) -> tuple[list[Path], list[Path]]:
|
||||
"""Файлы дисков машины: (свои — в IMAGES_DIR, чужие — где-то ещё). Приводы CD/DVD сюда не входят."""
|
||||
own: list[Path] = []
|
||||
foreign: list[Path] = []
|
||||
result = run_cmd(["virsh", "domblklist", name, "--details"], timeout=10)
|
||||
for disk in presenters.parse_domblklist(result.get("stdout") or ""):
|
||||
if disk["device"] == "disk" and disk["source"]:
|
||||
path = Path(disk["source"])
|
||||
(own if IMAGES_DIR.resolve() in path.resolve().parents else foreign).append(path)
|
||||
return own, foreign
|
||||
|
||||
|
||||
def undefine_vm(name: str) -> tuple[bool, str, list[Path], list[Path]]:
|
||||
"""Удалить машину и файлы её дисков из IMAGES_DIR. Возвращает (ok, ошибка, удалённые, оставленные).
|
||||
|
||||
Без `--remove-all-storage`: он удаляет все тома libvirt, подключённые к машине, в том числе
|
||||
вставленный установочный ISO из пула virtuality-iso. Диски вне IMAGES_DIR не трогаем."""
|
||||
own, foreign = vm_disk_files(name) # после undefine libvirt о дисках машины уже не расскажет
|
||||
# --nvram: UEFI machines keep firmware variables that block a plain undefine.
|
||||
result = run_cmd(["virsh", "undefine", name, "--nvram", "--managed-save", "--snapshots-metadata", "--checkpoints-metadata"], timeout=120)
|
||||
if not result["ok"]:
|
||||
return False, cmd_error(result, "virsh undefine"), [], []
|
||||
removed = []
|
||||
for disk in own:
|
||||
try:
|
||||
disk.unlink()
|
||||
except FileNotFoundError:
|
||||
continue
|
||||
except OSError:
|
||||
foreign.append(disk)
|
||||
continue
|
||||
removed.append(disk)
|
||||
if removed:
|
||||
run_cmd(["virsh", "pool-refresh", "virtuality-images"], timeout=20)
|
||||
return True, "", removed, foreign
|
||||
|
||||
|
||||
# ---------------------------------------------------------------- operations
|
||||
def operation_meta_path(operation_id: str) -> Path:
|
||||
return OPERATIONS_DIR / f"{operation_id}.json"
|
||||
|
||||
Ссылка в новой задаче
Block a user