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):