Skip to content

Commit c1574c4

Browse files
authored
Merge pull request #6 from stackhpc/raid-size
Calculate RAID size_mb parameter correctly
2 parents a5919e1 + ad9fd27 commit c1574c4

2 files changed

Lines changed: 102 additions & 1 deletion

File tree

library/drac.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,19 @@ def _determine_initial_state(self, goal_vdisks):
543543

544544
self.set_initial_state(changing, pending, conflicting)
545545

546+
@staticmethod
547+
def _compute_size_mb(goal_vdisk, min_size_mb):
548+
raid_level = str(goal_vdisk['raid_level'])
549+
if raid_level in ('6', '6+0'):
550+
parity_disks_per_span = 2
551+
elif raid_level in ('5', '5+0'):
552+
parity_disks_per_span = 1
553+
else:
554+
parity_disks_per_span = 0
555+
length = goal_vdisk['span_length'] - parity_disks_per_span
556+
effective_length = 1 if raid_level in ('1', '1+0') else length
557+
return min_size_mb * effective_length * goal_vdisk['span_depth']
558+
546559
def _determine_required_changes(self, goal_vdisks):
547560
"""Determine the changes required to apply the requested RAID config.
548561
@@ -588,10 +601,11 @@ def _determine_required_changes(self, goal_vdisks):
588601
create = False
589602

590603
if create:
604+
size_mb = self._compute_size_mb(goal_vdisk, min_size_mb)
591605
create_vdisk = {
592606
'physical_disks': goal_vdisk['pdisks'],
593607
'raid_level': goal_vdisk['raid_level'],
594-
'size_mb': min_size_mb * goal_vdisk['span_depth'],
608+
'size_mb': size_mb,
595609
'disk_name': goal_vdisk['name'],
596610
'span_length': goal_vdisk['span_length'],
597611
'span_depth': goal_vdisk['span_depth'],

tests/test_drac.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,6 +1015,93 @@ def fake_resource_attr(elem, uri, attr):
10151015
'span_length': 2, 'pending_operations': None,
10161016
'physical_disks': ['pdisk3', 'pdisk4']})
10171017

1018+
def test_compute_size_mb(self):
1019+
goal_vdisk0 = {
1020+
'name': 'vdisk0',
1021+
'raid_level': 0,
1022+
'span_length': 1,
1023+
'span_depth': 2,
1024+
'pdisks': [
1025+
'pdisk1', 'pdisk2',
1026+
],
1027+
}
1028+
self.assertEqual(
1029+
42 * 2, FakeRAIDConfig._compute_size_mb(goal_vdisk0, 42))
1030+
1031+
goal_vdisk1 = {
1032+
'name': 'vdisk1',
1033+
'raid_level': 1,
1034+
'span_length': 2,
1035+
'span_depth': 1,
1036+
'pdisks': [
1037+
'pdisk1', 'pdisk2',
1038+
],
1039+
}
1040+
self.assertEqual(
1041+
42, FakeRAIDConfig._compute_size_mb(goal_vdisk1, 42))
1042+
1043+
goal_vdisk5 = {
1044+
'name': 'vdisk5',
1045+
'raid_level': 5,
1046+
'span_length': 3,
1047+
'span_depth': 1,
1048+
'pdisks': [
1049+
'pdisk1', 'pdisk2', 'pdisk3',
1050+
],
1051+
}
1052+
self.assertEqual(
1053+
42 * 2, FakeRAIDConfig._compute_size_mb(goal_vdisk5, 42))
1054+
1055+
goal_vdisk6 = {
1056+
'name': 'vdisk6',
1057+
'raid_level': 6,
1058+
'span_length': 4,
1059+
'span_depth': 1,
1060+
'pdisks': [
1061+
'pdisk1', 'pdisk2', 'pdisk3', 'pdisk4',
1062+
],
1063+
}
1064+
self.assertEqual(
1065+
42 * 2, FakeRAIDConfig._compute_size_mb(goal_vdisk6, 42))
1066+
1067+
goal_vdisk10 = {
1068+
'name': 'vdisk10',
1069+
'raid_level': '1+0',
1070+
'span_length': 2,
1071+
'span_depth': 3,
1072+
'pdisks': [
1073+
'pdisk1', 'pdisk2', 'pdisk3', 'pdisk4', 'pdisk5', 'pdisk6',
1074+
],
1075+
}
1076+
self.assertEqual(
1077+
42 * 3, FakeRAIDConfig._compute_size_mb(goal_vdisk10, 42))
1078+
1079+
goal_vdisk50 = {
1080+
'name': 'vdisk50',
1081+
'raid_level': '5+0',
1082+
'span_length': 3,
1083+
'span_depth': 3,
1084+
'pdisks': [
1085+
'pdisk1', 'pdisk2', 'pdisk3', 'pdisk4', 'pdisk5', 'pdisk6',
1086+
'pdisk7', 'pdisk8', 'pdisk9',
1087+
],
1088+
}
1089+
self.assertEqual(
1090+
42 * 2 * 3, FakeRAIDConfig._compute_size_mb(goal_vdisk50, 42))
1091+
1092+
goal_vdisk60 = {
1093+
'name': 'vdisk60',
1094+
'raid_level': '6+0',
1095+
'span_length': 4,
1096+
'span_depth': 2,
1097+
'pdisks': [
1098+
'pdisk1', 'pdisk2', 'pdisk3', 'pdisk4', 'pdisk5', 'pdisk6',
1099+
'pdisk7', 'pdisk8',
1100+
],
1101+
}
1102+
self.assertEqual(
1103+
42 * 2 * 2, FakeRAIDConfig._compute_size_mb(goal_vdisk60, 42))
1104+
10181105

10191106
class FakeBIOSConfig(drac.BIOSConfig):
10201107
def __init__(self, state, changing_settings):

0 commit comments

Comments
 (0)