[Kimchi-devel] [PATCH 4/5] cdrom: update model.py
Aline Manera
alinefm at linux.vnet.ibm.com
Fri Jan 10 18:27:04 UTC 2014
On 01/06/2014 07:32 AM, lvroyce at linux.vnet.ibm.com wrote:
> From: Royce Lv <lvroyce at 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 at 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")
It can also be a remote ISO
> + 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)
More information about the Kimchi-devel
mailing list