Check if virtual media is attached before ejecting

This commit changes eject_virtual_media in RIBCL to
check if virtual media is attached before trying to
eject it. This will no longer raise exception if
virtual media is not attached.

Change-Id: If76671b706e97fa52814e61d9403292289a19e6d
Partial-Bug: 1466729
This commit is contained in:
Ramakrishnan G
2015-06-25 00:03:17 -07:00
parent 175859abd5
commit 771b8caacf
3 changed files with 46 additions and 20 deletions

View File

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

View File

@@ -402,29 +402,32 @@ INSERT_VIRTUAL_MEDIA_XML = '''
</RIBCL>
'''
EJECT_VIRTUAL_MEDIA_XML = '''
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0"?>\r
<RIBCL VERSION="2.23">
<RESPONSE STATUS="0x0000" MESSAGE="No error" />
<RESPONSE
STATUS="0x0000"
MESSAGE=\'No error\'
/>
</RIBCL>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0"?>\r
<RIBCL VERSION="2.23">
<RESPONSE STATUS="0x0000" MESSAGE="No error" />
<RESPONSE
STATUS="0x0000"
MESSAGE=\'No error\'
/>
</RIBCL>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0"?>\r
<RIBCL VERSION="2.23">
<RESPONSE STATUS="0x0000" MESSAGE="No error" />
</RIBCL>
<?xml version="1.0" encoding="UTF-8"?>
<RIBCL VERSION="2.23">
<RESPONSE STATUS="0x0039"
MESSAGE="No image present in the Virtual Media drive" />
<RESPONSE
STATUS="0x0000"
MESSAGE=\'No error\'
/>
</RIBCL>
'''
SET_HOST_POWER_XML = '''
<?xml version="1.0" encoding="UTF-8"?>
<RIBCL VERSION="2.23">

View File

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