Add block device rollback for lvm volumes and groups

If mkfs fails then the rollback won't delete logical volumes or the
volume group. This prevents unmounting the loop back, and subsequent
image build runs will fail because the volume group still exists.

This change adds lvremove and vgremove rollback actions.

Change-Id: Ib93dfc43f5b3ef90fcec38538e828f135e514f8b
This commit is contained in:
Steve Baker 2024-09-02 13:50:09 +12:00
parent aa92b26105
commit 33fb961127

View File

@ -20,7 +20,6 @@ from diskimage_builder.block_device.plugin import NodeBase
from diskimage_builder.block_device.plugin import PluginBase
from diskimage_builder.block_device.utils import exec_sudo
from diskimage_builder.block_device.utils import parse_abs_size_spec
from diskimage_builder.block_device.utils import remove_device
PHYSICAL_EXTENT_BYTES = parse_abs_size_spec('4MiB')
LVS_TYPES = ['thin', 'thin-pool']
@ -70,6 +69,27 @@ logger = logging.getLogger(__name__)
# call that is driven by the LVSNode object.
def lvremove(device_name):
logger.debug('Removing logical volume %s', device_name)
try:
exec_sudo(["lvchange", "--activate", "n", device_name])
exec_sudo(["lvremove", "--yes", "/dev/%s" % device_name])
except BlockDeviceSetupException as e:
# Do not raise an error - maybe other cleanup methods
# can at least do some more work.
logger.warning("Removing logical volume failed (%s)", e.returncode)
def vgremove(vg_name):
logger.debug('Removing volume group %s', vg_name)
try:
exec_sudo(["vgremove", "--yes", "--force", vg_name])
except BlockDeviceSetupException as e:
# Do not raise an error - maybe other cleanup methods
# can at least do some more work.
logger.warning("Removing volume group failed (%s)", e.returncode)
class PvsNode(NodeBase):
def __init__(self, name, state, base, options):
"""Physical volume
@ -150,6 +170,7 @@ class VgsNode(NodeBase):
logger.debug("Creating vg command [%s]", cmd)
exec_sudo(cmd)
self.add_rollback(vgremove, self.name)
# save state
if 'vgs' not in self.state:
self.state['vgs'] = {}
@ -232,7 +253,7 @@ class LvsNode(NodeBase):
'opts': self.options,
'device': '/dev/mapper/%s' % device_name
}
self.add_rollback(remove_device, device_name)
self.add_rollback(lvremove, "%s/%s" % (self.base, self.name))
def _umount(self):
exec_sudo(['lvchange', '-an',