Adopt new pypowervm power_off APIs
Recent pypowervm release 1.1.6 introduced pypowervm.tasks.power.power_off_progressive and deprecated power_off. This change set updates to use power_off_progressive and PowerOp.stop() accordingly. Change-Id: If3ba623b2ee92139da14c38524dacc33b995d1b2
This commit is contained in:
parent
6cf382b960
commit
6532f8ec05
|
@ -27,7 +27,6 @@ from nova import test
|
|||
from nova.virt import event
|
||||
from pypowervm import exceptions as pvm_exc
|
||||
from pypowervm.helpers import log_helper as pvm_log
|
||||
from pypowervm.tasks import power
|
||||
from pypowervm.tests import test_fixtures as pvm_fx
|
||||
from pypowervm.tests.test_utils import pvmhttp
|
||||
from pypowervm.utils import lpar_builder as lpar_bld
|
||||
|
@ -38,6 +37,7 @@ from nova_powervm.tests.virt import powervm
|
|||
from nova_powervm.virt.powervm import exception as nvex
|
||||
from nova_powervm.virt.powervm import vm
|
||||
|
||||
|
||||
LPAR_HTTPRESP_FILE = "lpar.txt"
|
||||
LPAR_MAPPING = (
|
||||
{
|
||||
|
@ -572,16 +572,18 @@ class TestVM(test.TestCase):
|
|||
mock_lock.assert_called_once_with('power_%s' % instance.uuid)
|
||||
mock_lock.reset_mock()
|
||||
|
||||
@mock.patch('pypowervm.tasks.power.power_off')
|
||||
@mock.patch('pypowervm.tasks.power.PowerOp', autospec=True)
|
||||
@mock.patch('pypowervm.tasks.power.power_off_progressive', autospec=True)
|
||||
@mock.patch('oslo_concurrency.lockutils.lock')
|
||||
@mock.patch('nova_powervm.virt.powervm.vm.get_instance_wrapper')
|
||||
def test_power_off(self, mock_wrap, mock_lock, mock_power_off):
|
||||
def test_power_off(self, mock_wrap, mock_lock, mock_power_off, mock_pop):
|
||||
instance = objects.Instance(**powervm.TEST_INSTANCE)
|
||||
entry = mock.Mock(state=pvm_bp.LPARState.NOT_ACTIVATED)
|
||||
mock_wrap.return_value = entry
|
||||
|
||||
self.assertFalse(vm.power_off(None, instance))
|
||||
mock_power_off.assert_not_called()
|
||||
self.assertEqual(0, mock_power_off.call_count)
|
||||
self.assertEqual(0, mock_pop.stop.call_count)
|
||||
mock_lock.assert_called_once_with('power_%s' % instance.uuid)
|
||||
|
||||
stop_states = [
|
||||
|
@ -592,21 +594,24 @@ class TestVM(test.TestCase):
|
|||
for stop_state in stop_states:
|
||||
entry.state = stop_state
|
||||
mock_power_off.reset_mock()
|
||||
mock_pop.stop.reset_mock()
|
||||
mock_lock.reset_mock()
|
||||
self.assertTrue(vm.power_off(None, instance))
|
||||
mock_power_off.assert_called_once_with(
|
||||
entry, None, force_immediate=power.Force.ON_FAILURE,
|
||||
add_parms=None)
|
||||
mock_power_off.assert_called_once_with(entry)
|
||||
self.assertEqual(0, mock_pop.stop.call_count)
|
||||
mock_lock.assert_called_once_with('power_%s' % instance.uuid)
|
||||
mock_power_off.reset_mock()
|
||||
mock_lock.reset_mock()
|
||||
self.assertTrue(vm.power_off(
|
||||
None, instance, force_immediate=True, timeout=5))
|
||||
mock_power_off.assert_called_once_with(
|
||||
entry, None, force_immediate=True, add_parms=None, timeout=5)
|
||||
self.assertEqual(0, mock_power_off.call_count)
|
||||
mock_pop.stop.assert_called_once_with(
|
||||
entry, opts=mock.ANY, timeout=5)
|
||||
self.assertEqual('PowerOff(immediate=true, operation=shutdown)',
|
||||
str(mock_pop.stop.call_args[1]['opts']))
|
||||
mock_lock.assert_called_once_with('power_%s' % instance.uuid)
|
||||
|
||||
@mock.patch('pypowervm.tasks.power.power_off')
|
||||
@mock.patch('pypowervm.tasks.power.power_off_progressive', autospec=True)
|
||||
@mock.patch('nova_powervm.virt.powervm.vm.get_instance_wrapper')
|
||||
def test_power_off_negative(self, mock_wrap, mock_power_off):
|
||||
"""Negative tests."""
|
||||
|
@ -622,9 +627,11 @@ class TestVM(test.TestCase):
|
|||
|
||||
@mock.patch('oslo_concurrency.lockutils.lock')
|
||||
@mock.patch('nova_powervm.virt.powervm.vm.get_instance_wrapper')
|
||||
@mock.patch('pypowervm.tasks.power.power_on')
|
||||
@mock.patch('pypowervm.tasks.power.power_off')
|
||||
def test_reboot(self, mock_pwroff, mock_pwron, mock_giw, mock_lock):
|
||||
@mock.patch('pypowervm.tasks.power.power_on', autospec=True)
|
||||
@mock.patch('pypowervm.tasks.power.power_off_progressive', autospec=True)
|
||||
@mock.patch('pypowervm.tasks.power.PowerOp', autospec=True)
|
||||
def test_reboot(self, mock_pop, mock_pwroff, mock_pwron, mock_giw,
|
||||
mock_lock):
|
||||
entry = mock.Mock()
|
||||
inst = mock.Mock(uuid='uuid')
|
||||
mock_giw.return_value = entry
|
||||
|
@ -633,7 +640,8 @@ class TestVM(test.TestCase):
|
|||
entry.state = pvm_bp.LPARState.NOT_ACTIVATED
|
||||
vm.reboot('adapter', inst, True)
|
||||
mock_pwron.assert_called_once_with(entry, None)
|
||||
mock_pwroff.assert_not_called()
|
||||
self.assertEqual(0, mock_pwroff.call_count)
|
||||
self.assertEqual(0, mock_pop.stop.call_count)
|
||||
mock_lock.assert_called_once_with('power_uuid')
|
||||
|
||||
mock_pwron.reset_mock()
|
||||
|
@ -642,23 +650,22 @@ class TestVM(test.TestCase):
|
|||
# VM is in an active state
|
||||
entry.state = pvm_bp.LPARState.RUNNING
|
||||
vm.reboot('adapter', inst, True)
|
||||
mock_pwron.assert_not_called()
|
||||
mock_pwroff.assert_called_once_with(entry, None, force_immediate=True,
|
||||
add_parms=mock.ANY)
|
||||
self.assertEqual('PowerOff(restart=true)',
|
||||
str(mock_pwroff.call_args[1]['add_parms']))
|
||||
self.assertEqual(0, mock_pwron.call_count)
|
||||
self.assertEqual(0, mock_pwroff.call_count)
|
||||
mock_pop.stop.assert_called_once_with(entry, opts=mock.ANY)
|
||||
self.assertEqual(
|
||||
'PowerOff(immediate=true, operation=shutdown, restart=true)',
|
||||
str(mock_pop.stop.call_args[1]['opts']))
|
||||
mock_lock.assert_called_once_with('power_uuid')
|
||||
|
||||
mock_pwroff.reset_mock()
|
||||
mock_pop.stop.reset_mock()
|
||||
mock_lock.reset_mock()
|
||||
|
||||
# Same, but soft
|
||||
vm.reboot('adapter', inst, False)
|
||||
mock_pwron.assert_not_called()
|
||||
mock_pwroff.assert_called_once_with(entry, None, force_immediate=False,
|
||||
add_parms=mock.ANY)
|
||||
self.assertEqual('PowerOff(restart=true)',
|
||||
str(mock_pwroff.call_args[1]['add_parms']))
|
||||
self.assertEqual(0, mock_pwron.call_count)
|
||||
mock_pwroff.assert_called_once_with(entry, restart=True)
|
||||
self.assertEqual(0, mock_pop.stop.call_count)
|
||||
mock_lock.assert_called_once_with('power_uuid')
|
||||
|
||||
mock_pwroff.reset_mock()
|
||||
|
@ -668,11 +675,9 @@ class TestVM(test.TestCase):
|
|||
mock_pwroff.side_effect = Exception()
|
||||
self.assertRaises(exception.InstanceRebootFailure, vm.reboot,
|
||||
'adapter', inst, False)
|
||||
mock_pwron.assert_not_called()
|
||||
mock_pwroff.assert_called_once_with(entry, None, force_immediate=False,
|
||||
add_parms=mock.ANY)
|
||||
self.assertEqual('PowerOff(restart=true)',
|
||||
str(mock_pwroff.call_args[1]['add_parms']))
|
||||
self.assertEqual(0, mock_pwron.call_count)
|
||||
mock_pwroff.assert_called_once_with(entry, restart=True)
|
||||
self.assertEqual(0, mock_pop.stop.call_count)
|
||||
mock_lock.assert_called_once_with('power_uuid')
|
||||
|
||||
@mock.patch('nova_powervm.virt.powervm.vm.get_pvm_uuid')
|
||||
|
|
|
@ -657,14 +657,11 @@ def power_on(adapter, instance, opts=None):
|
|||
return False
|
||||
|
||||
|
||||
def power_off(adapter, instance, opts=None, force_immediate=False,
|
||||
timeout=None):
|
||||
def power_off(adapter, instance, force_immediate=False, timeout=None):
|
||||
"""Powers off a VM.
|
||||
|
||||
:param adapter: A pypowervm.adapter.Adapter.
|
||||
:param instance: The nova instance to power off.
|
||||
:param opts: (Optional) Additional parameters to the pypowervm power_off
|
||||
method. See that method's docstring for details.
|
||||
:param force_immediate: (Optional, Default False) Should it be immediately
|
||||
shut down.
|
||||
:param timeout: (Optional, Default None) How long to wait for the job
|
||||
|
@ -688,10 +685,11 @@ def power_off(adapter, instance, opts=None, force_immediate=False,
|
|||
try:
|
||||
LOG.debug("Power off executing.", instance=instance)
|
||||
kwargs = {'timeout': timeout} if timeout else {}
|
||||
force_flag = (power.Force.TRUE if force_immediate
|
||||
else power.Force.ON_FAILURE)
|
||||
power.power_off(entry, None, force_immediate=force_flag,
|
||||
add_parms=opts, **kwargs)
|
||||
if force_immediate:
|
||||
power.PowerOp.stop(
|
||||
entry, opts=popts.PowerOffOpts().vsp_hard(), **kwargs)
|
||||
else:
|
||||
power.power_off_progressive(entry, **kwargs)
|
||||
except Exception as e:
|
||||
LOG.exception("Failed to power off instance.",
|
||||
instance=instance)
|
||||
|
@ -717,8 +715,11 @@ def reboot(adapter, instance, hard):
|
|||
try:
|
||||
entry = get_instance_wrapper(adapter, instance)
|
||||
if entry.state != pvm_bp.LPARState.NOT_ACTIVATED:
|
||||
power.power_off(entry, None, force_immediate=hard,
|
||||
add_parms=popts.PowerOffOpts().restart())
|
||||
if hard:
|
||||
power.PowerOp.stop(
|
||||
entry, opts=popts.PowerOffOpts().vsp_hard().restart())
|
||||
else:
|
||||
power.power_off_progressive(entry, restart=True)
|
||||
else:
|
||||
# pypowervm does NOT throw an exception if "already down".
|
||||
# Any other exception from pypowervm is a legitimate failure;
|
||||
|
|
Loading…
Reference in New Issue