From: Royce Lv <lvroyce(a)linux.vnet.ibm.com>
Implement create/delete/update cdrom functionality in model.py.
As _live_vm_update() is designed to manipulate multiple update params
all at once, we construct a dict from cdroms_create to adjust to this usage.
Signed-off-by: Royce Lv <lvroyce(a)linux.vnet.ibm.com>
---
src/kimchi/model.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 46 insertions(+), 2 deletions(-)
diff --git a/src/kimchi/model.py b/src/kimchi/model.py
index c74c973..4dd9eff 100644
--- a/src/kimchi/model.py
+++ b/src/kimchi/model.py
@@ -78,9 +78,9 @@ ISO_POOL_NAME = u'kimchi_isos'
GUESTS_STATS_INTERVAL = 5
HOST_STATS_INTERVAL = 1
VM_STATIC_UPDATE_PARAMS = {'name': './name'}
-VM_LIVE_UPDATE_PARAMS = {}
STORAGE_SOURCES = {'netfs': {'addr': '/pool/source/host/@name',
'path': '/pool/source/dir/@path'}}
+DEVICE_FILTER = {'cdrom': {'xml': './devices/disk',
'filter_field': './devices/disk/@device'}}
def _uri_to_name(collection, uri):
@@ -491,7 +491,51 @@ class Model(object):
return dom
def _live_vm_update(self, dom, params):
- pass
+ VM_LIVE_UPDATE_PARAMS = {
+ 'device': {'handler':
functools.partial(dom.attachDeviceFlags,
+ flags=libvirt.VIR_DOMAIN_AFFECT_CURRENT),
+ 'formatter': _get_disk_xml}}
+
+ for key, val in params.items():
+ if key in VM_LIVE_UPDATE_PARAMS:
+ handler = VM_LIVE_UPDATE_PARAMS[key]['handler']
+ param = VM_LIVE_UPDATE_PARAMS[key]['formatter'](**val)
+ try:
+ handler(**param)
+ except libvirt.LibvirtError:
+ raise OperationFailed("Cannot apply change on vm: %s",
e.get_error_message())
+
+ def cdroms_create(self, vm_name, params):
+ path = params.get('path')
+ if not os.path.isfile(path):
+ raise InvalidParameter("Path specified for CDROM is not a valid
file")
+ dom = self._get_vm(vm_name)
+ state = Model.dom_state_map[dom.info()[0]]
+
+ if state == 'running':
+ # CDROM is IDE device, which does not allow hotplug.
+ raise InvalidOperation("CDROM can just be attatched when vm is
shutoff")
+ if params['name'] in self.cdroms_get_list(vm_name):
+ raise InvalidParameter("CDROM with this name already exsited")
+
+ cdrom_param = {'source': {'type': 'file', 'path':
params['path']},
+ 'target': {'name': params['name'],
'type': 'cdrom', 'bus': 'ide'}}
+ self._live_vm_update(dom, dict(device=cdrom_param))
+ return params['name']
+
+ def cdroms_get_list(self, vm_name):
+ dom = self._get_vm(vm_name)
+ xml = dom.XMLDesc(0)
+ device_xml = xmlutils.xml_get_child(xml, './devices')
+ cdroms = _parse_vm_disks(device_xml, filter_path='./disk',
+ filter_name='device',
filter_val='cdrom')
+ return cdroms
+
+ def cdrom_lookup(self, vm_name, dev_name):
+ dom = self._get_vm(vm_name)
+ xml = dom.XMLDesc(0)
+ device_xml = xmlutils.xml_get_child(xml, './devices')
+ return _parse_device(device_xml, dev_name)
def vm_update(self, name, params):
dom = self._get_vm(name)
--
1.8.1.2