diff --git a/proliantutils/ilo/ribcl.py b/proliantutils/ilo/ribcl.py index 85aae93..beee15c 100644 --- a/proliantutils/ilo/ribcl.py +++ b/proliantutils/ilo/ribcl.py @@ -353,10 +353,13 @@ class RIBCLOperations(operations.IloOperations): def eject_virtual_media(self, device='FLOPPY'): """Ejects the Virtual Media image if one is inserted.""" + vm_status = self.get_vm_status(device=device) + if vm_status['IMAGE_INSERTED'] == 'NO': + return + dic = {'DEVICE': device.upper()} - data = self._execute_command( + self._execute_command( 'EJECT_VIRTUAL_MEDIA', 'RIB_INFO', 'write', dic) - return data def set_vm_status(self, device='FLOPPY', boot_option='BOOT_ONCE', write_protect='YES'): diff --git a/proliantutils/tests/ilo/ribcl_sample_outputs.py b/proliantutils/tests/ilo/ribcl_sample_outputs.py index 8652dfc..1759c77 100644 --- a/proliantutils/tests/ilo/ribcl_sample_outputs.py +++ b/proliantutils/tests/ilo/ribcl_sample_outputs.py @@ -402,29 +402,32 @@ INSERT_VIRTUAL_MEDIA_XML = ''' ''' + EJECT_VIRTUAL_MEDIA_XML = ''' - +\r - + - - +\r - + - - +\r - - - - - - + ''' + SET_HOST_POWER_XML = ''' diff --git a/proliantutils/tests/ilo/test_ribcl.py b/proliantutils/tests/ilo/test_ribcl.py index 280adee..a1f153d 100644 --- a/proliantutils/tests/ilo/test_ribcl.py +++ b/proliantutils/tests/ilo/test_ribcl.py @@ -228,10 +228,26 @@ class IloRibclTestCase(unittest.TestCase): self.assertIsNone(result) self.assertTrue(request_ilo_mock.called) + @mock.patch.object(ribcl.RIBCLOperations, 'get_vm_status') @mock.patch.object(ribcl.RIBCLOperations, '_request_ilo') - def test_eject_virtual_media(self, request_ilo_mock): + def test_eject_virtual_media_no_media( + self, request_ilo_mock, get_vm_status_mock): + """Ensure we don't try to eject media when no media is present.""" + get_vm_status_mock.return_value = {'IMAGE_INSERTED': 'NO'} + self.ilo.eject_virtual_media(device='FLOPPY') + get_vm_status_mock.assert_called_once_with(device='FLOPPY') + self.assertFalse(request_ilo_mock.called) + + @mock.patch.object(ribcl.RIBCLOperations, 'get_vm_status') + @mock.patch.object(ribcl.RIBCLOperations, '_request_ilo') + def test_eject_virtual_media( + self, request_ilo_mock, get_vm_status_mock): + """Ensure we try to eject media when media is present.""" + get_vm_status_mock.return_value = {'IMAGE_INSERTED': 'YES'} request_ilo_mock.return_value = constants.EJECT_VIRTUAL_MEDIA_XML - self.assertRaises(exception.IloError, self.ilo.eject_virtual_media) + self.ilo.eject_virtual_media(device='CDROM') + get_vm_status_mock.assert_called_once_with(device='CDROM') + request_ilo_mock.assert_called_once_with(mock.ANY) @mock.patch.object(ribcl.RIBCLOperations, '_request_ilo') def test_set_vm_status(self, request_ilo_mock): @@ -759,10 +775,14 @@ class IloRibclTestCaseBeforeRisSupport(unittest.TestCase): self.assertIsNone(result) self.assertTrue(request_ilo_mock.called) + @mock.patch.object(ribcl.RIBCLOperations, 'get_vm_status') @mock.patch.object(ribcl.IloClient, '_request_ilo') - def test_eject_virtual_media(self, request_ilo_mock): + def test_eject_virtual_media(self, request_ilo_mock, get_vm_status_mock): + get_vm_status_mock.return_value = {'IMAGE_INSERTED': 'YES'} request_ilo_mock.return_value = constants.EJECT_VIRTUAL_MEDIA_XML - self.assertRaises(ribcl.IloError, self.ilo.eject_virtual_media) + self.assertIsNone(self.ilo.eject_virtual_media(device='CDROM')) + get_vm_status_mock.assert_called_once_with(device='CDROM') + request_ilo_mock.assert_called_once_with(mock.ANY) @mock.patch.object(ribcl.IloClient, '_request_ilo') def test_set_vm_status(self, request_ilo_mock):