[Kimchi-devel] [PATCH 4/7] Guest disks: Choose proper bus for device
Aline Manera
alinefm at linux.vnet.ibm.com
Thu Apr 17 01:42:00 UTC 2014
On 04/13/2014 05:16 AM, lvroyce at linux.vnet.ibm.com wrote:
> From: Royce Lv <lvroyce at linux.vnet.ibm.com>
>
> When bus type is not passed by user,
> kimchi choose bus type based on stored os distro and version.
> And make right hot plug behavior based on bus type.
>
> Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
> ---
> src/kimchi/model/vmstorages.py | 43 ++++++++++++++++++++++++++++++------------
> 1 file changed, 31 insertions(+), 12 deletions(-)
>
> diff --git a/src/kimchi/model/vmstorages.py b/src/kimchi/model/vmstorages.py
> index c31af24..6fdf580 100644
> --- a/src/kimchi/model/vmstorages.py
> +++ b/src/kimchi/model/vmstorages.py
> @@ -32,9 +32,11 @@ from kimchi.exception import InvalidOperation, InvalidParameter, NotFoundError
> from kimchi.exception import OperationFailed
> from kimchi.model.vms import DOM_STATE_MAP, VMModel
> from kimchi.utils import check_url_path
> +from kimchi.osinfo import lookup
>
> DEV_TYPE_SRC_ATTR_MAP = {'file': 'file',
> 'block': 'dev'}
> +HOTPLUG_TYPE = ['scsi', 'virtio']
>
>
> def _get_device_xml(dom, dev_name):
> @@ -47,6 +49,16 @@ def _get_device_xml(dom, dev_name):
> return disk[0]
>
>
> +def _get_device_bus(dev_type, dom, objstore):
> + try:
> + with objstore as session:
> + vm_info = session.get('vm', dom.UUIDString())
> + distro, version = (vm_info['distro'], vm_info['version'])
> + except:
> + distro, version = ('unknown', 'unknown')
> + return lookup(distro, version)[dev_type+'_bus']
> +
> +
The same I commented in previous patch about store bus type in VM metadata
> def _get_storage_xml(params):
> src_type = params.get('src_type')
> disk = E.disk(type=src_type, device=params.get('type'))
> @@ -65,7 +77,7 @@ def _get_storage_xml(params):
> source.set(DEV_TYPE_SRC_ATTR_MAP[src_type], params.get('path'))
> disk.append(source)
>
> - disk.append(E.target(dev=params.get('dev'), bus=params.get('bus', 'ide')))
> + disk.append(E.target(dev=params.get('dev'), bus=params['bus']))
> if params.get('address'):
> # ide disk target id is always '0'
> disk.append(E.address(
> @@ -104,8 +116,11 @@ def _check_cdrom_path(path):
> class VMStoragesModel(object):
> def __init__(self, **kargs):
> self.conn = kargs['conn']
> + self.objstore = kargs['objstore']
>
> - def _get_available_ide_address(self, vm_name):
> + def _get_available_bus_address(self, bus_type, vm_name):
> + if bus_type not in ['ide']:
> + return dict()
> # libvirt limitation of just 1 ide controller
> # each controller have at most 2 buses and each bus 2 units.
> dom = VMModel.get_vm(vm_name, self.conn)
> @@ -130,9 +145,6 @@ class VMStoragesModel(object):
>
> def create(self, vm_name, params):
> dom = VMModel.get_vm(vm_name, self.conn)
> - if DOM_STATE_MAP[dom.info()[0]] != 'shutoff':
> - raise InvalidOperation('KCHVMSTOR0011E')
> -
> # Use device name passed or pick next
> dev_name = params.get('dev', None)
> if dev_name is None:
> @@ -148,7 +160,13 @@ class VMStoragesModel(object):
> path = params['path']
> params['src_type'] = _check_cdrom_path(path)
>
> - params.update(self._get_available_ide_address(vm_name))
> + params.setdefault(
> + 'bus', _get_device_bus(params['type'], dom, self.objstore))
> + if (params['bus'] not in HOTPLUG_TYPE
> + and DOM_STATE_MAP[dom.info()[0]] != 'shutoff'):
> + raise InvalidOperation('KCHVMSTOR0011E')
> +
> + params.update(self._get_available_bus_address(params['bus'], vm_name))
> # Add device to VM
> dev_xml = _get_storage_xml(params)
> try:
> @@ -218,19 +236,20 @@ class VMStorageModel(object):
> def delete(self, vm_name, dev_name):
> # Get storage device xml
> dom = VMModel.get_vm(vm_name, self.conn)
> - disk = _get_device_xml(dom, dev_name)
> - if disk is None:
> - raise NotFoundError("KCHVMSTOR0007E",
> - {'dev_name': dev_name,
> - 'vm_name': vm_name})
> + try:
> + bus_type = self.lookup(vm_name, dev_name)['bus']
> + except NotFoundError:
> + raise
Please, raise the proper error or fallback to a default bus_type
>
> dom = VMModel.get_vm(vm_name, self.conn)
> - if DOM_STATE_MAP[dom.info()[0]] != 'shutoff':
> + if (bus_type not in HOTPLUG_TYPE and
> + DOM_STATE_MAP[dom.info()[0]] != 'shutoff'):
> raise InvalidOperation('KCHVMSTOR0011E')
>
> try:
> conn = self.conn.get()
> dom = conn.lookupByName(vm_name)
> + disk = _get_device_xml(dom, dev_name)
> dom.detachDeviceFlags(etree.tostring(disk),
> libvirt.VIR_DOMAIN_AFFECT_CURRENT)
> except Exception as e:
More information about the Kimchi-devel
mailing list