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