Clean up images when ejecting an ISO with Redfish
There is no point in keeping the disconnected ISO files around. Change-Id: I371b0f6ab74de7aa26ecc4a65e825303e3d94085
This commit is contained in:
parent
7d6e936cfe
commit
da27e370b6
@ -221,9 +221,11 @@ def _eject_vmedia(task, managers, boot_device=None):
|
|||||||
:param boot_device: sushy boot device e.g. `VIRTUAL_MEDIA_CD`,
|
:param boot_device: sushy boot device e.g. `VIRTUAL_MEDIA_CD`,
|
||||||
`VIRTUAL_MEDIA_DVD` or `VIRTUAL_MEDIA_FLOPPY` or `None` to
|
`VIRTUAL_MEDIA_DVD` or `VIRTUAL_MEDIA_FLOPPY` or `None` to
|
||||||
eject everything (default).
|
eject everything (default).
|
||||||
|
:return: True if any device was ejected, else False
|
||||||
:raises: InvalidParameterValue, if no suitable virtual CD or DVD is
|
:raises: InvalidParameterValue, if no suitable virtual CD or DVD is
|
||||||
found on the node.
|
found on the node.
|
||||||
"""
|
"""
|
||||||
|
found = False
|
||||||
for manager in managers:
|
for manager in managers:
|
||||||
for v_media in manager.virtual_media.get_members():
|
for v_media in manager.virtual_media.get_members():
|
||||||
if boot_device and boot_device not in v_media.media_types:
|
if boot_device and boot_device not in v_media.media_types:
|
||||||
@ -233,12 +235,14 @@ def _eject_vmedia(task, managers, boot_device=None):
|
|||||||
|
|
||||||
if inserted:
|
if inserted:
|
||||||
v_media.eject_media()
|
v_media.eject_media()
|
||||||
|
found = True
|
||||||
|
|
||||||
LOG.info("Boot media is%(already)s ejected from "
|
LOG.info("Boot media is%(already)s ejected from "
|
||||||
"%(boot_device)s for node %(node)s"
|
"%(boot_device)s for node %(node)s"
|
||||||
"", {'node': task.node.uuid,
|
"", {'node': task.node.uuid,
|
||||||
'already': '' if inserted else ' already',
|
'already': '' if inserted else ' already',
|
||||||
'boot_device': v_media.name})
|
'boot_device': v_media.name})
|
||||||
|
return found
|
||||||
|
|
||||||
|
|
||||||
def eject_vmedia(task, boot_device=None):
|
def eject_vmedia(task, boot_device=None):
|
||||||
@ -252,7 +256,15 @@ def eject_vmedia(task, boot_device=None):
|
|||||||
found on the node.
|
found on the node.
|
||||||
"""
|
"""
|
||||||
system = redfish_utils.get_system(task.node)
|
system = redfish_utils.get_system(task.node)
|
||||||
_eject_vmedia(task, system.managers, boot_device=boot_device)
|
if _eject_vmedia(task, system.managers, boot_device=boot_device):
|
||||||
|
LOG.debug('Cleaning up unused files after ejecting %(dev)s for node '
|
||||||
|
'%(node)s', {'dev': boot_device or 'all devices',
|
||||||
|
'node': task.node.uuid})
|
||||||
|
if (boot_device is None
|
||||||
|
or boot_device == sushy.VIRTUAL_MEDIA_USBSTICK):
|
||||||
|
image_utils.cleanup_disk_image(task, prefix='configdrive')
|
||||||
|
if boot_device is None or boot_device == sushy.VIRTUAL_MEDIA_CD:
|
||||||
|
image_utils.cleanup_iso_image(task)
|
||||||
|
|
||||||
|
|
||||||
def _has_vmedia_device(managers, boot_device, inserted=None):
|
def _has_vmedia_device(managers, boot_device, inserted=None):
|
||||||
|
@ -1277,8 +1277,11 @@ class RedfishVirtualMediaBootTestCase(db_base.DbTestCase):
|
|||||||
redfish_boot._insert_vmedia,
|
redfish_boot._insert_vmedia,
|
||||||
task, [mock_manager], 'img-url', sushy.VIRTUAL_MEDIA_CD)
|
task, [mock_manager], 'img-url', sushy.VIRTUAL_MEDIA_CD)
|
||||||
|
|
||||||
|
@mock.patch.object(image_utils, 'cleanup_disk_image', autospec=True)
|
||||||
|
@mock.patch.object(image_utils, 'cleanup_iso_image', autospec=True)
|
||||||
@mock.patch.object(redfish_boot, 'redfish_utils', autospec=True)
|
@mock.patch.object(redfish_boot, 'redfish_utils', autospec=True)
|
||||||
def test_eject_vmedia_everything(self, mock_redfish_utils):
|
def test_eject_vmedia_everything(self, mock_redfish_utils,
|
||||||
|
mock_cleanup_iso, mock_cleanup_disk):
|
||||||
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
with task_manager.acquire(self.context, self.node.uuid,
|
||||||
shared=True) as task:
|
shared=True) as task:
|
||||||
@ -1301,9 +1304,15 @@ class RedfishVirtualMediaBootTestCase(db_base.DbTestCase):
|
|||||||
|
|
||||||
mock_vmedia_cd.eject_media.assert_called_once_with()
|
mock_vmedia_cd.eject_media.assert_called_once_with()
|
||||||
mock_vmedia_floppy.eject_media.assert_called_once_with()
|
mock_vmedia_floppy.eject_media.assert_called_once_with()
|
||||||
|
mock_cleanup_iso.assert_called_once_with(task)
|
||||||
|
mock_cleanup_disk.assert_called_once_with(task,
|
||||||
|
prefix='configdrive')
|
||||||
|
|
||||||
|
@mock.patch.object(image_utils, 'cleanup_disk_image', autospec=True)
|
||||||
|
@mock.patch.object(image_utils, 'cleanup_iso_image', autospec=True)
|
||||||
@mock.patch.object(redfish_boot, 'redfish_utils', autospec=True)
|
@mock.patch.object(redfish_boot, 'redfish_utils', autospec=True)
|
||||||
def test_eject_vmedia_specific(self, mock_redfish_utils):
|
def test_eject_vmedia_specific(self, mock_redfish_utils,
|
||||||
|
mock_cleanup_iso, mock_cleanup_disk):
|
||||||
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
with task_manager.acquire(self.context, self.node.uuid,
|
||||||
shared=True) as task:
|
shared=True) as task:
|
||||||
@ -1326,6 +1335,8 @@ class RedfishVirtualMediaBootTestCase(db_base.DbTestCase):
|
|||||||
|
|
||||||
mock_vmedia_cd.eject_media.assert_called_once_with()
|
mock_vmedia_cd.eject_media.assert_called_once_with()
|
||||||
self.assertFalse(mock_vmedia_floppy.eject_media.call_count)
|
self.assertFalse(mock_vmedia_floppy.eject_media.call_count)
|
||||||
|
mock_cleanup_iso.assert_called_once_with(task)
|
||||||
|
mock_cleanup_disk.assert_not_called()
|
||||||
|
|
||||||
@mock.patch.object(redfish_boot, 'redfish_utils', autospec=True)
|
@mock.patch.object(redfish_boot, 'redfish_utils', autospec=True)
|
||||||
def test_eject_vmedia_not_inserted(self, mock_redfish_utils):
|
def test_eject_vmedia_not_inserted(self, mock_redfish_utils):
|
||||||
|
@ -42,59 +42,26 @@ class RedfishVendorPassthruTestCase(db_base.DbTestCase):
|
|||||||
self.node = obj_utils.create_test_node(
|
self.node = obj_utils.create_test_node(
|
||||||
self.context, driver='redfish', driver_info=INFO_DICT)
|
self.context, driver='redfish', driver_info=INFO_DICT)
|
||||||
|
|
||||||
@mock.patch.object(redfish_boot, 'redfish_utils', autospec=True)
|
@mock.patch.object(redfish_boot, 'eject_vmedia', autospec=True)
|
||||||
def test_eject_vmedia_all(self, mock_redfish_utils):
|
def test_eject_vmedia_all(self, mock_eject_vmedia):
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
with task_manager.acquire(self.context, self.node.uuid,
|
||||||
shared=True) as task:
|
shared=True) as task:
|
||||||
|
|
||||||
mock_vmedia_cd = mock.MagicMock(
|
|
||||||
inserted=True,
|
|
||||||
media_types=[sushy.VIRTUAL_MEDIA_CD])
|
|
||||||
mock_vmedia_floppy = mock.MagicMock(
|
|
||||||
inserted=True,
|
|
||||||
media_types=[sushy.VIRTUAL_MEDIA_FLOPPY])
|
|
||||||
|
|
||||||
mock_manager = mock.MagicMock()
|
|
||||||
|
|
||||||
mock_manager.virtual_media.get_members.return_value = [
|
|
||||||
mock_vmedia_cd, mock_vmedia_floppy]
|
|
||||||
|
|
||||||
mock_redfish_utils.get_system.return_value.managers = [
|
|
||||||
mock_manager]
|
|
||||||
|
|
||||||
task.driver.vendor.eject_vmedia(task)
|
task.driver.vendor.eject_vmedia(task)
|
||||||
|
mock_eject_vmedia.assert_called_once_with(task, None)
|
||||||
|
|
||||||
mock_vmedia_cd.eject_media.assert_called_once_with()
|
@mock.patch.object(redfish_boot, 'eject_vmedia', autospec=True)
|
||||||
mock_vmedia_floppy.eject_media.assert_called_once_with()
|
def test_eject_vmedia_cd(self, mock_eject_vmedia):
|
||||||
|
|
||||||
@mock.patch.object(redfish_boot, 'redfish_utils', autospec=True)
|
|
||||||
def test_eject_vmedia_cd(self, mock_redfish_utils):
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
with task_manager.acquire(self.context, self.node.uuid,
|
||||||
shared=True) as task:
|
shared=True) as task:
|
||||||
|
|
||||||
mock_vmedia_cd = mock.MagicMock(
|
|
||||||
inserted=True,
|
|
||||||
media_types=[sushy.VIRTUAL_MEDIA_CD])
|
|
||||||
mock_vmedia_floppy = mock.MagicMock(
|
|
||||||
inserted=True,
|
|
||||||
media_types=[sushy.VIRTUAL_MEDIA_FLOPPY])
|
|
||||||
|
|
||||||
mock_manager = mock.MagicMock()
|
|
||||||
|
|
||||||
mock_manager.virtual_media.get_members.return_value = [
|
|
||||||
mock_vmedia_cd, mock_vmedia_floppy]
|
|
||||||
|
|
||||||
mock_redfish_utils.get_system.return_value.managers = [
|
|
||||||
mock_manager]
|
|
||||||
|
|
||||||
task.driver.vendor.eject_vmedia(task,
|
task.driver.vendor.eject_vmedia(task,
|
||||||
boot_device=sushy.VIRTUAL_MEDIA_CD)
|
boot_device=sushy.VIRTUAL_MEDIA_CD)
|
||||||
|
mock_eject_vmedia.assert_called_once_with(task,
|
||||||
mock_vmedia_cd.eject_media.assert_called_once_with()
|
sushy.VIRTUAL_MEDIA_CD)
|
||||||
mock_vmedia_floppy.eject_media.assert_not_called()
|
|
||||||
|
|
||||||
@mock.patch.object(redfish_vendor, 'redfish_utils', autospec=True)
|
@mock.patch.object(redfish_vendor, 'redfish_utils', autospec=True)
|
||||||
def test_eject_vmedia_invalid_dev(self, mock_redfish_utils):
|
def test_validate_invalid_dev(self, mock_redfish_utils):
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
with task_manager.acquire(self.context, self.node.uuid,
|
||||||
shared=True) as task:
|
shared=True) as task:
|
||||||
|
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
fixes:
|
||||||
|
- |
|
||||||
|
Removes unused local images after ejecting a virtual media device via
|
||||||
|
the ``eject_vmedia`` vendor passthru call of the ``redfish`` vendor
|
||||||
|
interface.
|
Loading…
Reference in New Issue
Block a user