Удаление машины больше не стирает вставленный установочный ISO: вместо --remove-all-storage удаляются только диски машины из папки машин
Этот коммит содержится в:
@@ -55,16 +55,44 @@ def test_vm_action_success_redirects_without_error(logged_in, data_dirs, monkeyp
|
||||
|
||||
|
||||
def test_vm_delete_undefines_uefi_machines(logged_in, data_dirs, monkeypatch):
|
||||
import core
|
||||
|
||||
calls = recording(monkeypatch, app)
|
||||
core_calls = recording(monkeypatch, core)
|
||||
disk = data_dirs["images"] / "web01.qcow2"
|
||||
disk.write_bytes(b"QFI\xfb")
|
||||
response = logged_in.post("/vm/web01/delete", follow_redirects=False)
|
||||
assert response.headers["location"].startswith("/?message=")
|
||||
assert find(calls, "virsh", "destroy", "web01")
|
||||
undefine = find(calls, "virsh", "undefine", "web01")[0]
|
||||
assert "--nvram" in undefine and "--remove-all-storage" in undefine and "--snapshots-metadata" in undefine
|
||||
undefine = find(core_calls, "virsh", "undefine", "web01")[0]
|
||||
assert "--nvram" in undefine and "--snapshots-metadata" in undefine
|
||||
assert not disk.exists() and find(core_calls, "virsh", "pool-refresh", "virtuality-images")
|
||||
|
||||
|
||||
def test_vm_delete_keeps_installer_iso_and_foreign_disks(logged_in, data_dirs, monkeypatch):
|
||||
"""--remove-all-storage удалял вставленный ISO: загруженные образы пропадали вместе с машиной."""
|
||||
import core
|
||||
|
||||
iso = data_dirs["iso"] / "smk-server-_1.iso"
|
||||
iso.write_bytes(b"ISO")
|
||||
disk = data_dirs["images"] / "web01.qcow2"
|
||||
disk.write_bytes(b"QFI\xfb")
|
||||
foreign = data_dirs["disk_images"] / "shared.raw"
|
||||
foreign.write_bytes(b"raw")
|
||||
listing = f" Type Device Target Source\n----\n file disk vda {disk}\n file disk vdb {foreign}\n file cdrom sda {iso}\n"
|
||||
recording(monkeypatch, app)
|
||||
core_calls = recording(monkeypatch, core, [(["virsh", "domblklist"], conftest.fake_result(listing))])
|
||||
response = logged_in.post("/vm/web01/delete", follow_redirects=False)
|
||||
assert not disk.exists() and iso.exists() and foreign.exists()
|
||||
assert "--remove-all-storage" not in find(core_calls, "virsh", "undefine", "web01")[0]
|
||||
assert str(foreign) in unquote(response.headers["location"])
|
||||
|
||||
|
||||
def test_vm_delete_failure_is_reported(logged_in, data_dirs, monkeypatch):
|
||||
recording(monkeypatch, app, [(["virsh", "undefine"], conftest.fake_result(ok=False, stderr="error: Requested operation is not valid: cannot undefine domain with nvram"))])
|
||||
import core
|
||||
|
||||
recording(monkeypatch, app)
|
||||
recording(monkeypatch, core, [(["virsh", "undefine"], conftest.fake_result(ok=False, stderr="error: Requested operation is not valid: cannot undefine domain with nvram"))])
|
||||
response = logged_in.post("/vm/web01/delete", follow_redirects=False)
|
||||
assert response.headers["location"].startswith("/vm/web01?error=")
|
||||
|
||||
@@ -73,9 +101,9 @@ def test_vm_delete_stops_paused_machine_first(logged_in, data_dirs, monkeypatch)
|
||||
import core
|
||||
|
||||
calls = recording(monkeypatch, app)
|
||||
recording(monkeypatch, core, [(["virsh", "domstate"], conftest.fake_result("paused"))])
|
||||
core_calls = recording(monkeypatch, core, [(["virsh", "domstate"], conftest.fake_result("paused"))])
|
||||
logged_in.post("/vm/web01/delete", follow_redirects=False)
|
||||
assert find(calls, "virsh", "destroy", "web01") and find(calls, "virsh", "undefine", "web01")
|
||||
assert find(calls, "virsh", "destroy", "web01") and find(core_calls, "virsh", "undefine", "web01")
|
||||
|
||||
|
||||
def test_vm_delete_waits_for_running_task(logged_in, data_dirs, monkeypatch):
|
||||
|
||||
@@ -420,7 +420,7 @@ def test_restore_requires_replace_confirmation(fast_worker):
|
||||
assert exc.value.code == "exists"
|
||||
|
||||
|
||||
UNDEFINE = ["virsh", "undefine", "web01", "--remove-all-storage", "--nvram", "--managed-save", "--snapshots-metadata"]
|
||||
UNDEFINE = ["virsh", "undefine", "web01", "--nvram", "--managed-save", "--snapshots-metadata", "--checkpoints-metadata"]
|
||||
|
||||
|
||||
def test_restore_replaces_existing_vm_only_after_disks_are_ready(fast_worker, monkeypatch):
|
||||
@@ -464,23 +464,23 @@ def test_restore_refuses_when_space_is_tight_even_if_old_vm_would_free_it(fast_w
|
||||
assert exc.value.code == "space" and "рядом со старой машиной" not in str(exc.value)
|
||||
|
||||
|
||||
def test_restore_ejects_iso_before_undefine(fast_worker, monkeypatch):
|
||||
def test_restore_keeps_inserted_iso(fast_worker, monkeypatch):
|
||||
make_backup(fast_worker)
|
||||
iso = fast_worker["iso"] / "debian.iso"
|
||||
iso.write_bytes(b"ISO")
|
||||
virsh = FakeVirsh(running=False)
|
||||
base = virsh.__call__
|
||||
|
||||
def with_iso(cmd, timeout=12, **kw):
|
||||
if cmd[:2] == ["virsh", "domblklist"]:
|
||||
virsh.calls.append(list(cmd))
|
||||
return fake_result(DOMBLKLIST_DETAILS.replace("sda -", "sda /var/lib/virtuality/iso/debian.iso"))
|
||||
return fake_result(DOMBLKLIST_DETAILS.replace("/var/lib/virtuality/images", str(core.IMAGES_DIR)).replace("sda -", f"sda {iso}"))
|
||||
return base(cmd, timeout, **kw)
|
||||
|
||||
monkeypatch.setattr(core, "run_cmd", with_iso)
|
||||
monkeypatch.setattr(backups, "stream_cmd", fake_stream())
|
||||
backups.start_restore("web01", "20260924-0300", "web01", True)
|
||||
eject = ["virsh", "change-media", "web01", "sda", "--eject", "--config"]
|
||||
assert eject in virsh.calls
|
||||
assert virsh.calls.index(eject) < virsh.calls.index(UNDEFINE)
|
||||
assert UNDEFINE in virsh.calls and iso.exists()
|
||||
|
||||
|
||||
def test_restore_rejects_bad_name_and_incomplete_backup(fast_worker):
|
||||
|
||||
@@ -146,7 +146,10 @@ def test_reservation_is_reused_and_released(data_dirs, monkeypatch):
|
||||
|
||||
|
||||
def test_vm_delete_releases_address(logged_in, data_dirs, monkeypatch):
|
||||
calls = recording(monkeypatch, app, [])
|
||||
import core
|
||||
|
||||
recording(monkeypatch, app, [])
|
||||
calls = recording(monkeypatch, core, [])
|
||||
net_calls = recording(monkeypatch, network_core, [(["virsh", "net-dumpxml"], conftest.fake_result((conftest.FIXTURES / "net-dumpxml.xml").read_text()))])
|
||||
assert logged_in.post("/vm/web01/delete", follow_redirects=False).status_code == 303
|
||||
assert find(calls, "virsh", "undefine") and find(net_calls, "virsh", "net-update", "virtuality-nat", "delete")
|
||||
|
||||
Ссылка в новой задаче
Block a user