Skip to content

Commit c572c15

Browse files
committed
fix: Show better error when trying to create RAID w/o enough disks
Resolves: RHEL-95757
1 parent 5d4dd2e commit c572c15

2 files changed

Lines changed: 43 additions & 1 deletion

File tree

library/blivet.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,7 @@
389389
from blivet3 import devices
390390
from blivet3.deviceaction import ActionConfigureFormat, ActionResizeFormat, ActionAddMember, ActionRemoveMember
391391
from blivet3.devicefactory import DEFAULT_THPOOL_RESERVE
392+
from blivet3.errors import RaidError
392393
from blivet3.flags import flags as blivet_flags
393394
from blivet3.formats import fslib, get_format
394395
from blivet3.partitioning import do_partitioning
@@ -405,6 +406,7 @@
405406
from blivet import devices
406407
from blivet.deviceaction import ActionConfigureFormat, ActionResizeFormat, ActionAddMember, ActionRemoveMember
407408
from blivet.devicefactory import DEFAULT_THPOOL_RESERVE
409+
from blivet.errors import RaidError
408410
from blivet.flags import flags as blivet_flags
409411
from blivet.formats import fslib, get_format
410412
from blivet.partitioning import do_partitioning
@@ -538,6 +540,17 @@ def _new_mdarray(self, members, raid_name=""):
538540
if raid_name == "":
539541
raid_name = self._spec_dict["name"]
540542

543+
544+
raid_level = self._spec_dict["raid_level"]
545+
try:
546+
blivet_level = devicelibs.raid.get_raid_level(raid_level)
547+
except RaidError:
548+
raise BlivetAnsibleError("%s is not a valid RAID level" % raid_level)
549+
else:
550+
if len(members) < blivet_level.min_members:
551+
raise BlivetAnsibleError("not enough disks selected to create %s array, at least %d "
552+
"disks needed" % (raid_level, blivet_level.min_members))
553+
541554
# calculate and verify active and spare devices counts
542555
active_count = len(members)
543556
spare_count = 0
@@ -571,7 +584,7 @@ def _new_mdarray(self, members, raid_name=""):
571584

572585
try:
573586
raid_array = self._blivet.new_mdarray(name=raid_name,
574-
level=self._spec_dict["raid_level"],
587+
level=raid_level,
575588
member_devices=active_count,
576589
total_devices=len(members),
577590
parents=members,

tests/tests_fatals_raid_pool.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@
3737
- name: Try to create a raid pool with invalid raid_level (expect failure)
3838
include_tasks: verify-role-failed.yml
3939
vars:
40+
__storage_failed_regex: >-
41+
fail is not a valid RAID level
42+
__storage_failed_msg: >-
43+
Unexpected behavior w/ invalid RAID level
4044
__storage_failed_params:
4145
storage_pools:
4246
- name: vg1
@@ -54,3 +58,28 @@
5458
- name: lv3
5559
size: "{{ volume3_size }}"
5660
mount_point: "{{ mount_location3 }}"
61+
62+
- name: Try to create a raid pool without enough disks (expect failure)
63+
include_tasks: verify-role-failed.yml
64+
vars:
65+
__storage_failed_regex: >-
66+
not enough disks selected to create raid5 array, at least 3 disks needed
67+
__storage_failed_msg: >-
68+
Unexpected behavior w/ invalid number of disks
69+
__storage_failed_params:
70+
storage_pools:
71+
- name: vg1
72+
disks: "{{ unused_disks }}"
73+
type: lvm
74+
raid_level: raid5
75+
state: present
76+
volumes:
77+
- name: lv1
78+
size: "{{ volume1_size }}"
79+
mount_point: "{{ mount_location1 }}"
80+
- name: lv2
81+
size: "{{ volume2_size }}"
82+
mount_point: "{{ mount_location2 }}"
83+
- name: lv3
84+
size: "{{ volume3_size }}"
85+
mount_point: "{{ mount_location3 }}"

0 commit comments

Comments
 (0)