[blivet:master 08/11] Add a size() method to the raid classes (#1085474)

mulhern amulhern at redhat.com
Fri Apr 11 15:23:09 UTC 2014


Related: fed#1085474

Signed-off-by: mulhern <amulhern at redhat.com>
---
 blivet/devicelibs/mdraid.py        |  3 +++
 blivet/devicelibs/raid.py          | 39 ++++++++++++++++++++++++++++++++++++++
 tests/devicelibs_test/raid_test.py | 34 ++++++++++++++++++++++++++++++++-
 3 files changed, 75 insertions(+), 1 deletion(-)

diff --git a/blivet/devicelibs/mdraid.py b/blivet/devicelibs/mdraid.py
index 1077400..1445167 100644
--- a/blivet/devicelibs/mdraid.py
+++ b/blivet/devicelibs/mdraid.py
@@ -57,6 +57,9 @@ class Container(object):
         raise MDRaidError("get_size is not defined for level container.")
     def get_raw_array_size(self, member_count, smallest_member_size):
         raise MDRaidError("get_raw_array_size is not defined for level container.")
+    def size(self, member_sizes, num_members=None, chunk_size=None, superblock_size_func=None):
+        return sum(member_sizes)
+
     def __str__(self):
         return self.name
 
diff --git a/blivet/devicelibs/raid.py b/blivet/devicelibs/raid.py
index e6018bb..36453cd 100644
--- a/blivet/devicelibs/raid.py
+++ b/blivet/devicelibs/raid.py
@@ -212,6 +212,45 @@ class RAIDLevel(object):
         """Helper function; not to be called directly."""
         raise NotImplementedError()
 
+    def size(self, member_sizes, num_members=None, chunk_size=None, superblock_size_func=None):
+        """Estimate the amount of data that can be stored on this array.
+
+           :param member_size: a list of the sizes of members of this array
+           :type member_size: list of :class:`~.size.Size`
+           :param int num_members: the number of members in the array
+           :param chunk_size: the smallest unit of size for
+           :type chunk_size: :class:`~.size.Size`
+           :param superblock_size_func: a function that estimates the
+              superblock size for this array
+           :type superblock_size_func: a function from :class:`~.size.Size` to
+              :class:`~.size.Size`
+           :returns: an estimate of the amount of data that can be stored on
+              this array
+           :rtype: :class:`~.size.Size`
+
+           Note that the number of members in the array may not be the same
+           as the length of member_sizes if the array is still
+           under construction.
+        """
+        if not member_sizes:
+            return 0
+
+        if num_members is None:
+            num_members = len(member_sizes)
+
+        if chunk_size is None or chunk_size == 0:
+            raise RaidError("chunk_size parameter value %s is not acceptable")
+
+        if superblock_size_func is None:
+            raise RaidError("superblock_size_func value of None is not acceptable")
+
+        min_size = min(member_sizes)
+        total_space = self.get_net_array_size(num_members, min_size)
+        superblock_size = superblock_size_func(total_space)
+        min_data_size = min_size - superblock_size
+        total_data_size = self.get_net_array_size(num_members, min_data_size)
+        return self._trim(total_data_size, chunk_size)
+
     def __str__(self):
         return self.name
 
diff --git a/tests/devicelibs_test/raid_test.py b/tests/devicelibs_test/raid_test.py
index 15b193e..34b5ba5 100644
--- a/tests/devicelibs_test/raid_test.py
+++ b/tests/devicelibs_test/raid_test.py
@@ -3,6 +3,7 @@ import unittest
 
 import blivet.devicelibs.raid as raid
 import blivet.errors as errors
+from blivet.size import Size
 
 class RaidTestCase(unittest.TestCase):
 
@@ -95,7 +96,38 @@ class RaidTestCase(unittest.TestCase):
 
         self.assertRaises(errors.RaidError, raid.RAID10.get_recommended_stride, 1)
 
-
+        ##
+        ## size
+        ##
+        for r in raid.RAIDLevels():
+            self.assertEqual(r.size([ Size(spec="32MiB"),
+                                      Size(spec="128MiB"),
+                                      Size(spec="128MiB"),
+                                      Size(spec="64MiB") ],
+               4,
+               Size(spec="1MiB"),
+               lambda x: Size(bytes=0)),
+               r.get_net_array_size(4, Size(spec="32MiB")))
+
+        for r in raid.RAIDLevels():
+            self.assertEqual(r.size([ Size(spec="32MiB"),
+                                      Size(spec="128MiB"),
+                                      Size(spec="128MiB"),
+                                      Size(spec="64MiB") ],
+               5,
+               Size(spec="1MiB"),
+               lambda x: Size(bytes=0)),
+               r.get_net_array_size(5, Size(spec="32MiB")))
+
+        for r in raid.RAIDLevels():
+            self.assertEqual(r.size([ Size(spec="32MiB"),
+                                      Size(spec="128MiB"),
+                                      Size(spec="128MiB"),
+                                      Size(spec="64MiB") ],
+               4,
+               Size(spec="1MiB"),
+               lambda x: Size(spec="32MiB")),
+               0)
         ##
         ## names
         ##
-- 
1.8.3.1



More information about the anaconda-patches mailing list