Skip to content

Commit b2108ff

Browse files
authored
Merge pull request #4223 from aliang123/3151
blockdev_commit_cancel:cancel a commit job
2 parents e563640 + 5b4d868 commit b2108ff

File tree

3 files changed

+115
-2
lines changed

3 files changed

+115
-2
lines changed

provider/virt_storage/storage_volume.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,11 @@ def refresh_format_by_params(self, params):
157157

158158
backing = params.get("backing")
159159
if backing:
160-
backing_node = "drive_%s" % backing
161-
self.format.set_param("backing", backing_node)
160+
if params.get("backing_null", "no") == "no":
161+
backing_node = "drive_%s" % backing
162+
self.format.set_param("backing", backing_node)
163+
else:
164+
self.format.params["backing"] = None
162165

163166
data_file_name = params.get("image_data_file")
164167
if data_file_name:

qemu/tests/blockdev_commit_cancel.py

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
from avocado.utils import process
2+
3+
from provider import backup_utils, job_utils
4+
from provider.blockdev_commit_base import BlockDevCommitTest
5+
6+
7+
class BlockDevCommitCancel(BlockDevCommitTest):
8+
def generate_tempfile(self, root_dir, filename="data", size="1500M", timeout=360):
9+
backup_utils.generate_tempfile(self.main_vm, root_dir, filename, size, timeout)
10+
self.files_info.append([root_dir, filename])
11+
12+
def commit_snapshot(self):
13+
device = self.params.get_list("device_tag")[0]
14+
device_params = self.params.object_params(device)
15+
snapshot_tags = device_params["snapshot_tags"].split()
16+
self.device_node = self.get_node_name(device)
17+
options = ["base-node", "top-node", "speed"]
18+
arguments = self.params.copy_from_keys(options)
19+
arguments["base-node"] = self.get_node_name(device)
20+
arguments["top-node"] = self.get_node_name(snapshot_tags[-1])
21+
arguments["speed"] = self.params["speed"]
22+
device = self.get_node_name(snapshot_tags[-1])
23+
commit_cmd = backup_utils.block_commit_qmp_cmd
24+
cmd, args = commit_cmd(device, **arguments)
25+
backup_utils.set_default_block_job_options(self.main_vm, args)
26+
job_id = args.get("job-id", device)
27+
self.main_vm.monitor.cmd(cmd, args)
28+
if job_utils.is_block_job_running(self.main_vm, job_id):
29+
self.main_vm.monitor.cmd("block-job-cancel", {"device": job_id})
30+
event = job_utils.get_event_by_condition(
31+
self.main_vm,
32+
"BLOCK_JOB_CANCELLED",
33+
self.params.get_numeric("job_cancelled_timeout", 60),
34+
device=job_id,
35+
)
36+
if event is None:
37+
self.test.fail("Commit job failed to cancel")
38+
39+
def check_backing_rw(self):
40+
base_image = self.get_image_by_tag(self.params["device_tag"])
41+
cmd = "lsof %s" % base_image.image_filename
42+
if "nbd" in base_image.image_filename:
43+
cmd = "lsof -i:%s" % self.params["nbd_port_%s" % self.params["device_tag"]]
44+
elif "rbd" in base_image.image_filename:
45+
cmd = "lsof -i:6800"
46+
output = process.run(cmd, verbose=True).stdout_text.split("\n")[1].split()
47+
pid, fd = (output[1], output[3][:-1])
48+
cmd = "cat /proc/%s/fdinfo/%s" % (pid, fd)
49+
output = process.run(cmd, verbose=True).stdout_text.split("\n")[1].split()[1]
50+
if output[-1] == "2":
51+
self.test.fail("backing image in rw status, should be in ro satus")
52+
53+
def run_test(self):
54+
self.pre_test()
55+
try:
56+
self.commit_snapshot()
57+
self.check_backing_rw()
58+
finally:
59+
self.post_test()
60+
61+
62+
def run(test, params, env):
63+
"""
64+
Block commit base Test
65+
66+
1. boot guest with data disk
67+
2. create 4 snapshots and save file in each snapshot
68+
3. commit snapshot 3 to snapshot 4
69+
4. verify files's md5
70+
"""
71+
72+
block_test = BlockDevCommitCancel(test, params, env)
73+
block_test.run_test()
+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
- blockdev_commit_cancel:
2+
type = blockdev_commit_cancel
3+
virt_test_type = qemu
4+
only Linux
5+
images += " data"
6+
force_create_image = yes
7+
force_remove_image = yes
8+
force_create_image_image1 = no
9+
force_remove_image_image1 = no
10+
start_vm = yes
11+
kill_vm = yes
12+
storage_pools = default
13+
storage_type_default = "directory"
14+
storage_pool = default
15+
image_size_data = 2G
16+
image_name_data = data
17+
snapshot_tags = sn1
18+
19+
image_name_sn1 = sn1
20+
backing_sn1 = data
21+
backing_null = yes
22+
image_format_sn1 = qcow2
23+
24+
device_tag = "data"
25+
format = qcow2
26+
speed = 10000000
27+
ceph:
28+
image_format_data = raw
29+
enable_ceph_sn1 = no
30+
nbd:
31+
image_format_data = raw
32+
image_size_data = 2G
33+
nbd_port_data = 10831
34+
enable_nbd_sn1 = no
35+
force_create_image_data = no
36+
remove_image_data = no
37+
image_size_sn1 = ${image_size_data}

0 commit comments

Comments
 (0)