[PATCH 3/5] Convert ContainerDevice to an abstract base class.

David Lehman dlehman at redhat.com
Mon Mar 24 18:50:50 UTC 2014


---
 blivet/devices.py | 36 +++++++++++++++++++++++++-----------
 1 file changed, 25 insertions(+), 11 deletions(-)

diff --git a/blivet/devices.py b/blivet/devices.py
index c264007..d7335c1 100644
--- a/blivet/devices.py
+++ b/blivet/devices.py
@@ -24,6 +24,7 @@ import os
 import copy
 import pprint
 import tempfile
+import abc
 from decimal import Decimal
 
 # device backend modules
@@ -2047,8 +2048,12 @@ class ContainerDevice(StorageDevice):
         within :meth:`.deviceaction.ActionAddMember.execute` and
         :meth:`.deviceaction.ActionRemoveMember.execute`.
     """
-    _formatClassName = None
-    _formatUUIDAttr = None
+    __metaclass__ = abc.ABCMeta
+
+    _formatClassName = abc.abstractproperty(lambda s: None,
+        doc="The type of member devices' required format")
+    _formatUUIDAttr = abc.abstractproperty(lambda s: None,
+        doc="The container UUID attribute in the member format class")
 
     def __init__(self, *args, **kwargs):
         self.formatClass = get_device_format_class(self._formatClassName)
@@ -2112,6 +2117,7 @@ class ContainerDevice(StorageDevice):
         self.parents.remove(member)
         member.removeChild()
 
+    @abc.abstractmethod
     def _add(self, member):
         """ Device-type specific code to add a member to the container.
 
@@ -2120,7 +2126,7 @@ class ContainerDevice(StorageDevice):
 
             This method writes the member addition to disk.
         """
-        pass
+        raise NotImplementedError()
 
     def add(self, member):
         """ Add a member to the container.
@@ -2143,6 +2149,7 @@ class ContainerDevice(StorageDevice):
         if member not in self.parents:
             self._addMember(member)
 
+    @abc.abstractmethod
     def _remove(self, member):
         """ Device-type specific code to remove a member from the container.
 
@@ -2151,7 +2158,7 @@ class ContainerDevice(StorageDevice):
 
             This method writes the member removal to disk.
         """
-        pass
+        raise NotImplementedError()
 
     def remove(self, member):
         """ Remove a member from the container.
@@ -2183,8 +2190,8 @@ class LVMVolumeGroupDevice(ContainerDevice):
     """
     _type = "lvmvg"
     _packages = ["lvm2"]
-    _formatClassName = "lvmpv"
-    _formatUUIDAttr = "vgUuid"
+    _formatClassName = property(lambda s: "lvmpv")
+    _formatUUIDAttr = property(lambda s: "vgUuid")
 
     def __init__(self, name, parents=None, size=None, free=None,
                  peSize=None, peCount=None, peFree=None, pvCount=None,
@@ -3084,8 +3091,8 @@ class MDRaidArrayDevice(ContainerDevice):
     _type = "mdarray"
     _packages = ["mdadm"]
     _devDir = "/dev/md"
-    _formatClassName = "mdmember"
-    _formatUUIDAttr = "mdUuid"
+    _formatClassName = property(lambda s: "mdmember")
+    _formatUUIDAttr = property(lambda s: "mdUuid")
 
     def __init__(self, name, level=None, major=None, minor=None, size=None,
                  memberDevices=None, totalDevices=None,
@@ -3615,7 +3622,8 @@ class DMRaidArrayDevice(DMDevice, ContainerDevice):
     _packages = ["dmraid"]
     _partitionable = True
     _isDisk = True
-    _formatClassName = "dmraidmember"
+    _formatClassName = property(lambda s: "dmraidmember")
+    _formatUUIDAttr = property(lambda s: None)
 
     def __init__(self, name, raidSet=None, format=None,
                  size=None, parents=None, sysfsPath=''):
@@ -3683,6 +3691,12 @@ class DMRaidArrayDevice(DMDevice, ContainerDevice):
 
         log.debug("not tearing down dmraid device %s", self.name)
 
+    def _add(self, member):
+        raise NotImplementedError()
+
+    def _remove(self, member):
+        raise NotImplementedError()
+
     @property
     def description(self):
         return "BIOS RAID set (%s)" % self._raidSet.rs.set_type
@@ -4532,8 +4546,8 @@ class BTRFSDevice(StorageDevice):
 class BTRFSVolumeDevice(BTRFSDevice, ContainerDevice):
     _type = "btrfs volume"
     vol_id = btrfs.MAIN_VOLUME_ID
-    _formatClassName = "btrfs"
-    _formatUUIDAttr = "volUUID"
+    _formatClassName = property(lambda s: "btrfs")
+    _formatUUIDAttr = property(lambda s: "volUUID")
 
     def __init__(self, *args, **kwargs):
         self.dataLevel = kwargs.pop("dataLevel", None)
-- 
1.8.5.3



More information about the anaconda-patches mailing list