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