Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
tp-qemu
提交
28cd9e05
T
tp-qemu
项目概览
openeuler
/
tp-qemu
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
tp-qemu
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
28cd9e05
编写于
6月 02, 2020
作者:
Y
YongxueHong
提交者:
GitHub
6月 02, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #2238 from YongxueHong/bug-1749697
block_hotplug_in_pause: Fix failed to unplug device
上级
91888285
13f2b37b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
61 addition
and
9 deletion
+61
-9
qemu/tests/block_hotplug_in_pause.py
qemu/tests/block_hotplug_in_pause.py
+59
-9
qemu/tests/cfg/block_hotplug_in_pause.cfg
qemu/tests/cfg/block_hotplug_in_pause.cfg
+2
-0
未找到文件。
qemu/tests/block_hotplug_in_pause.py
浏览文件 @
28cd9e05
...
...
@@ -6,6 +6,7 @@ from virttest import utils_misc
from
virttest
import
utils_disk
from
virttest.qemu_devices
import
qdevices
from
virttest.qemu_capabilities
import
Flags
from
virttest.qemu_devices.utils
import
(
DeviceError
,
DeviceUnplugError
)
@
error_context
.
context_aware
...
...
@@ -76,17 +77,57 @@ def run(test, params, env):
devs
=
[
dev
for
dev
in
devs
if
not
isinstance
(
dev
,
dtype
)]
return
devs
def
block_unplug
(
device_list
):
def
verify_unplug_devices_by_qtree
(
device_list
,
timeout
=
30
):
"""verify the unplug devices in qtree"""
for
dev
in
device_list
:
if
not
utils_misc
.
wait_for
(
lambda
:
dev
.
verify_unplug
(
''
,
vm
.
monitor
),
timeout
,
1
,
5
):
test
.
error
(
'The %s is still in qtree after unplugging.'
%
dev
)
def
unplug_backend_devices
(
device_list
):
"""Unplug the backend devices"""
for
dev
in
device_list
:
try
:
dev
.
unplug_hook
()
drive
=
dev
.
get_param
(
"drive"
)
if
drive
:
if
Flags
.
BLOCKDEV
in
vm
.
devices
.
caps
:
format_node
=
vm
.
devices
[
drive
]
nodes
=
[
format_node
]
nodes
.
extend
((
n
for
n
in
format_node
.
get_child_nodes
()))
for
node
in
nodes
:
if
not
node
.
verify_unplug
(
node
.
unplug
(
vm
.
monitor
),
vm
.
monitor
):
raise
DeviceUnplugError
(
node
,
"Failed to unplug blockdev node."
,
vm
.
devices
)
vm
.
devices
.
remove
(
node
,
True
if
isinstance
(
node
,
qdevices
.
QBlockdevFormatNode
)
else
False
)
if
not
isinstance
(
node
,
qdevices
.
QBlockdevFormatNode
):
format_node
.
del_child_node
(
node
)
else
:
vm
.
devices
.
remove
(
drive
)
vm
.
devices
.
remove
(
dev
,
True
)
except
(
DeviceError
,
KeyError
)
as
exc
:
dev
.
unplug_unhook
()
raise
DeviceUnplugError
(
dev
,
exc
,
vm
.
devices
)
def
block_unplug
(
device_list
,
verify_qtree
=
True
,
unplug_backend
=
True
):
"""
Unplug disks and verify it in qtree
:param device_list: List of objectes for unplug disks
"""
for
dev
in
reversed
(
device_list
):
ret
=
vm
.
devices
.
simple_unplug
(
dev
,
vm
.
monitor
)
if
ret
[
1
]
is
False
:
test
.
fail
(
"Failed to unplug device '%s'."
"Ouptut:
\n
%s"
%
(
dev
,
ret
[
0
]))
out
=
dev
.
unplug
(
vm
.
monitor
)
if
out
:
test
.
fail
(
"Failed to unplug device '%s'.Ouptut:
\n
%s"
%
(
dev
,
out
))
if
verify_qtree
:
verify_unplug_devices_by_qtree
(
device_list
)
if
unplug_backend
:
unplug_backend_devices
(
device_list
)
def
block_check_in_guest
(
session
,
disks
,
blk_num
,
get_disk_cmd
,
plug_tag
=
"hotplug"
):
...
...
@@ -165,6 +206,7 @@ def run(test, params, env):
vm
=
env
.
get_vm
(
params
[
"main_vm"
])
vm
.
verify_alive
()
is_vm_paused
=
False
session
=
vm
.
wait_for_login
()
for
iteration
in
range
(
repeat_times
):
...
...
@@ -178,6 +220,7 @@ def run(test, params, env):
if
params
.
get
(
"stop_vm_before_hotplug"
,
"no"
)
==
"yes"
:
error_context
.
context
(
"Stop VM before hotplug"
)
vm
.
pause
()
is_vm_paused
=
True
for
num
in
range
(
blk_num
):
image_name
=
img_list
[
num
+
1
]
...
...
@@ -185,9 +228,10 @@ def run(test, params, env):
if
devs
:
device_list
.
extend
(
devs
)
if
vm
.
is_paused
()
and
params
.
get
(
"resume_vm_after_hotplug"
,
"yes"
)
==
"yes"
:
if
is_vm_paused
and
params
.
get
(
"resume_vm_after_hotplug"
,
"yes"
)
==
"yes"
:
error_context
.
context
(
"Resume vm after hotplug"
)
vm
.
resume
()
is_vm_paused
=
False
block_check_in_guest
(
session
,
disks_before_plug
,
blk_num
,
get_disk_cmd
)
if
params
.
get
(
"disk_op_cmd"
):
...
...
@@ -202,19 +246,25 @@ def run(test, params, env):
device_list
.
append
(
device
)
error_context
.
context
(
"Unplug device"
,
logging
.
info
)
if
not
vm
.
is_paused
()
:
if
not
is_vm_paused
:
disks_before_unplug
=
find_disk
(
session
,
get_disk_cmd
)
if
params
.
get
(
"stop_vm_before_unplug"
,
"yes"
)
==
"yes"
:
error_context
.
context
(
"Stop vm before unplug"
)
vm
.
pause
()
is_vm_paused
=
True
else
:
blk_num
=
0
disks_before_unplug
=
disks_before_plug
block_unplug
(
device_list
)
block_unplug
(
device_list
,
not
is_vm_paused
,
not
is_vm_paused
)
if
vm
.
is_paused
()
:
if
is_vm_paused
:
error_context
.
context
(
"Resume vm after unplug"
)
vm
.
resume
()
is_vm_paused
=
False
# verify the unplugged device in qtree and unplug
# the backend only under the running status.
verify_unplug_devices_by_qtree
(
device_list
)
unplug_backend_devices
(
device_list
)
block_check_in_guest
(
session
,
disks_before_unplug
,
blk_num
,
get_disk_cmd
,
plug_tag
=
"unplug"
)
...
...
qemu/tests/cfg/block_hotplug_in_pause.cfg
浏览文件 @
28cd9e05
...
...
@@ -55,3 +55,5 @@
stop_vm_before_hotplug = yes
resume_vm_after_hotplug = no
stop_vm_before_unplug = no
Windows:
resume_vm_after_hotplug = yes
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录