Persist existing LPAR wrapper attributes in DefaultStandardize on resize

The DefaultStandardize object in pypowervm defaults the proc units
factor, max virtio slots, uncapped weight, spp, availability
priority, srr, and proc compat (note that the enable lpar metric
parameter isn't included in this stable/pike commit as the minimum
pypowervm requirement for Pike does not support that parameter).
nova-powervm does not pass in these parameters when resizing.

This results in these attributes being set to the default defined
by the DefaultStandardize object for every resize operation. This
change passes those parameters into the DefaultStandardize object.

Note that if the attributes were passed in as part of the flavor
then the flavor's values would be set later in the DefaultStandardize
object by the LPARBuilder.

Closes-Bug: #1722923
Change-Id: I0e9ad0dbbc35658e096636a454ad493492025420
(cherry picked from commit 4bad1ec165)
This commit is contained in:
mdrabe 2017-10-11 16:03:36 -05:00
parent 5bf987ceed
commit 9e553a8659
2 changed files with 42 additions and 3 deletions

View File

@ -67,6 +67,33 @@ class TestVMBuilder(test.TestCase):
'pypowervm.util.sanitize_partition_name_for_api')).mock
self.san_lpar_name.side_effect = lambda name: name
def test_resize_attributes_maintained(self):
lpar_w = mock.MagicMock()
lpar_w.io_config.max_virtual_slots = 200
lpar_w.proc_config.shared_proc_cfg.pool_id = 56
lpar_w.avail_priority = 129
lpar_w.srr_enabled = False
lpar_w.proc_compat_mode = 'POWER7'
vm_bldr = vm.VMBuilder(self.host_w, self.adpt, cur_lpar_w=lpar_w)
self.assertEqual(200, vm_bldr.stdz.max_slots)
self.assertEqual(56, vm_bldr.stdz.spp)
self.assertEqual(129, vm_bldr.stdz.avail_priority)
self.assertFalse(vm_bldr.stdz.srr)
self.assertEqual('POWER7', vm_bldr.stdz.proc_compat)
def test_max_vslots_is_the_greater(self):
lpar_w = mock.MagicMock()
lpar_w.io_config.max_virtual_slots = 64
lpar_w.proc_config.shared_proc_cfg.pool_id = 56
lpar_w.avail_priority = 129
lpar_w.srr_enabled = False
lpar_w.proc_compat_mode = 'POWER7'
slot_mgr = mock.MagicMock()
slot_mgr.build_map.get_max_vslots.return_value = 128
vm_bldr = vm.VMBuilder(
self.host_w, self.adpt, slot_mgr=slot_mgr, cur_lpar_w=lpar_w)
self.assertEqual(128, vm_bldr.stdz.max_slots)
def test_conf_values(self):
# Test driver CONF values are passed to the standardizer
self.flags(uncapped_proc_weight=75, proc_units_factor=.25,

View File

@ -263,21 +263,32 @@ class VMBuilder(object):
pvm_bp.DedicatedSharingMode.SHARE_IDLE_PROCS_ALWAYS
}
def __init__(self, host_w, adapter, slot_mgr=None):
def __init__(self, host_w, adapter, slot_mgr=None, cur_lpar_w=None):
"""Initialize the converter.
:param host_w: The host system wrapper.
:param adapter: The pypowervm.adapter.Adapter for the PowerVM REST API.
:param slot_mgr: NovaSlotManager for setting/saving the maximum number
of virtual slots on the VM.
:param cur_lpar_w: The LPAR wrapper of the instance. Passing in this
parameter signifies a resize operation.
"""
self.adapter = adapter
self.host_w = host_w
kwargs = dict(uncapped_weight=CONF.powervm.uncapped_proc_weight,
proc_units_factor=CONF.powervm.proc_units_factor)
if cur_lpar_w:
# Maintain the existing attributes in DefaultStandardize
kwargs['max_slots'] = cur_lpar_w.io_config.max_virtual_slots
kwargs['spp'] = cur_lpar_w.proc_config.shared_proc_cfg.pool_id
kwargs['avail_priority'] = cur_lpar_w.avail_priority
kwargs['srr'] = cur_lpar_w.srr_enabled
kwargs['proc_compat'] = cur_lpar_w.proc_compat_mode
if slot_mgr is not None:
# This will already default if not set
kwargs['max_slots'] = slot_mgr.build_map.get_max_vslots()
max_vslots = slot_mgr.build_map.get_max_vslots()
if max_vslots > kwargs.get('max_slots', 0):
kwargs['max_slots'] = max_vslots
self.stdz = lpar_bldr.DefaultStandardize(self.host_w, **kwargs)
def lpar_builder(self, instance):
@ -578,7 +589,8 @@ def update(adapter, host_wrapper, instance, entry=None, name=None):
if not entry:
entry = get_instance_wrapper(adapter, instance)
lpar_b = VMBuilder(host_wrapper, adapter).lpar_builder(instance)
lpar_b = VMBuilder(host_wrapper, adapter, cur_lpar_w=entry).lpar_builder(
instance)
lpar_b.rebuild(entry)
# Set the new name if the instance name is not desired.