@@ -55,12 +55,15 @@ def parse_controller_details(client: Sushy) -> dict:
5555 """Parse available RAID controller details for execution."""
5656 result = {"controller" : None , "physical_disks" : []}
5757 system_objects = client .get_system_collection ().get_members ()
58- system = system_objects [ 0 ]
58+ system = system_objects . pop ()
5959 for c in system .storage .get_members ():
60- if "RAID" in c .identity :
60+ if "RAID" in c .identity . upper () :
6161 result ["controller" ] = c .identity
6262 for d in c .drives :
63- result ["physical_disks" ].append (d .identity )
63+ capacity = d .capacity_bytes / (10 ** 9 )
64+ result ["physical_disks" ].append (
65+ {"name" : d .identity , "size_gb" : f"{ capacity :.0f} " }
66+ )
6467 break
6568 return result
6669
@@ -75,19 +78,28 @@ def get_raid_type(disk_count: int) -> int:
7578
7679def build_raid_config (raid_config : dict ):
7780 """Return a raid config supported by ironic for cleanup tasks."""
78- raid_level = get_raid_type (len (raid_config ["physical_disks" ]))
79- result = {
80- "logical_disks" : [
81+ sizes = sorted ({int (d ["size_gb" ]) for d in raid_config ["physical_disks" ]})
82+ base_config = {"logical_disks" : []}
83+ for size in sizes :
84+ _root_vol = bool (size == sizes [0 ]) or bool (
85+ len (sizes ) == 1
86+ ) # First size or only size.
87+ disks = [
88+ d ["name" ]
89+ for d in raid_config ["physical_disks" ]
90+ if int (d ["size_gb" ]) == size
91+ ]
92+ raid_level = get_raid_type (len (disks ))
93+ base_config ["logical_disks" ].append (
8194 {
8295 "controller" : raid_config ["controller" ],
83- "is_root_volume" : True ,
84- "physical_disks" : raid_config [ "physical_disks" ] ,
96+ "is_root_volume" : _root_vol ,
97+ "physical_disks" : disks ,
8598 "raid_level" : str (raid_level ),
8699 "size_gb" : "MAX" ,
87100 }
88- ]
89- }
90- return result
101+ )
102+ return base_config
91103
92104
93105if __name__ == "__main__" :
0 commit comments