- Today Kimchi is throwing exceptions when something wrong happens to
device attachment/detachment but it also needs to notify the
front-end by task callbacks, this commit implements it.
---
Depends on [PATCH v2] [Kimchi] Handle libvirt events for device
attachment/detachment
i18n.py | 1 +
model/vmhostdevs.py | 40 +++++++++++++++++++++++++++++++++++++++-
2 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/i18n.py b/i18n.py
index 08a3ac8..673390e 100644
--- a/i18n.py
+++ b/i18n.py
@@ -141,6 +141,7 @@ messages = {
"KCHVMHDEV0004E": _('"name" should be a device name
string'),
"KCHVMHDEV0005E": _('The device %(name)s is probably in use by the
host. Unable to attach it to the guest.'),
"KCHVMHDEV0006E": _('Hot-(un)plug of device %(name)s is not
supported.'),
+ "KCHVMHDEV0007E": _('Failed to attach %(device)s to %(vm)s'),
"KCHVMIF0001E": _("Interface %(iface)s does not exist in virtual
machine %(name)s"),
"KCHVMIF0002E": _("Network %(network)s specified for virtual machine
%(name)s does not exist"),
diff --git a/model/vmhostdevs.py b/model/vmhostdevs.py
index 5a63bb1..70f0b17 100644
--- a/model/vmhostdevs.py
+++ b/model/vmhostdevs.py
@@ -28,6 +28,7 @@ from operator import itemgetter
from wok.exception import InvalidOperation, InvalidParameter, NotFoundError
from wok.exception import OperationFailed
+from wok.message import WokMessage
from wok.model.tasks import TaskModel
from wok.rollbackcontext import RollbackContext
from wok.utils import add_task, run_command, wok_log
@@ -215,7 +216,12 @@ class VMHostDevsModel(object):
lock = params['lock']
with lock:
- self._validate_pci_passthrough_env()
+ try:
+ self._validate_pci_passthrough_env()
+
+ except InvalidOperation as e:
+ cb(e.message, False)
+ raise
dom = VMModel.get_vm(vmid, self.conn)
# Due to libvirt limitation, we don't support live assigne device
@@ -246,6 +252,8 @@ class VMHostDevsModel(object):
# does not allow hot-plug of 3D graphic cards
is_3D_device = dev_model.is_device_3D_controller(dev_info)
if is_3D_device and DOM_STATE_MAP[dom.info()[0]] != "shutoff":
+ msg = WokMessage('KCHVMHDEV0006E', {'name':
dev_info['name']})
+ cb(msg.get_text(), False)
raise InvalidOperation('KCHVMHDEV0006E',
{'name': dev_info['name']})
@@ -258,6 +266,9 @@ class VMHostDevsModel(object):
pci_info['name'])
dev.dettach()
except Exception:
+ msg = WokMessage('KCHVMHDEV0005E',
+ {'name': pci_info['name']})
+ cb(msg.get_text(), False)
raise OperationFailed('KCHVMHDEV0005E',
{'name':
pci_info['name']})
else:
@@ -291,6 +302,10 @@ class VMHostDevsModel(object):
dom.attachDeviceFlags(xmlstr, device_flags)
except libvirt.libvirtError:
+ msg = WokMessage('KCHVMHDEV0007E',
+ {'device': pci_info['name'],
+ 'vm': vmid})
+ cb(msg.get_text(), False)
wok_log.error(
'Failed to attach mutifunction device VM %s: \n%s',
vmid, xmlstr)
@@ -310,13 +325,20 @@ class VMHostDevsModel(object):
is_multifunction)
try:
dom.attachDeviceFlags(xmlstr, device_flags)
+
except libvirt.libvirtError:
+ msg = WokMessage('KCHVMHDEV0007E',
+ {'device': pci_info['name'],
+ 'vm': vmid})
+ cb(msg.get_text(), False)
wok_log.error(
'Failed to attach host device %s to VM %s: \n%s',
pci_info['name'], vmid, xmlstr)
raise
+
rollback.prependDefer(dom.detachDeviceFlags,
xmlstr, device_flags)
+
rollback.commitAll()
if DOM_STATE_MAP[dom.info()[0]] == "shutoff":
@@ -443,11 +465,17 @@ class VMHostDevsModel(object):
try:
cb('Attaching device to VM')
dom.attachDeviceFlags(xmlstr, device_flags)
+
except libvirt.libvirtError:
+ msg = WokMessage('KCHVMHDEV0007E',
+ {'device': dev_info['name'],
+ 'vm': vmid})
+ cb(msg.get_text(), False)
wok_log.error(
'Failed to attach host device %s to VM %s: \n%s',
dev_info['name'], vmid, xmlstr)
raise
+
rollback.prependDefer(dom.detachDeviceFlags, xmlstr,
device_flags)
rollback.commitAll()
@@ -481,11 +509,17 @@ class VMHostDevsModel(object):
try:
cb('Attaching device to VM')
dom.attachDeviceFlags(xmlstr, device_flags)
+
except libvirt.libvirtError:
+ msg = WokMessage('KCHVMHDEV0007E',
+ {'device': dev_info['name'],
+ 'vm': vmid})
+ cb(msg.get_text(), False)
wok_log.error(
'Failed to attach host device %s to VM %s: \n%s',
dev_info['name'], vmid, xmlstr)
raise
+
rollback.prependDefer(dom.detachDeviceFlags, xmlstr,
device_flags)
rollback.commitAll()
@@ -538,6 +572,7 @@ class VMHostDevModel(object):
try:
hostdev = root.devices.hostdev
+
except AttributeError:
raise NotFoundError('KCHVMHDEV0001E',
{'vmid': vmid, 'dev_name': dev_name})
@@ -606,6 +641,9 @@ class VMHostDevModel(object):
devsmodel.update_mmio_guest(vmid, False)
break
else:
+ msg = WokMessage('KCHVMHDEV0001E',
+ {'vmid': vmid, 'dev_name': dev_name})
+ cb(msg.get_text(), False)
raise NotFoundError('KCHVMHDEV0001E',
{'vmid': vmid, 'dev_name':
dev_name})
--
2.7.4