[PATCH 2/9] All container settings use container_ kwargs.

David Lehman dlehman at redhat.com
Mon Apr 22 15:22:49 UTC 2013


This goes along with the changes to anaconda's custom spoke to expand
its container management and improve separation between device-level
settings and container-level settings.
---
 blivet/devicefactory.py | 52 ++++++++++++++++++++++++++++++++++---------------
 1 file changed, 36 insertions(+), 16 deletions(-)

diff --git a/blivet/devicefactory.py b/blivet/devicefactory.py
index 9ed2569..5685ad0 100644
--- a/blivet/devicefactory.py
+++ b/blivet/devicefactory.py
@@ -209,6 +209,7 @@ class DeviceFactory(object):
     def __init__(self, storage, size, disks, fstype=None, mountpoint=None,
                  label=None, raid_level=None, encrypted=False,
                  container_encrypted=False, container_name=None,
+                 container_raid_level=None,
                  name=None, device=None):
         """ Create a new DeviceFactory instance.
 
@@ -225,6 +226,8 @@ class DeviceFactory(object):
                 label               filesystem label text
 
                 raid_level          raid level string, eg: "raid1"
+                container_raid_level
+
                 encrypted           whether to encrypt (boolean)
                 container_encrypted whether to encrypt the entire container
 
@@ -246,6 +249,8 @@ class DeviceFactory(object):
         self.label = label
 
         self.raid_level = raid_level
+        self.container_raid_level = container_raid_level
+
         self.encrypted = encrypted
         self.container_encrypted = container_encrypted
 
@@ -1155,19 +1160,34 @@ class LVMOnMDFactory(LVMFactory):
     """
     child_factory_class = MDFactory
 
-    def __init__(self, *args, **kwargs):
-        self.md_level = kwargs.pop("raid_level", None) or "raid1"
-        super(LVMOnMDFactory, self).__init__(*args, **kwargs)
-
     def _get_child_factory_kwargs(self):
         kwargs = super(LVMOnMDFactory, self)._get_child_factory_kwargs()
-        kwargs["raid_level"] = self.md_level
-        kwargs["name"] = self.storage.suggestDeviceName(prefix="pv")
-        if self.container:
+        kwargs["raid_level"] = self.container_raid_level
+        if self.container and self.container.parents:
             kwargs["device"] = self.container.parents[0]
-            kwargs["name"] = self.container.parents[0].name
+        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
@@ -1180,8 +1200,8 @@ class BTRFSFactory(DeviceFactory):
             log.info("overriding encryption setting for btrfs factory")
             self.encrypted = False
 
-        self.raid_level = self.raid_level or "single"
-        if self.raid_level == "single":
+        self.container_raid_level = self.container_raid_level or "single"
+        if self.container_raid_level == "single":
             self.size_set_class = TotalSizeSet
         else:
             self.size_set_class = SameSizeSet
@@ -1205,9 +1225,9 @@ class BTRFSFactory(DeviceFactory):
 
     def _get_device_space(self):
         # until we get/need something better
-        if self.raid_level in ("single", "raid0"):
+        if self.container_raid_level in ("single", "raid0"):
             return self.size
-        elif self.raid_level in ("raid1", "raid10"):
+        elif self.container_raid_level in ("raid1", "raid10"):
             return self.size * len(self._get_member_devices())
 
     @property
@@ -1221,7 +1241,7 @@ class BTRFSFactory(DeviceFactory):
         """ Create the container device required by this factory device. """
         parents = self._get_parent_devices()
         self.container = self._get_new_container(name=self.container_name,
-                                                 dataLevel=self.raid_level,
+                                                 dataLevel=self.container_raid_level,
                                                  parents=parents)
         self.storage.createDevice(self.container)
 
@@ -1244,7 +1264,7 @@ class BTRFSFactory(DeviceFactory):
         # make sure the member count is adequate for the new level
 
         # set the new level
-        self.container.dataLevel = self.raid_level
+        self.container.dataLevel = self.container_raid_level
 
     def _get_child_factory_kwargs(self):
         kwargs = super(BTRFSFactory, self)._get_child_factory_kwargs()
@@ -1253,7 +1273,7 @@ class BTRFSFactory(DeviceFactory):
 
     def _get_new_device(self, *args, **kwargs):
         """ Create and return the factory device as a StorageDevice. """
-        kwargs["dataLevel"] = self.raid_level
-        kwargs["metaDataLevel"] = self.raid_level
+        kwargs["dataLevel"] = self.container_raid_level
+        kwargs["metaDataLevel"] = self.container_raid_level
         kwargs["subvol"] = True
         return self.storage.newBTRFS(*args, **kwargs)
-- 
1.8.1.4



More information about the anaconda-patches mailing list