From 771b8caacf7015a83bb46a815ed092cf620a9ae2 Mon Sep 17 00:00:00 2001 From: Ramakrishnan G Date: Thu, 25 Jun 2015 00:03:17 -0700 Subject: [PATCH] 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 --- proliantutils/ilo/ribcl.py | 7 +++-- .../tests/ilo/ribcl_sample_outputs.py | 31 ++++++++++--------- proliantutils/tests/ilo/test_ribcl.py | 28 ++++++++++++++--- 3 files changed, 46 insertions(+), 20 deletions(-) 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):