module

Beryl::CLI::RaidController

Pilotage d'un contrôleur RAID MATÉRIEL (MegaRAID, via storcli) DANS LE RESCUE, avant bootstrap. Le rescue OVH ne fournit aucun outil contrôleur → on récupère storcli depuis storcli_url (cf. acme/infra-bin), puis on liste / détruit / reconfigure les volumes.

DESTRUCTIF, mais en rescue (avant install) → 100 % rejouable. Après une reconfiguration, on demande à l'opérateur de REBOOTER le rescue : les disques se ré-énumèrent proprement, et un nouveau beryl scan voit le résultat (JBOD = N disques bruts, ou le nouveau volume).

Les helpers de parsing / construction de commandes sont PURS (testables) ; l'orchestration prend une SSH::Connection (le rescue).

Constants

STORCLI = "/tmp/storcli64"

Class methods

controller_count(output : String) : Int32

Nombre de contrôleurs d'après storcli show ctrlcount (« Controller Count = N »).

Source
controller_id(conn : SSH::Connection) : Int32 | Nil

Id du 1er contrôleur (on gère le cas mono-contrôleur, le commun) ; nil si storcli n'en voit aucun.

Source
create_vd_command(cid : Int32, raid_num : Int32, slots : Array(String)) : String
Source
drive_slots(conn : SSH::Connection, cid : Int32) : Array(String)

Slots des disques physiques vus par le CONTRÔLEUR (storcli), quel que soit ce que l'OS présente (volume = 1 disque OS, JBOD = N, « good » = 0). → permet de valider le niveau RAID sur le VRAI nombre de disques.

Source
fetch(conn : SSH::Connection, url : String) : Bool

Télécharge storcli dans le rescue et vérifie qu'il s'exécute.

Source
parse_drive_slots(output : String) : Array(String)

Slots des disques physiques d'après storcli /cX/eall/sall show : la 1re colonne « EID:Slt » (ex. « 252:0 ») de chaque ligne disque.

Source
parse_lspci_has_raid(output : String) : Bool

Vrai si un contrôleur RAID matériel est présent sur le bus PCI — MÊME en JBOD (la carte reste un « RAID bus controller » côté lspci). Permet de proposer la (re)configuration même quand l'OS voit déjà des disques bruts (ex. carte déjà basculée en JBOD → on peut vouloir recréer un VD).

Source
present?(conn : SSH::Connection) : Bool
Source
raid_type(num : Int32) : String

Traduit un niveau RAID numérique beryl en type storcli. Refuse les niveaux non gérés par une carte matérielle (ex. 7 = raidz3, ZFS only).

Source
recreate_on!(conn : SSH::Connection, cid : Int32, slots : Array(String), raid_num : Int32) : Nil

Recrée un volume matériel à raid_num sur les slots fournis (comptés en amont par drive_slots). Séquence robuste depuis N'IMPORTE QUEL état (JBOD, volume, ou « Unconfigured Good ») : delete VD → JBOD off → forcer « good » → add vd. Sans la remise en « good » : « resources already in use ».

Source
to_jbod!(conn : SSH::Connection, cid : Int32) : Nil

Bascule le contrôleur en JBOD (les disques physiques deviennent des disques bruts pour ZFS) : détruit les volumes puis active le JBOD.

Source
validate_drive_count!(raid_num : Int32, n : Int32) : Nil

Vérifie que le niveau RAID matériel est compatible avec le nombre de disques. Lève ArgumentError (message exploitable) sinon — ainsi le prompt re-demande AVANT toute opération destructive.

Source