Merge "Adopt new pypowervm power_off APIs"

This commit is contained in:
Jenkins 2017-08-09 13:12:07 +00:00 committed by Gerrit Code Review
commit 00dedba9d0
2 changed files with 46 additions and 40 deletions

View File

@ -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')

View File

@ -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;