This patch sets the number of available memory device slots to the
number supported by each architecture in qemu/libvirt. Without the
restriction of 1GB per device, now kimchi Will allow users to hotplug
more devices than previous implementarion.
Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo(a)linux.vnet.ibm.com>
---
model/vms.py | 23 ++---------------------
osinfo.py | 11 +++++++++++
vmtemplate.py | 20 +++++---------------
3 files changed, 18 insertions(+), 36 deletions(-)
diff --git a/model/vms.py b/model/vms.py
index 0108381..48196dd 100644
--- a/model/vms.py
+++ b/model/vms.py
@@ -58,6 +58,7 @@ 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.osinfo import defaults
from wok.plugins.kimchi.screenshot import VMScreenshot
from wok.plugins.kimchi.utils import get_next_clone_name
from wok.plugins.kimchi.utils import template_name_from_uri
@@ -858,23 +859,6 @@ class VMModel(object):
elif newMem == (oldMem << 10):
newMem = newMem - memDevsAmount
- def _get_slots(mem, maxMem):
- slots = (maxMem - mem) >> 10 >> 10
- # Libvirt does not accepts slots <= 1
- if slots < 0:
- raise InvalidParameter("KCHTMPL0031E",
- {'mem': str(mem >> 10),
- 'maxmem': str(maxMem >> 10)})
- elif slots == 0:
- slots = 1
-
- # max 32 slots on Power
- distro, _, _ = platform.linux_distribution()
- if distro == "IBM_PowerKVM" and slots > 32:
- slots = 32
- return slots
- # End of _get_slots
-
# There is an issue in Libvirt/Qemu, where Guest does not start if
# memory and max memory are the same. So we decided to remove max
# memory and only add it if user explicitly provides it, willing to
@@ -886,7 +870,7 @@ class VMModel(object):
max_mem_xml = E.maxMemory(
str(newMaxMem),
unit='Kib',
- slots=str(_get_slots(newMem, newMaxMem)))
+ slots=str(defaults['mem_dev_slots']))
root.insert(0, max_mem_xml)
elif (maxMemTag is None) and (newMem == newMaxMem):
# Nothing to do
@@ -894,7 +878,6 @@ class VMModel(object):
elif (maxMemTag is not None) and (newMem != newMaxMem):
# Just update value in max memory tag
maxMemTag.text = str(newMaxMem)
- maxMemTag.set('slots', str(_get_slots(newMem, newMaxMem)))
elif (maxMemTag is not None) and (newMem == newMaxMem):
if self._get_mem_dev_total_size(ET.tostring(root)) == 0:
# Remove the tag
@@ -928,8 +911,6 @@ class VMModel(object):
if (newMem == newMaxMem and
(self._get_mem_dev_total_size(ET.tostring(root)) == 0)):
root.remove(maxMemTag)
- else:
- maxMemTag.set('slots', str(_get_slots(newMem, newMaxMem)))
# Setting memory hard limit to max_memory + 1GiB
memtune = root.find('memtune')
diff --git a/osinfo.py b/osinfo.py
index 7b80f29..d3909ad 100644
--- a/osinfo.py
+++ b/osinfo.py
@@ -34,6 +34,14 @@ SUPPORTED_ARCHS = {'x86': ('i386', 'i686',
'x86_64'),
'ppc64le': ('ppc64le')}
+# Memory devices slot limits by architecture
+MEM_DEV_SLOTS = {'ppc64': 32,
+ 'ppc64le': 32,
+ 'x86_64': 256,
+ 'i686': 256,
+ 'i386': 256}
+
+
template_specs = {'x86': {'old': dict(disk_bus='ide',
nic_model='e1000',
sound_model='ich6'),
'modern': dict(disk_bus='virtio',
@@ -175,6 +183,9 @@ def _get_tmpl_defaults():
# Update defaults values with graphics values
defaults['graphics'] = default_config.pop('graphics')
+ # Setting default memory device slots
+ defaults['mem_dev_slots'] = MEM_DEV_SLOTS.get(os.uname()[4], 32)
+
return defaults
diff --git a/vmtemplate.py b/vmtemplate.py
index 5e38275..ef92914 100644
--- a/vmtemplate.py
+++ b/vmtemplate.py
@@ -18,7 +18,6 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
import os
-import platform
import stat
import time
import urlparse
@@ -369,25 +368,16 @@ class VMTemplate(object):
# TODO: need modify this when boot order edition feature came upstream.
params['boot_order'] = get_bootorder_xml()
- # 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.
+ # Setting maximum number of memory slots
+ slots = str(self.info['mem_dev_slots'])
+
+ # Rearrange memory parameters
memory = self.info['memory'].get('current')
maxmemory = self.info['memory'].get('maxmemory')
-
- slots = (maxmemory - memory) >> 10
- if slots < 0:
+ if maxmemory < memory:
raise OperationFailed("KCHVM0041E",
{'maxmem': str(maxmemory)})
- elif slots == 0:
- slots = 1
- elif slots > 32:
- distro, _, _ = platform.linux_distribution()
- if distro == "IBM_PowerKVM":
- slots = 32
- # Rearrange memory parameters
params['memory'] = self.info['memory'].get('current')
params['max_memory'] = ""
# if there is not support to memory hotplug in Libvirt or qemu, we
--
2.1.0