[Kimchi-devel] [PATCH] Choose available address for ide disk

Royce Lv lvroyce at linux.vnet.ibm.com
Fri Apr 11 01:51:06 UTC 2014


On 2014年04月11日 03:32, Christy Perez wrote:
> Tested-By: Christy Perez <christy at linux.vnet.ibm.com>
>
> I added 3 new CD ROM devices to total 4, and they got the following
> addresses:
>        <address type='drive' controller='0' bus='1' target='0' unit='1'/>
>        <address type='drive' controller='0' bus='0' target='0' unit='1'/>
>        <address type='drive' controller='0' bus='0' target='0' unit='0'/>
>        <address type='drive' controller='0' bus='1' target='0' unit='0'/>
>
> Without the patch, I get the error "CHVM0019E: Unable to start virtual
> machine F19-Remote. Details: internal error: Only 1 ide controller is
> supported"
> when I try to start the VM.
>
> Two other small comments below...
Thanks for helping me clarify these, Christy, I will improve the commit 
mesg too.
> On Thu, 2014-04-10 at 18:28 +0800, lvroyce at linux.vnet.ibm.com wrote:
>> From: Royce Lv <lvroyce at linux.vnet.ibm.com>
>>
>> Tested:
>>   1.make check
>>   2.adding more than 4 cdroms report error
>>   3.less than 4 cdroms successful boot and see all cdroms.
>>   4.When a vm does not have cdrom, adding succeed.
>>
>> Now when just pass source and target type, bus information,
>> libvirt may generate another controller for ide disk appending,
>> this will be conflict with libvirt's limitation of 1 ide controller.
>> This patch choose available bus_id and unit_id for ide disk
>> to make sure we can reach the limit of 4 cdroms per vm.
>>
>> Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
>> ---
>>   src/kimchi/i18n.py             |  1 +
>>   src/kimchi/model/vmstorages.py | 56 +++++++++++++++++++++++++++++++-----------
>>   2 files changed, 43 insertions(+), 14 deletions(-)
>>
>> diff --git a/src/kimchi/i18n.py b/src/kimchi/i18n.py
>> index 86ab5d6..4ca83d9 100644
>> --- a/src/kimchi/i18n.py
>> +++ b/src/kimchi/i18n.py
>> @@ -230,6 +230,7 @@ messages = {
>>       "KCHCDROM0011E": _("Do not support guest CDROM hot plug attachment"),
>>       "KCHCDROM0012E": _("Specify type and path to add a new virtual machine disk"),
>>       "KCHCDROM0013E": _("Specify path to update virtual machine disk"),
>> +    "KCHCDROM0014E": _("Controller type %(type)s limitation %(limit)s reached"),
> Kind of a small thing, but with this error, it's not really clear on
> what the limit is. Just the number kind of makes it sound like it might
> be a return code or something. I suggest "Controller type %(type)s
> limitation of %(limit)s devices reached."
ACK
>>       "KCHREPOS0001E": _("YUM Repository ID must be one word only string."),
>>       "KCHREPOS0002E": _("Repository URL must be an http://, ftp:// or file:// URL."),
>> diff --git a/src/kimchi/model/vmstorages.py b/src/kimchi/model/vmstorages.py
>> index 3b5f99e..b3f22db 100644
>> --- a/src/kimchi/model/vmstorages.py
>> +++ b/src/kimchi/model/vmstorages.py
>> @@ -37,6 +37,16 @@ DEV_TYPE_SRC_ATTR_MAP = {'file': 'file',
>>                            'block': 'dev'}
>>
>>
>> +def _get_device_xml(dom, dev_name):
>> +    # Get VM xml and then devices xml
>> +    xml = dom.XMLDesc(0)
>> +    devices = objectify.fromstring(xml).devices
>> +    disk = devices.xpath("./disk/target[@dev='%s']/.." % dev_name)
>> +    if not disk:
>> +        return None
>> +    return disk[0]
>> +
>> +
>>   def _get_storage_xml(params):
>>       src_type = params.get('src_type')
>>       disk = E.disk(type=src_type, device=params.get('type'))
>> @@ -56,6 +66,12 @@ def _get_storage_xml(params):
>>           disk.append(source)
>>
>>       disk.append(E.target(dev=params.get('dev'), bus=params.get('bus', 'ide')))
>> +    if params.get('address'):
>> +        print params['address']
> Probably want to take that out.
My fault, thanks.
>> +        disk.append(E.address(
>> +            type='drive', controller=params['address']['controller'],
>> +            bus=params['address']['bus'], target='0',
>> +            unit=params['address']['unit']))
>>       return ET.tostring(disk)
>>
>>
>> @@ -89,6 +105,27 @@ class VMStoragesModel(object):
>>       def __init__(self, **kargs):
>>           self.conn = kargs['conn']
>>
>> +    def _get_available_ide_address(self, vm_name):
>> +        dom = VMModel.get_vm(vm_name, self.conn)
>> +        disks = self.get_list(vm_name)
>> +        valid_id = [('0', '0'), ('0', '1'), ('1', '0'), ('1', '1')]
>> +        controller_id = '0'
>> +        for dev_name in disks:
>> +            disk = _get_device_xml(dom, dev_name)
>> +            if disk.target.attrib['bus'] == 'ide':
>> +                controller_id = disk.address.attrib['controller']
>> +                bus_id = disk.address.attrib['bus']
>> +                unit_id = disk.address.attrib['unit']
>> +                if (bus_id, unit_id) in valid_id:
>> +                    valid_id.remove((bus_id, unit_id))
>> +                    continue
>> +        if not valid_id:
>> +            raise OperationFailed('KCHCDROM0014E', {'type': 'ide', 'limit': 4})
>> +        else:
>> +            address = {'controller': controller_id,
>> +                       'bus': valid_id[0][0], 'unit': valid_id[0][1]}
>> +            return dict(address=address)
>> +
>>       def create(self, vm_name, params):
>>           dom = VMModel.get_vm(vm_name, self.conn)
>>           if DOM_STATE_MAP[dom.info()[0]] != 'shutoff':
>> @@ -109,8 +146,7 @@ class VMStoragesModel(object):
>>           path = params['path']
>>           params['src_type'] = _check_cdrom_path(path)
>>
>> -        # Check if path is an url
>> -
>> +        params.update(self._get_available_ide_address(vm_name))
>>           # Add device to VM
>>           dev_xml = _get_storage_xml(params)
>>           try:
>> @@ -147,19 +183,10 @@ class VMStorageModel(object):
>>       def __init__(self, **kargs):
>>           self.conn = kargs['conn']
>>
>> -    def _get_device_xml(self, vm_name, dev_name):
>> -        # Get VM xml and then devices xml
>> -        dom = VMModel.get_vm(vm_name, self.conn)
>> -        xml = dom.XMLDesc(0)
>> -        devices = objectify.fromstring(xml).devices
>> -        disk = devices.xpath("./disk/target[@dev='%s']/.." % dev_name)
>> -        if not disk:
>> -            return None
>> -        return disk[0]
>> -
>>       def lookup(self, vm_name, dev_name):
>>           # Retrieve disk xml and format return dict
>> -        disk = self._get_device_xml(vm_name, dev_name)
>> +        dom = VMModel.get_vm(vm_name, self.conn)
>> +        disk = _get_device_xml(dom, dev_name)
>>           if disk is None:
>>               raise NotFoundError("KCHCDROM0007E", {'dev_name': dev_name,
>>                                                     'vm_name': vm_name})
>> @@ -188,7 +215,8 @@ class VMStorageModel(object):
>>
>>       def delete(self, vm_name, dev_name):
>>           # Get storage device xml
>> -        disk = self._get_device_xml(vm_name, dev_name)
>> +        dom = VMModel.get_vm(vm_name, self.conn)
>> +        disk = _get_device_xml(dom, dev_name)
>>           if disk is None:
>>               raise NotFoundError("KCHCDROM0007E",
>>                                   {'dev_name': dev_name,
> Regards,
>
>
> - Christy
>
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
>




More information about the Kimchi-devel mailing list