[PATCH 4/5] Move lvm-on-md into LVMFactory.
David Lehman
dlehman at redhat.com
Wed Jun 12 17:37:44 UTC 2013
Having it as a separate class was unnecessary and complicated the
matter of creating a factory class for lvm thin provisioning.
---
blivet/__init__.py | 4 ---
blivet/devicefactory.py | 87 +++++++++++++++++++++++++------------------------
2 files changed, 44 insertions(+), 47 deletions(-)
diff --git a/blivet/__init__.py b/blivet/__init__.py
index 7de454f..9c3944f 100644
--- a/blivet/__init__.py
+++ b/blivet/__init__.py
@@ -1877,10 +1877,6 @@ class Blivet(object):
device_type == devicefactory.DEVICE_TYPE_BTRFS:
device_type = devicefactory.DEVICE_TYPE_PARTITION
- if device_type == devicefactory.DEVICE_TYPE_LVM and \
- kwargs.get("container_raid_level"):
- device_type = devicefactory.DEVICE_TYPE_LVM_ON_MD
-
factory = devicefactory.get_device_factory(self, device_type, size,
**kwargs)
diff --git a/blivet/devicefactory.py b/blivet/devicefactory.py
index 27ad432..116a155 100644
--- a/blivet/devicefactory.py
+++ b/blivet/devicefactory.py
@@ -49,7 +49,6 @@ DEVICE_TYPE_MD = 1
DEVICE_TYPE_PARTITION = 2
DEVICE_TYPE_BTRFS = 3
DEVICE_TYPE_DISK = 4
-DEVICE_TYPE_LVM_ON_MD = 5
def get_device_type(device):
device_types = {"partition": DEVICE_TYPE_PARTITION,
@@ -96,7 +95,6 @@ def get_device_factory(blivet, device_type, size, **kwargs):
DEVICE_TYPE_BTRFS: BTRFSFactory,
DEVICE_TYPE_PARTITION: PartitionFactory,
DEVICE_TYPE_MD: MDFactory,
- DEVICE_TYPE_LVM_ON_MD: LVMOnMDFactory,
DEVICE_TYPE_DISK: DeviceFactory}
factory_class = class_table[device_type]
@@ -1053,6 +1051,11 @@ class LVMFactory(DeviceFactory):
child_factory_fstype = "lvmpv"
size_set_class = TotalSizeSet
+ def __init__(self, *args, **kwargs):
+ super(LVMFactory, self).__init__(*args, **kwargs)
+ if self.container_raid_level:
+ self.child_factory_class = MDFactory
+
#
# methods related to device size and disk space requirements
#
@@ -1141,6 +1144,10 @@ class LVMFactory(DeviceFactory):
**self.size_func_kwargs)
log.debug("size cut to %d to omit old device space" % size)
+ if self.container_raid_level:
+ # add one extent per disk to account for md metadata
+ size += LVM_PE_SIZE * len(self.disks)
+
return size
#
@@ -1169,6 +1176,14 @@ class LVMFactory(DeviceFactory):
def _get_child_factory_kwargs(self):
kwargs = super(LVMFactory, self)._get_child_factory_kwargs()
kwargs["encrypted"] = self.container_encrypted
+ if self.container_raid_level:
+ # md pv
+ kwargs["raid_level"] = self.container_raid_level
+ if self.container and self.container.parents:
+ kwargs["device"] = self.container.parents[0]
+ else:
+ kwargs["name"] = self.storage.suggestDeviceName(prefix="pv")
+
return kwargs
def _get_new_device(self, *args, **kwargs):
@@ -1198,6 +1213,33 @@ class LVMFactory(DeviceFactory):
% (self.device._name, safe_new_name))
self.device._name = safe_new_name
+ def _configure(self):
+ self._set_container()
+ if self.container and not self.container.exists:
+ # If there's already a VG associated with this LV that doesn't have
+ # MD PVs we need to remove the partition PVs.
+ # Likewise, if there's already a VG whose PV is an MD we need to
+ # remove it completely before proceeding.
+ for member in self.container.parents[:]:
+ use_dev = member
+ if isinstance(member, LUKSDevice):
+ use_dev = member.slave
+
+ if ((self.container_raid_level and use_dev.type != "mdarray") or
+ (not self.container_raid_level and use_dev.type == "mdarray")):
+ self.container.removeMember(member)
+ self.storage.destroyDevice(member)
+ if member != use_dev:
+ self.storage.destroyDevice(use_dev)
+
+ # for md pv we also need to remove the md member partitions
+ if not self.container_raid_level and \
+ use_dev.type == "mdarray":
+ for mdmember in use_dev.parents[:]:
+ self.storage.destroyDevice(mdmember)
+
+ super(LVMFactory, self)._configure()
+
class MDFactory(DeviceFactory):
""" Factory for creating MD RAID devices. """
child_factory_class = PartitionSetFactory
@@ -1237,47 +1279,6 @@ class MDFactory(DeviceFactory):
def _create_container(self, *args, **kwargs):
pass
-class LVMOnMDFactory(LVMFactory):
- """ LVM logical volume with single md physical volume.
-
- The specified raid level applies to the md layer -- not the lvm layer.
- """
- child_factory_class = MDFactory
-
- def _get_total_space(self):
- base = super(LVMOnMDFactory, self)._get_total_space()
- # add one extent per disk to account for mysterious space requirements
- base += LVM_PE_SIZE * len(self.disks)
- return base
-
- def _get_child_factory_kwargs(self):
- kwargs = super(LVMOnMDFactory, self)._get_child_factory_kwargs()
- kwargs["raid_level"] = self.container_raid_level
- if self.container and self.container.parents:
- kwargs["device"] = self.container.parents[0]
- else:
- kwargs["name"] = self.storage.suggestDeviceName(prefix="pv")
-
- return kwargs
-
- def _configure(self):
- # If there's already a VG associated with this LV that doesn't have MD
- # PVs we need to remove the partition PVs.
- self._set_container()
- if self.container:
- for member in self.container.parents[:]:
- use_dev = member
- if isinstance(member, LUKSDevice):
- use_dev = member.slave
-
- if use_dev.type != "mdarray":
- self.container.removeMember(member)
- self.storage.destroyDevice(member)
- if member != use_dev:
- self.storage.destroyDevice(use_dev)
-
- super(LVMOnMDFactory, self)._configure()
-
class BTRFSFactory(DeviceFactory):
""" BTRFS subvolume """
child_factory_class = PartitionSetFactory
--
1.8.1.4
More information about the anaconda-patches
mailing list