Skip to content

Commit 02c1d7e

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 02c1d7e

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-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: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
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+
vm_name = params.get("main_vm")
19+
if not vm_name:
20+
test.error("Missing 'main_vm'")
21+
22+
default_mem = Path(data_dir.get_tmp_dir()) / f"{vm_name}-{int(time.time())}.mem"
23+
mem_file = Path(params.get("mem_file", str(default_mem)))
24+
25+
case = params.get("scenario", "")
26+
cli_diskspec = case == "cli_diskspec"
27+
28+
vm = env.get_vm(vm_name)
29+
if vm is None:
30+
test.error(f"VM '{vm_name}' not found")
31+
32+
backup_xml = None
33+
disk_targets = []
34+
35+
def _ensure_running():
36+
if not vm.is_alive():
37+
vm.start()
38+
39+
def _all_disk_targets():
40+
devs = []
41+
vmx = vm_xml.VMXML.new_from_dumpxml(vm_name)
42+
for disk in (vmx.get_devices("disk") or []):
43+
tgt = (disk.target or {}).get("dev")
44+
if tgt:
45+
devs.append(tgt)
46+
return devs
47+
48+
def _snapshot_create():
49+
mem_file.parent.mkdir(parents=True, exist_ok=True)
50+
opts = f"--no-metadata --memspec file={mem_file} --live"
51+
if cli_diskspec:
52+
for dev in disk_targets:
53+
opts += f" --diskspec {dev},snapshot=no"
54+
virsh.snapshot_create_as(vm_name, options=opts, ignore_status=False, debug=True)
55+
56+
def setup_test():
57+
nonlocal backup_xml, disk_targets
58+
backup_xml = vm_xml.VMXML.new_from_inactive_dumpxml(vm_name)
59+
disk_targets = _all_disk_targets()
60+
test.log.debug(f"scenario: {case}")
61+
test.log.debug(f"mem_file: {mem_file}")
62+
test.log.debug(f"disk_targets: {disk_targets}")
63+
if not cli_diskspec:
64+
vmx = vm_xml.VMXML.new_from_inactive_dumpxml(vm_name)
65+
for dev in disk_targets:
66+
disk_dict = {"target": {"dev": dev}, "snapshot": "no"}
67+
libvirt_vmxml.modify_vm_device(vmx, "disk", disk_dict)
68+
test.log.debug(vm_xml.VMXML.new_from_inactive_dumpxml(vm_name))
69+
_ensure_running()
70+
71+
def teardown_test():
72+
if backup_xml is not None:
73+
backup_xml.sync()
74+
75+
try:
76+
setup_test()
77+
_snapshot_create()
78+
finally:
79+
teardown_test()
80+

0 commit comments

Comments
 (0)