[Kimchi-devel] [PATCH][Kimchi 1/3] Add support to edit max memory in Templates

Aline Manera alinefm at linux.vnet.ibm.com
Wed Feb 17 19:32:27 UTC 2016



On 02/17/2016 10:39 AM, Rodrigo Trujillo wrote:
>
>
> On 02/16/2016 10:43 AM, Paulo Ricardo Paz Vital wrote:
>>
>> On 02/16/2016 12:32 AM, Rodrigo Trujillo wrote:
>>> This patch changes the 'memory' parameter in API of Templates to:
>>> memory: {current: XXX, maxmemory: YYY}
>>> Other changes include:
>>> * enable maxmemory edition
>>> * remove max memory tests and limits
>>> * keeps max memory limit to 1TiB
>>> * changes templates.conf to suport max memory
>>> * set default memory and maxmemory to 1024
>>>
>>> Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo at linux.vnet.ibm.com>
>>> ---
>>>   API.json           | 44 ++++++++++++++++++++++++++------
>>>   docs/API.md        | 18 ++++++++++---
>>>   i18n.py            | 11 ++++++--
>>>   model/templates.py | 58 +++++++++++++++++++++++++++++++++++++++---
>>>   model/vms.py       | 10 ++++++--
>>>   osinfo.py          | 16 ++++++++----
>>>   template.conf      | 10 +++++---
>>>   vmtemplate.py      | 74 
>>> ++++++++++++++++++++++--------------------------------
>>>   8 files changed, 169 insertions(+), 72 deletions(-)
>>>
>>> diff --git a/API.json b/API.json
>>> index 294be64..fcde123 100644
>>> --- a/API.json
>>> +++ b/API.json
>>> @@ -453,10 +453,24 @@
>>>                       "error": "KCHTMPL0011E"
>>>                   },
>>>                   "memory": {
>>> -                    "description": "Memory (MB) for the template",
>>> -                    "type": "integer",
>>> -                    "minimum": 512,
>>> -                    "error": "KCHTMPL0013E"
>>> +                    "description": "Current memory and maximum 
>>> memory values",
>>> +                    "type": "object",
>>> +                    "properties": {
>>> +                        "current": {
>>> +                            "description": "Memory (MB) for the 
>>> template",
>>> +                            "type": "integer",
>>> +                            "minimum": 512,
>>> +                            "error": "KCHTMPL0013E"
>>> +                        },
>>> +                        "maxmemory": {
>>> +                            "description": "Maximum memory (MB) for 
>>> the template",
>>> +                            "type": "integer",
>>> +                            "minimum": 512,
>>> +                            "error": "KCHTMPL0013E"
>>> +                        }
>>> +                    },
>>> +            "additionalProperties": false,
>>> +                    "error": "KCHTMPL0030E"
>>>                   },
>>>                   "cdrom": {
>>>                       "description": "Path for cdrom",
>>> @@ -630,10 +644,24 @@
>>>                       "error": "KCHTMPL0011E"
>>>                   },
>>>                   "memory": {
>>> -                    "description": "Memory (MB) for the template",
>>> -                    "type": "integer",
>>> -                    "minimum": 512,
>>> -                    "error": "KCHTMPL0013E"
>>> +                    "description": "Current memory and maximum 
>>> memory values",
>>> +                    "type": "object",
>>> +                    "properties": {
>>> +                        "current": {
>>> +                            "description": "Memory (MB) for the 
>>> template",
>>> +                            "type": "integer",
>>> +                            "minimum": 512,
>>> +                            "error": "KCHTMPL0013E"
>>> +                        },
>>> +                        "maxmemory": {
>>> +                            "description": "Maximum memory (MB) for 
>>> the template",
>>> +                            "type": "integer",
>>> +                            "minimum": 512,
>>> +                            "error": "KCHTMPL0013E"
>>> +                        }
>>> +                    },
>>> +            "additionalProperties": false,
>>> +                    "error": "KCHTMPL0030E"
>>>                   },
>>>                   "cdrom": {
>>>                       "description": "Path for cdrom",
>>> diff --git a/docs/API.md b/docs/API.md
>>> index a46e80e..33d51ac 100644
>>> --- a/docs/API.md
>>> +++ b/docs/API.md
>>> @@ -292,8 +292,11 @@ Represents a snapshot of the Virtual Machine's 
>>> primary monitor.
>>>       * name: The name of the Template.  Used to identify the 
>>> Template in this API
>>>       * os_distro *(optional)*: The operating system distribution
>>>       * os_version *(optional)*: The version of the operating system 
>>> distribution
>>> -    * memory *(optional)*: The amount of memory assigned to the VM.
>>> -      Default is 1024M.
>>> +    * memory *(optional)*: The memory parameters of the template, 
>>> specify one
>>> +      or both. Default values are 1024MiB:
>>> +        * current: The amount of memory that will be assigned to 
>>> the VM.
>>> +        * maxmemory: The maximum total of memory that the VM can 
>>> have. Amount
>>> +          over current will be used exclusively for memory hotplug
>>>       * cdrom *(optional)*: A volume name or URI to an ISO image.
>>>       * networks *(optional)*: list of networks will be assigned to 
>>> the new VM.
>>>         Default is '[default]'
>>> @@ -396,7 +399,11 @@ A interface represents available network 
>>> interface on VM.
>>>       * icon: A URI to a PNG image representing this template
>>>       * os_distro: The operating system distribution
>>>       * os_version: The version of the operating system distribution
>>> -    * memory: The amount of memory assigned to the VM in the unit 
>>> of MB
>>> +    * memory: The memory parameters of the template, that will be 
>>> assigned to
>>> +      the VM in the unit of MiB.
>>> +        * current: The amount of memory that will be assigned to 
>>> the VM.
>>> +        * maxmemory: The maximum total of memory that the VM can 
>>> have. Amount
>>> +          over current will be used exclusively for memory hotplug
>>>       * cdrom: A volume name or URI to an ISO image
>>>       * storagepool: URI of the storagepool where template allocates 
>>> vm storage.
>>>       * networks *(optional)*: list of networks will be assigned to 
>>> the new VM.
>>> @@ -439,7 +446,10 @@ A interface represents available network 
>>> interface on VM.
>>>       * icon: A URI to a PNG image representing this template
>>>       * os_distro: The operating system distribution
>>>       * os_version: The version of the operating system distribution
>>> -    * memory: The amount of memory assigned to the VM
>>> +    * memory: The memory parameters of the template, specify one or 
>>> both of:
>>> +        * current: The amount of memory that will be assigned to 
>>> the VM.
>>> +        * maxmemory: The maximum total of memory that the VM can 
>>> have. Amount
>>> +          over current will be used exclusively for memory hotplug
>>>       * cdrom: A volume name or URI to an ISO image
>>>       * networks *(optional)*: list of networks will be assigned to 
>>> the new VM.
>>>       * disks: An array of requested disks with the following 
>>> optional fields
>>> diff --git a/i18n.py b/i18n.py
>>> index 59e75f7..5395879 100644
>>> --- a/i18n.py
>>> +++ b/i18n.py
>>> @@ -127,9 +127,14 @@ messages = {
>>>       "KCHVM0068E": _("Unable to setup password-less login at remote 
>>> host %(host)s using user %(user)s. Error: %(error)s"),
>>>       "KCHVM0069E": _("Password field must be a string."),
>>>       "KCHVM0070E": _("Error creating local host ssh rsa key of user 
>>> 'root'."),
>>> -    "KCHVM0071E": _("Memory value %(mem)s must be aligned to 
>>> %(alignment)sMiB."),
>>> +    "KCHVM0071E": _("%(param)s value (%(mem)sMiB) must be aligned 
>>> to %(alignment)sMiB."),
>>>       "KCHVM0073E": _("Unable to update the following parameters 
>>> while the VM is offline: %(params)s"),
>>>       "KCHVM0074E": _("Unable to update the following parameters 
>>> while the VM is online: %(params)s"),
>>> +    "KCHVM0075E": _("Maximum memory requested is higher than amount 
>>> supported by the host: %(memHost)sMiB."),
>>> +    "KCHVM0076E": _("Maximum memory requested is higher than 
>>> maximum amount recommended: 1TiB"),
>>> +    "KCHVM0077E": _("Cannot update maximum memory when guest is 
>>> running."),
>> KCHVM0076E and KCHVM0077E already exist and were not modified. See below
>>
>>> +    "KCHVM0078E": _("Maximum memory requested is higher than amount 
>>> supported by the host: %(memHost)sMiB."),
>>> +    "KCHVM0079E": _("Memory requested is higher than maximum amount 
>>> recommended: 1TiB"),
>>>
>>>       "KCHVM0076E": _("VM %(name)s must have serial and console 
>>> defined to open a web serial console"),
>>>       "KCHVM0077E": _("Impossible to get the serial console of 
>>> %(name)s"),
>> They are here ^^^
>
> ACK
>>
>>> @@ -165,7 +170,7 @@ messages = {
>>>       "KCHTMPL0010E": _("Template distribution must be a string"),
>>>       "KCHTMPL0011E": _("Template distribution version must be a 
>>> string"),
>>>       "KCHTMPL0012E": _("The number of CPUs must be an integer 
>>> greater than 0"),
>>> -    "KCHTMPL0013E": _("Amount of memory (MB) must be an integer 
>>> greater than 512"),
>>> +    "KCHTMPL0013E": _("Amount of memory and maximum memory (MB) 
>>> must be an integer greater than 512"),
>>>       "KCHTMPL0014E": _("Template CDROM must be a local or remote 
>>> ISO file"),
>>>       "KCHTMPL0015E": _("Invalid storage pool URI %(value)s 
>>> specified for template"),
>>>       "KCHTMPL0016E": _("Specify an ISO image as CDROM or a base 
>>> image to create a template"),
>>> @@ -181,6 +186,8 @@ messages = {
>>>       "KCHTMPL0027E": _("Invalid disk image format. Valid formats: 
>>> bochs, cloop, cow, dmg, qcow, qcow2, qed, raw, vmdk, vpc."),
>>>       "KCHTMPL0028E": _("When setting template disks, following 
>>> parameters are required: 'index', 'pool name', 'format', 'size' or 
>>> 'volume' (for scsi/iscsi pools)"),
>>>       "KCHTMPL0029E": _("Disk format must be 'raw', for logical, 
>>> iscsi, and scsi pools."),
>>> +    "KCHTMPL0030E": _("Memory expects an object with one or both 
>>> parameters: 'current' and 'maxmemory'"),
>>> +    "KCHTMPL0031E": _("Memory value (%(mem)sMiB) must be equal or 
>>> lesser than maximum memory value (%(maxmem)sMiB)"),
>>>
>>>       "KCHPOOL0001E": _("Storage pool %(name)s already exists"),
>>>       "KCHPOOL0002E": _("Storage pool %(name)s does not exist"),
>>> diff --git a/model/templates.py b/model/templates.py
>>> index 8a29e02..6138592 100644
>>> --- a/model/templates.py
>>> +++ b/model/templates.py
>>> @@ -20,6 +20,8 @@
>>>   import copy
>>>   import libvirt
>>>   import os
>>> +import platform
>>> +import psutil
>>>   import stat
>>>
>>>   from wok.exception import InvalidOperation, InvalidParameter
>>> @@ -34,6 +36,12 @@ from wok.plugins.kimchi.utils import 
>>> pool_name_from_uri
>>>   from wok.plugins.kimchi.vmtemplate import VMTemplate
>>>
>>>
>>> +# In PowerPC, memories must be aligned to 256 MiB
>>> +PPC_MEM_ALIGN = 256
>>> +# Max memory 1TB, in KiB
>>> +MAX_MEM_LIM = 1073741824
>>> +
>>> +
>>>   class TemplatesModel(object):
>>>       def __init__(self, **kargs):
>>>           self.objstore = kargs['objstore']
>>> @@ -69,10 +77,8 @@ class TemplatesModel(object):
>>>           # Validate cpu info
>>>           t.cpuinfo_validate()
>>>
>>> -        # Validate max memory
>>> -        maxMem = (t._get_max_memory(t.info.get('memory')) >> 10)
>>> -        if t.info.get('memory') > maxMem:
>>> -            raise OperationFailed("KCHVM0041E", {'maxmem': 
>>> str(maxMem)})
>>> +        # Validate memory
>>> +        self._validate_memory(t.info.get('memory'))
>>>
>>>           # Validate volumes
>>>           for disk in t.info.get('disks'):
>>> @@ -115,6 +121,44 @@ class TemplatesModel(object):
>>>                   raise InvalidParameter("KCHTMPL0019E", {'pool': 
>>> pool_name,
>>> 'volume': volume})
>>>
>>> +    def _validate_memory(self, memory):
>>> +        current = memory.get('current')
>>> +        maxmem = memory.get('maxmemory')
>>> +
>>> +        # Memories must be lesser than 1TB and the Host memory limit
>>> +        if maxmem > (MAX_MEM_LIM >> 10):
>>> +            raise InvalidParameter("KCHVM0076E")
>>> +        if current > (MAX_MEM_LIM >> 10):
>>> +            raise InvalidParameter("KCHVM0079E")
>>> +
>>> +        if hasattr(psutil, 'virtual_memory'):
>>> +            host_memory = psutil.virtual_memory().total >> 10 >> 10
>>> +        else:
>>> +            host_memory = psutil.TOTAL_PHYMEM >> 10 >> 10
>>> +        if maxmem > host_memory:
>>> +            raise InvalidParameter("KCHVM0075E", {'memHost': 
>>> host_memory})
>>> +        if current > host_memory:
>>> +            raise InvalidParameter("KCHVM0078E", {'memHost': 
>>> host_memory})
>>> +
>>> +        if current > maxmem:
>>> +            raise InvalidParameter("KCHTMPL0031E",
>>> +                                   {'mem': str(current),
>>> +                                    'maxmem': str(maxmem)})
>>> +
>>> +        # make sure memory and Maxmemory are alingned in 256MiB in 
>>> PowerPC
>>> +        distro, _, _ = platform.linux_distribution()
>>> +        if distro == "IBM_PowerKVM":
>>> +            if current % PPC_MEM_ALIGN != 0:
>>> +                raise InvalidParameter('KCHVM0071E',
>>> +                                       {'param': "Memory",
>>> +                                        'mem': str(current),
>>> +                                        'alignment': 
>>> str(PPC_MEM_ALIGN)})
>>> +            elif maxmem % PPC_MEM_ALIGN != 0:
>>> +                raise InvalidParameter('KCHVM0071E',
>>> +                                       {'param': "Maximum Memory",
>>> +                                        'mem': str(maxmem),
>>> +                                        'alignment': 
>>> str(PPC_MEM_ALIGN)})
>>> +
>>>
>>>   class TemplateModel(object):
>>>       def __init__(self, **kargs):
>>> @@ -180,6 +224,12 @@ class TemplateModel(object):
>>>               cpu_info.update(new_cpu_info)
>>>               params['cpu_info'] = cpu_info
>>>
>>> +        # Fix memory values, because method update does not work 
>>> recursively
>>> +        new_mem = params.get('memory')
>>> +        if new_mem:
>>> +            params['memory'] = copy.copy(old_t.get('memory'))
>>> +            params['memory'].update(new_mem)
>>> +
>>>           new_t.update(params)
>>>
>>>           for net_name in params.get(u'networks', []):
>>> diff --git a/model/vms.py b/model/vms.py
>>> index 23e0df9..400ef46 100644
>>> --- a/model/vms.py
>>> +++ b/model/vms.py
>>> @@ -53,13 +53,13 @@ from wok.plugins.kimchi.model.config import 
>>> CapabilitiesModel
>>>   from wok.plugins.kimchi.model.cpuinfo import CPUInfoModel
>>>   from wok.plugins.kimchi.model.featuretests import FeatureTests
>>>   from wok.plugins.kimchi.model.templates import TemplateModel
>>> +from wok.plugins.kimchi.model.templates import MAX_MEM_LIM, 
>>> PPC_MEM_ALIGN
>>>   from wok.plugins.kimchi.model.utils import 
>>> get_ascii_nonascii_name, get_vm_name
>>>   from wok.plugins.kimchi.model.utils import get_metadata_node
>>>   from wok.plugins.kimchi.model.utils import remove_metadata_node
>>>   from wok.plugins.kimchi.model.utils import set_metadata_node
>>>   from wok.plugins.kimchi.screenshot import VMScreenshot
>>>   from wok.plugins.kimchi.utils import template_name_from_uri
>>> -from wok.plugins.kimchi.vmtemplate import MAX_MEM_LIM, PPC_MEM_ALIGN
>>>   from wok.plugins.kimchi.xmlutils.cpu import get_cpu_xml, get_numa_xml
>>>   from wok.plugins.kimchi.xmlutils.cpu import get_topology_xml
>>>   from wok.plugins.kimchi.xmlutils.disk import get_vm_disk_info, 
>>> get_vm_disks
>>> @@ -256,7 +256,13 @@ class VMModel(object):
>>>               if 'memory' in params and distro == "IBM_PowerKVM":
>>>                   if params['memory'] % PPC_MEM_ALIGN != 0:
>>>                       raise InvalidParameter('KCHVM0071E',
>>> -                                           {'mem': 
>>> str(params['memory']),
>>> +                                           {'param': "Memory",
>>> +                                            'mem': str(memory),
>>> +                                            'alignment': 
>>> str(PPC_MEM_ALIGN)})
>>> +                elif maxmem % PPC_MEM_ALIGN != 0:
>>> +                    raise InvalidParameter('KCHVM0071E',
>>> +                                           {'param': "Maximum Memory",
>>> +                                            'mem': str(maxmem),
>>>                                               'alignment': 
>>> str(PPC_MEM_ALIGN)})
>>>
>>>               dom = self.get_vm(name, self.conn)
>>> diff --git a/osinfo.py b/osinfo.py
>>> index 2ec5c3e..8102548 100644
>>> --- a/osinfo.py
>>> +++ b/osinfo.py
>>> @@ -110,11 +110,13 @@ def _get_tmpl_defaults():
>>>       ConfigObj returns a dict like below when no changes were made 
>>> in the
>>>       template configuration file (template.conf)
>>>
>>> -    {'main': {}, 'storage': {'disk.0': {}}, 'processor': {}, 
>>> 'graphics': {}}
>>> +    {'main': {}, 'memory': {}, 'storage': {'disk.0': {}}, 
>>> 'processor': {},
>>> +     'graphics': {}}
>>>
>>>       The default values should be like below:
>>>
>>> -    {'main': {'networks': ['default'], 'memory': '1024'},
>>> +    {'main': {'networks': ['default']},
>>> +     'memory': {'current': 1024, 'maxmemory': 1024},
>>>        'storage': { 'disk.0': {'format': 'qcow2', 'size': '10',
>>>                                'pool': 
>>> '/plugins/kimchi/storagepools/default'}},
>>>        'processor': {'vcpus': '1',  'maxvcpus': 1},
>>> @@ -123,7 +125,8 @@ def _get_tmpl_defaults():
>>>       # Create dict with default values
>>>       tmpl_defaults = defaultdict(dict)
>>>       tmpl_defaults['main']['networks'] = ['default']
>>> -    tmpl_defaults['main']['memory'] = _get_default_template_mem()
>>> +    tmpl_defaults['memory'] = {'current': _get_default_template_mem(),
>>> +                               'maxmemory': 
>>> _get_default_template_mem()}
>>>       tmpl_defaults['storage']['disk.0'] = {'size': 10, 'format': 
>>> 'qcow2',
>>>                                             'pool': 'default'}
>>>       tmpl_defaults['processor']['vcpus'] = 1
>>> @@ -145,8 +148,11 @@ def _get_tmpl_defaults():
>>>                   'cdrom_bus': 'ide', 'cdrom_index': 2, 'mouse_bus': 
>>> 'ps2'}
>>>
>>>       # Parse main section to get networks and memory values
>>> -    main_section = default_config.pop('main')
>>> -    defaults.update(main_section)
>>> +    defaults.update(default_config.pop('main'))
>>> +    defaults['memory'] = default_config.pop('memory')
>>> +
>>> +    defaults['memory']['current'] = int(defaults['memory']['current'])
>>> +    defaults['memory']['maxmemory'] = 
>>> int(defaults['memory']['maxmemory'])
>>>
>>>       # Parse storage section to get disks values
>>>       storage_section = default_config.pop('storage')
>>> diff --git a/template.conf b/template.conf
>>> index 3839be4..c4598f1 100644
>>> --- a/template.conf
>>> +++ b/template.conf
>>> @@ -3,13 +3,17 @@
>>>   #
>>>
>>>   [main]
>>> -# Memory in MB
>>> -#memory = 1024
>>> -
>>>   # List of networks separated by comma
>>>   # Represents the virtual network interfaces to be assigned to guest
>>>   #networks = default,
>>>
>>> +[memory]
>>> +# Memory in MB
>>> +# current = 1024
>>> +
>>> +# Maximum value of memory to be assigned to guest in MB
>>> +# maxmemory = 1024
>>> +
>>>   [storage]
>>>
>>>   # Specify multiple [[disk.X]] sub-sections to add multiples disks 
>>> to guest
>>> diff --git a/vmtemplate.py b/vmtemplate.py
>>> index ef17ff6..ab6d580 100644
>>> --- a/vmtemplate.py
>>> +++ b/vmtemplate.py
>>> @@ -19,7 +19,6 @@
>>>
>>>   import os
>>>   import platform
>>> -import psutil
>>>   import stat
>>>   import time
>>>   import urlparse
>>> @@ -42,12 +41,6 @@ from wok.plugins.kimchi.xmlutils.qemucmdline 
>>> import get_qemucmdline_xml
>>>   from wok.plugins.kimchi.xmlutils.serial import get_serial_xml
>>>
>>>
>>> -# In PowerPC, memories must be aligned to 256 MiB
>>> -PPC_MEM_ALIGN = 256
>>> -# Max memory 1TB, in KiB
>>> -MAX_MEM_LIM = 1073741824
>>> -
>>> -
>>>   class VMTemplate(object):
>>>       def __init__(self, args, scan=False):
>>>           """
>>> @@ -84,6 +77,14 @@ class VMTemplate(object):
>>>               args['graphics'] = graphics
>>>
>>>           default_disk = self.info['disks'][0]
>>> +
>>> +        # Complete memory args, because dict method update is not 
>>> recursive
>>> +        if 'memory' in args:
>>> +            if 'current' not in args['memory']:
>> After apply your patch and execute a GET on templates, to list my
>> current templates, I got the following error:
>>
>>    File
>> "/home/pvital/Projects/tmp/wok_test/src/wok/plugins/kimchi/vmtemplate.py", 
>>
>> line 83, in __init__
>>      if 'current' not in args['memory']:
>> TypeError: argument of type 'int' is not iterable
>>
>>
>> the line executed was:
>>
>> $ curl -k -u test -H "Content-Type: application/json" -H "Accept:
>> application/json" 'https://localhost:8001/plugins/kimchi/templates' 
>> -X GET
>>
>> So, what happens if I already have templates in the old model (the
>> current one today) after I apply your patches? I don't have the new
>> structure of memory.
>
> Yes, templates must be updated. I will add a script to do this.
> Thanks
>

We also have to update the cpu struture as it was changed too.

>
>>> + args['memory']['current'] = self.info['memory']['current']
>>> +            if 'maxmemory' not in args['memory']:
>>> +                args['memory']['maxmemory'] = 
>>> self.info['memory']['maxmemory']
>>> +
>>>           # Override template values according to 'args'
>>>           self.info.update(args)
>>>           disks = self.info.get('disks')
>>> @@ -325,29 +326,8 @@ class VMTemplate(object):
>>>       def _get_cpu_xml(self):
>>>           # Include CPU topology, if provided
>>>           cpu_topo = self.info.get('cpu_info', {}).get('topology', {})
>>> -
>>> -        return get_cpu_xml(0, self.info.get('memory') << 10, cpu_topo)
>>> -
>>> -    def _get_max_memory(self, guest_memory):
>>> -        # Setting maxMemory of the VM, which will be lesser value 
>>> between:
>>> -        # 1TB,  (Template Memory * 4),  Host Physical Memory.
>>> -        max_memory = MAX_MEM_LIM
>>> -        if hasattr(psutil, 'virtual_memory'):
>>> -            host_memory = psutil.virtual_memory().total >> 10
>>> -        else:
>>> -            host_memory = psutil.TOTAL_PHYMEM >> 10
>>> -        if host_memory < max_memory:
>>> -            max_memory = host_memory
>>> -        if (((guest_memory * 4) << 10) < max_memory):
>>> -            max_memory = (guest_memory * 4) << 10
>>> -
>>> -        # set up arch to ppc64 instead of ppc64le due to libvirt 
>>> compatibility
>>> -        if self.info["arch"] == "ppc64":
>>> -            # in Power, memory must be aligned in 256MiB
>>> -            if (max_memory >> 10) % PPC_MEM_ALIGN != 0:
>>> -                alignment = max_memory % (PPC_MEM_ALIGN << 10)
>>> -                max_memory -= alignment
>>> -        return max_memory
>>> +        return get_cpu_xml(0, 
>>> (self.info.get('memory').get('current')) << 10,
>>> +                           cpu_topo)
>>>
>>>       def to_vm_xml(self, vm_name, vm_uuid, **kwargs):
>>>           params = dict(self.info)
>>> @@ -375,27 +355,33 @@ class VMTemplate(object):
>>>           else:
>>>               params['cdroms'] = cdrom_xml
>>>
>>> -        # max memory
>>> -        params['max_memory'] = self._get_max_memory(params['memory'])
>>> -
>>>           # Setting maximum number of slots to avoid errors when 
>>> hotplug memory
>>>           # Number of slots are the numbers of chunks of 1GB that 
>>> fit inside
>>>           # the max_memory of the host minus memory assigned to the 
>>> VM. It
>>>           # cannot have more than 32 slots in Power.
>>> -        params['slots'] = ((params['max_memory'] >> 10) -
>>> -                           params['memory']) >> 10
>>> -        if params['slots'] < 0:
>>> +        memory = self.info['memory'].get('current')
>>> +        maxmemory = self.info['memory'].get('maxmemory')
>>> +
>>> +        slots = (maxmemory - memory) >> 10
>>> +        if slots < 0:
>>>               raise OperationFailed("KCHVM0041E",
>>> -                                  {'maxmem': 
>>> str(params['max_memory'] >> 10)})
>>> -        elif params['slots'] == 0:
>>> -            params['slots'] = 1
>>> -        elif params['slots'] > 32:
>>> +                                  {'maxmem': str(maxmemory)})
>>> +        elif slots == 0:
>>> +            slots = 1
>>> +        elif slots > 32:
>>>               distro, _, _ = platform.linux_distribution()
>>>               if distro == "IBM_PowerKVM":
>>> -                params['slots'] = 32
>>> +                slots = 32
>>> +
>>> +        # Rearrange memory parameters
>>> +        params['memory'] = self.info['memory'].get('current')
>>> +        params['max_memory'] = ""
>>> +        if memory != maxmemory:
>>> +            maxmem_xml = "<maxMemory slots='%s' 
>>> unit='MiB'>%s</maxMemory>"
>>> +            params['max_memory'] = maxmem_xml % (slots, maxmemory)
>>>
>>>           # set a hard limit using max_memory + 1GiB
>>> -        params['hard_limit'] = params['max_memory'] + (1024 << 10)
>>> +        params['hard_limit'] = maxmemory + 1024
>>>
>>>           # vcpu element
>>>           cpus = params['cpu_info']['vcpus']
>>> @@ -411,9 +397,9 @@ class VMTemplate(object):
>>>             <name>%(name)s</name>
>>>             <uuid>%(uuid)s</uuid>
>>>             <memtune>
>>> -            <hard_limit unit='KiB'>%(hard_limit)s</hard_limit>
>>> +            <hard_limit unit='MiB'>%(hard_limit)s</hard_limit>
>>>             </memtune>
>>> -          <maxMemory slots='%(slots)s' 
>>> unit='KiB'>%(max_memory)s</maxMemory>
>>> +          %(max_memory)s
>>>             <memory unit='MiB'>%(memory)s</memory>
>>>             %(vcpus_xml)s
>>>             %(cpu_info_xml)s
>>>
>> _______________________________________________
>> Kimchi-devel mailing list
>> Kimchi-devel at ovirt.org
>> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
>>
>
> _______________________________________________
> 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