diff --git a/nova_powervm/tests/virt/powervm/test_vm.py b/nova_powervm/tests/virt/powervm/test_vm.py index fd9591f8..9c6de8bf 100644 --- a/nova_powervm/tests/virt/powervm/test_vm.py +++ b/nova_powervm/tests/virt/powervm/test_vm.py @@ -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') diff --git a/nova_powervm/virt/powervm/vm.py b/nova_powervm/virt/powervm/vm.py index 68f9be2f..9fcf23ce 100644 --- a/nova_powervm/virt/powervm/vm.py +++ b/nova_powervm/virt/powervm/vm.py @@ -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;