[Kimchi-devel] [PATCH][Kimchi 1/2] Issue #838: Extend memory hotplug feature test

Rodrigo Trujillo rodrigo.trujillo at linux.vnet.ibm.com
Wed Mar 23 14:25:11 UTC 2016



On 03/23/2016 09:44 AM, Aline Manera wrote:
>
>
> On 03/22/2016 11:18 AM, Rodrigo Trujillo wrote:
>> If QEMU version is < 2.1, qemu is not going to start guest which have
>> maxmemory tag configured in the XML. Kimchi adds this tag by default in
>> order to allow memory hotplug.
>> In other words, in order to allow memory hotplug, versions must be
>> libvirt >= 1.2.14 and qemu >= 2.1. Libvirt was already being tested by
>> the feature test, but qemu did not. Distros as Red Hat 7 and CentOS
>> still are in qemu 1.5.
>> This patch extend the feature test and do not create maxmemory tag in
>> order to avoid problems in those distros.
>>
>> Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo at linux.vnet.ibm.com>
>> ---
>>   i18n.py               |  2 +-
>>   model/featuretests.py | 20 +++++++++++++-------
>>   model/vms.py          |  8 ++++++++
>>   vmtemplate.py         |  7 ++++++-
>>   4 files changed, 28 insertions(+), 9 deletions(-)
>>
>> diff --git a/i18n.py b/i18n.py
>> index beefeb5..6214687 100644
>> --- a/i18n.py
>> +++ b/i18n.py
>> @@ -99,7 +99,7 @@ messages = {
>>       "KCHVM0043E": _("Only increase memory is allowed in active VMs"),
>>       "KCHVM0044E": _("For live memory update, new memory value must 
>> be equal old memory value plus multiples of 1024 Mib"),
>>       "KCHVM0045E": _("There are not enough free slots of 1024 Mib in 
>> the guest."),
>> -    "KCHVM0046E": _("Host's libvirt version does not support memory 
>> devices. Libvirt must be >= 1.2.14"),
>> +    "KCHVM0046E": _("Host's libvirt or qemu version does not support 
>> memory devices and memory hotplug. Libvirt must be >= 1.2.14 and QEMU 
>> must be >= 2.1."),
>>       "KCHVM0047E": _("Error attaching memory device. Details: 
>> %(error)s"),
>>       "KCHVM0048E": _("Cannot start %(name)s. Virtual machine is 
>> already running."),
>>       "KCHVM0049E": _("Cannot power off %(name)s. Virtual machine is 
>> shut off."),
>> diff --git a/model/featuretests.py b/model/featuretests.py
>> index 378335a..ba728e1 100644
>> --- a/model/featuretests.py
>> +++ b/model/featuretests.py
>> @@ -72,6 +72,14 @@ MAXMEM_VM_XML = """
>>       <type arch='%(arch)s'>hvm</type>
>>       <boot dev='hd'/>
>>     </os>
>
>> +  <cpu>
>> +    <numa>
>> +      <cell id='0' cpus='0' memory='10240' unit='KiB'/>
>> +    </numa>
>> +  </cpu>
>> +  <features>
>> +    <acpi/>
>> +  </features>
>
> Is it really needed?

I my previous tests it was necessary ... but I retested now and it is 
not necessary. I will remove

>
>>   </domain>"""
>>
>>   DEV_MEM_XML = """
>> @@ -209,13 +217,9 @@ class FeatureTests(object):
>>           A memory device can be hot-plugged or hot-unplugged since 
>> libvirt
>>           version 1.2.14.
>>           '''
>> -        # Libvirt < 1.2.14 does not support memory devices, so 
>> firstly, check
>> -        # its version, then try to attach a device. These steps 
>> avoid errors
>> -        # with Libvirt 'test' driver for KVM
>> -        version = 1000000*1 + 1000*2 + 14
>> -        if libvirt.getVersion() < version:
>> -            return False
>> -
>> +        # Libvirt < 1.2.14 does not support memory devices, so try 
>> to attach a
>> +        # device. Then check if QEMU (>= 2.1) supports memory 
>> hotplug, starting
>> +        # the guest These steps avoid errors with Libvirt 'test' 
>> driver for KVM
>>           with RollbackContext() as rollback:
>>               FeatureTests.disable_libvirt_error_logging()
>> rollback.prependDefer(FeatureTests.enable_libvirt_error_logging)
>> @@ -230,6 +234,8 @@ class FeatureTests(object):
>>               try:
>>                   dom.attachDeviceFlags(DEV_MEM_XML,
>> libvirt.VIR_DOMAIN_MEM_CONFIG)
>> +                dom.create()
>> +                rollback.prependDefer(dom.destroy)
>>                   return True
>>               except libvirt.libvirtError:
>>                   return False
>> diff --git a/model/vms.py b/model/vms.py
>> index 03ffdae..557d37a 100644
>> --- a/model/vms.py
>> +++ b/model/vms.py
>> @@ -809,6 +809,14 @@ class VMModel(object):
>>           return (nonascii_name if nonascii_name is not None else 
>> vm_name, dom)
>>
>>       def _update_memory_config(self, xml, params):
>> +        # Cannot pass max memory if there is not support to memory 
>> hotplug
>> +        # Then set max memory as memory, just to continue with the 
>> update
>> +        if not self.caps.mem_hotplug_support:
>> +            if 'maxmemory' in params['memory']:
>> +                raise InvalidOperation("KCHVM0046E")
>> +            else:
>> +                params['memory']['maxmemory'] = 
>> params['memory']['current']
>> +
>>           root = ET.fromstring(xml)
>>           # MiB to KiB
>>           hasMem = 'current' in params['memory']
>> diff --git a/vmtemplate.py b/vmtemplate.py
>> index 4bcf324..535efd7 100644
>> --- a/vmtemplate.py
>> +++ b/vmtemplate.py
>> @@ -32,6 +32,7 @@ from wok.exception import MissingParameter, 
>> OperationFailed
>>   from wok.plugins.kimchi import imageinfo
>>   from wok.plugins.kimchi import osinfo
>>   from wok.plugins.kimchi.isoinfo import IsoImage
>> +from wok.plugins.kimchi.model.config import CapabilitiesModel
>>   from wok.plugins.kimchi.utils import check_url_path, 
>> pool_name_from_uri
>>   from wok.plugins.kimchi.xmlutils.cpu import get_cpu_xml
>>   from wok.plugins.kimchi.xmlutils.disk import get_disk_xml
>> @@ -118,6 +119,8 @@ class VMTemplate(object):
>>               disk_info['index'] = disk_info.get('index', index)
>>               self.info['disks'][index] = disk_info
>
>> +        self.caps = CapabilitiesModel()
>> +
>
> VMTemplate must be independent of Model. In fact, you don't know which 
> Model instance is being using.
> So you should pass the information from Model to VMTemplate as parameter.
>
> Use kwargs argument from to_vm_xml() function.
>
> def to_vm_xml(self, vm_name, vm_uuid, **kwargs):

ack !  thanks
>
>>       def _get_os_info(self, args, scan):
>>           distro = version = 'unknown'
>>
>> @@ -376,7 +379,9 @@ class VMTemplate(object):
>>           # Rearrange memory parameters
>>           params['memory'] = self.info['memory'].get('current')
>>           params['max_memory'] = ""
>> -        if memory != maxmemory:
>> +        # if there is not support to memory hotplug in Libvirt or 
>> qemu, we
>> +        # cannot add the tag maxMemory
>> +        if memory != maxmemory and self.caps.mem_hotplug_support:
>>               maxmem_xml = "<maxMemory slots='%s' 
>> unit='MiB'>%s</maxMemory>"
>>               params['max_memory'] = maxmem_xml % (slots, maxmemory)
>>
>
> _______________________________________________
> 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