Skip to content

Commit a046c52

Browse files
author
Bolatbek Issakh
committed
Create external memory only snapshot
Create a memroy only snapshot on VM. SC1: Create memory only snapshot by --diskspec snapshot=no option SC2: Specify snapshot=no in guest xml and create memory only snapshot Committer: Bolatbek Issakh <[email protected]>
1 parent 89b8007 commit a046c52

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
- virsh_memonly_snapshot:
2+
type = virsh_memonly_snapshot
3+
start_vm = yes
4+
variants:
5+
- cli_diskspec:
6+
scenario = cli_diskspec
7+
- xml_snapshot_no:
8+
scenario = xml_snapshot_no
9+
set_snapshot_no_in_xml = yes
10+
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2+
#
3+
# virsh_memonly_snapshot.py
4+
#
5+
# SPDX-License-Identifier: GPL-2.0
6+
#
7+
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8+
9+
import time
10+
from pathlib import Path
11+
12+
from virttest import virsh, data_dir
13+
from virttest.libvirt_xml import vm_xml
14+
from virttest.utils_libvirt import libvirt_vmxml
15+
16+
17+
def run(test, params, env):
18+
"""
19+
Create a memory-only snapshot of a running VM.
20+
21+
SC1: CLI only — pass --diskspec snapshot=no for all disks.
22+
SC2: XML path — set snapshot='no' on all <disk> in guest XML, then run CLI without --diskspec.
23+
"""
24+
vm_name = params.get("main_vm")
25+
# Use Avocado tmp dir by default; auto-cleaned by Avocado
26+
default_mem = Path(data_dir.get_tmp_dir()) / f"{vm_name}-{int(time.time())}.mem"
27+
mem_file = Path(params.get("mem_file", str(default_mem)))
28+
29+
variant = str(params.get("variant") or params.get("case") or params.get("scenario") or "")
30+
set_xml = params.get("set_snapshot_no_in_xml", "no").lower() in ("yes", "true", "1") or (
31+
"xml_snapshot_no" in variant
32+
)
33+
34+
vm = env.get_vm(vm_name)
35+
if vm is None:
36+
test.error(f"VM '{vm_name}' not found in env")
37+
38+
disk_targets = [] # filled in setup_test()
39+
40+
def _ensure_running():
41+
if not vm.is_alive():
42+
vm.start()
43+
44+
def _all_disk_targets():
45+
devs = []
46+
vmx = vm_xml.VMXML.new_from_dumpxml(vm_name)
47+
for disk in (vmx.get_devices("disk") or []):
48+
tgt = (disk.target or {}).get("dev")
49+
if tgt:
50+
devs.append(tgt)
51+
return devs
52+
53+
def _snapshot_create():
54+
mem_file.parent.mkdir(parents=True, exist_ok=True)
55+
opts = f"--no-metadata --memspec file={mem_file} --live"
56+
if not set_xml:
57+
for dev in disk_targets:
58+
opts += f" --diskspec {dev},snapshot=no"
59+
virsh.snapshot_create_as(vm_name, options=opts, ignore_status=False, debug=True)
60+
61+
backup_xml = None
62+
63+
def setup_test():
64+
nonlocal backup_xml, disk_targets
65+
backup_xml = vm_xml.VMXML.new_from_inactive_dumpxml(vm_name)
66+
disk_targets = _all_disk_targets()
67+
if set_xml:
68+
vmx = vm_xml.VMXML.new_from_inactive_dumpxml(vm_name)
69+
for dev in disk_targets:
70+
disk_dict = {"target": {"dev": dev}, "snapshot": "no"}
71+
libvirt_vmxml.modify_vm_device(vmx, "disk", disk_dict)
72+
_ensure_running()
73+
74+
def run_test():
75+
_snapshot_create()
76+
77+
def teardown_test():
78+
if backup_xml is not None:
79+
backup_xml.sync()
80+
81+
try:
82+
setup_test()
83+
run_test()
84+
finally:
85+
teardown_test()

0 commit comments

Comments
 (0)