From cd648ffd8e1f442534a7cc662236000c03e064b3 Mon Sep 17 00:00:00 2001 From: karmab Date: Thu, 1 Mar 2018 14:09:40 +0100 Subject: [PATCH] reboot stopped vms in ovirt When using ovirt driver, make sure reboot starts stopped vms Closes-Bug: #1752575 Story: 1752575 Change-Id: I851935a042c3e69e7e4ce72d6338ce2f77baa566 Signed-off-by: karmab --- ironic_staging_drivers/ovirt/ovirt.py | 16 ++++++---------- .../tests/unit/ovirt/test_ovirt.py | 16 ++++++++++++++++ .../tests/unit/third_party_driver_mock_specs.py | 5 +++++ .../tests/unit/third_party_driver_mocks.py | 8 ++++++++ 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/ironic_staging_drivers/ovirt/ovirt.py b/ironic_staging_drivers/ovirt/ovirt.py index 71e9071..433ff49 100644 --- a/ironic_staging_drivers/ovirt/ovirt.py +++ b/ironic_staging_drivers/ovirt/ovirt.py @@ -208,7 +208,11 @@ class oVirtPower(base.PowerInterface): elif target_state == states.POWER_ON: vm.start() elif target_state == states.REBOOT: - vm.reboot() + status = vm.get().status.value + if status == 'down': + vm.start() + else: + vm.reboot() else: msg = _("'set_power_state' called with invalid power " "state '%s'") % target_state @@ -230,15 +234,7 @@ class oVirtPower(base.PowerInterface): :raises: ovirtsdk4.Error, if error encountered from oVirt operation. """ - driver_info = _parse_driver_info(task.node) - vm_name = driver_info['ovirt_vm_name'] - vm = _getvm(driver_info) - try: - vm.reboot() - except sdk.Error as e: - LOG.error("Could not restart VM vm %(name)s " - "got error: %(error)s", {'name': vm_name, 'error': e}) - raise staging_exception.oVirtError(err=e) + self.set_power_state(task, states.REBOOT, timeout=timeout) class oVirtManagement(base.ManagementInterface): diff --git a/ironic_staging_drivers/tests/unit/ovirt/test_ovirt.py b/ironic_staging_drivers/tests/unit/ovirt/test_ovirt.py index 8d4f352..4d351fb 100644 --- a/ironic_staging_drivers/tests/unit/ovirt/test_ovirt.py +++ b/ironic_staging_drivers/tests/unit/ovirt/test_ovirt.py @@ -110,3 +110,19 @@ class oVirtDriverTestCase(db_base.DbTestCase): task.driver.management.set_boot_device(task, boot_devices.DISK) mock_power.assert_called_once_with(task.driver.management, task, boot_devices.DISK) + + @mock.patch.object(ovirt_power, '_getvm') + def test_set_reboot_when_down(self, mock_vm): + mock_vm.return_value.get.return_value.status.value = 'down' + + with task_manager.acquire(self.context, self.node.uuid) as task: + task.driver.power.reboot(task) + mock_vm.return_value.start.assert_called_once() + + @mock.patch.object(ovirt_power, '_getvm') + def test_set_reboot_when_up(self, mock_vm): + mock_vm.return_value.get.return_value.status.value = 'up' + + with task_manager.acquire(self.context, self.node.uuid) as task: + task.driver.power.reboot(task) + mock_vm.return_value.reboot.assert_called_once() diff --git a/ironic_staging_drivers/tests/unit/third_party_driver_mock_specs.py b/ironic_staging_drivers/tests/unit/third_party_driver_mock_specs.py index 8ee1737..f4556f4 100644 --- a/ironic_staging_drivers/tests/unit/third_party_driver_mock_specs.py +++ b/ironic_staging_drivers/tests/unit/third_party_driver_mock_specs.py @@ -29,3 +29,8 @@ LIBVIRT_SPEC = ( 'VIR_CRED_AUTHNAME', 'VIR_CRED_PASSPHRASE', ) + +# ovirt +OVIRT4_SPEC = ( + 'types', +) diff --git a/ironic_staging_drivers/tests/unit/third_party_driver_mocks.py b/ironic_staging_drivers/tests/unit/third_party_driver_mocks.py index 8984459..19bc05f 100644 --- a/ironic_staging_drivers/tests/unit/third_party_driver_mocks.py +++ b/ironic_staging_drivers/tests/unit/third_party_driver_mocks.py @@ -62,3 +62,11 @@ if not libvirt: if 'ironic_staging_drivers.libvirt.power' in sys.modules: six.moves.reload_module( sys.modules['ironic_staging_drivers.libvirt.power']) + +# attempt to load the external 'ovirtsdk4' library, which is required by +# the optional drivers.modules.ovirt module +ovirtsdk4 = importutils.try_import('ovirtsdk4') +if not ovirtsdk4: + ov = mock.MagicMock(spec_set=mock_specs.OVIRT4_SPEC) + sys.modules['ovirtsdk4'] = ov + sys.modules['ovirtsdk4.types'] = ov.types