33// file, You can obtain one at https://mozilla.org/MPL/2.0/.
44
55use crate :: DiskFirmware ;
6+ use crate :: ExternalDisks ;
67use crate :: HardwareView ;
78use crate :: TofinoSnapshot ;
89use crate :: TofinoView ;
@@ -124,7 +125,10 @@ struct HardwareSnapshot {
124125
125126impl HardwareSnapshot {
126127 // Walk the device tree to capture a view of the current hardware.
127- fn new ( log : & Logger ) -> Result < Self , Error > {
128+ fn new (
129+ log : & Logger ,
130+ external_disks : & ExternalDisks ,
131+ ) -> Result < Self , Error > {
128132 let mut device_info =
129133 DevInfo :: new_force_load ( ) . map_err ( Error :: DevInfo ) ?;
130134
@@ -168,17 +172,27 @@ impl HardwareSnapshot {
168172
169173 // Monitor for block devices.
170174 let mut disks = HashMap :: new ( ) ;
171- let mut node_walker = device_info. walk_driver ( "blkdev" ) ;
172- while let Some ( node) =
173- node_walker. next ( ) . transpose ( ) . map_err ( Error :: DevInfo ) ?
174- {
175- poll_blkdev_node (
176- & log,
177- sled_type,
178- & mut disks,
179- node,
180- boot_storage_unit,
181- ) ?;
175+ match external_disks {
176+ ExternalDisks :: DetectPhysical => {
177+ let mut node_walker = device_info. walk_driver ( "blkdev" ) ;
178+ while let Some ( node) =
179+ node_walker. next ( ) . transpose ( ) . map_err ( Error :: DevInfo ) ?
180+ {
181+ poll_blkdev_node (
182+ & log,
183+ sled_type,
184+ & mut disks,
185+ node,
186+ boot_storage_unit,
187+ ) ?;
188+ }
189+ }
190+ ExternalDisks :: HardcodedPhysical { disks : hardcoded_disks } => {
191+ for disk in hardcoded_disks {
192+ disks. insert ( disk. identity ( ) . clone ( ) , disk. clone ( ) ) ;
193+ }
194+ }
195+ ExternalDisks :: Virtual { .. } => { }
182196 }
183197
184198 Ok ( Self { tofino, disks, baseboard } )
@@ -504,10 +518,10 @@ fn poll_blkdev_node(
504518fn poll_device_tree (
505519 log : & Logger ,
506520 hardware_view_tx : & watch:: Sender < HardwareView > ,
507- nonsled_observed_disks : & [ UnparsedDisk ] ,
521+ external_disks : & ExternalDisks ,
508522) -> Result < ( ) , Error > {
509523 // Construct a view of hardware by walking the device tree.
510- let polled_hw = match HardwareSnapshot :: new ( log) {
524+ let polled_hw = match HardwareSnapshot :: new ( log, external_disks ) {
511525 Ok ( polled_hw) => polled_hw,
512526
513527 Err ( e) => {
@@ -529,16 +543,19 @@ fn poll_device_tree(
529543
530544 // For platforms that don't support the HardwareSnapshot
531545 // functionality, sled-agent can be supplied a fixed list of
532- // UnparsedDisks. Add those to the HardwareSnapshot here if they
533- // are missing (which they will be for non-sleds).
534- for observed_disk in nonsled_observed_disks {
535- let identity = observed_disk. identity ( ) ;
536- if !inner. disks . contains_key ( identity) {
537- inner. disks . insert (
538- identity. clone ( ) ,
539- observed_disk. clone ( ) ,
540- ) ;
541- did_modify = true ;
546+ // UnparsedDisks. Add those to the HardwareSnapshot here if
547+ // they are missing (which they will be for non-sleds).
548+ if let ExternalDisks :: HardcodedPhysical { disks } =
549+ external_disks
550+ {
551+ for disk in disks {
552+ let identity = disk. identity ( ) ;
553+ if !inner. disks . contains_key ( identity) {
554+ inner
555+ . disks
556+ . insert ( identity. clone ( ) , disk. clone ( ) ) ;
557+ did_modify = true ;
558+ }
542559 }
543560 }
544561
@@ -747,11 +764,10 @@ fn parse_smbios_output(log: &Logger, output: String) -> Option<Baseboard> {
747764fn hardware_tracking_task (
748765 log : Logger ,
749766 hardware_view_tx : watch:: Sender < HardwareView > ,
750- nonsled_observed_disks : Vec < UnparsedDisk > ,
767+ external_disks : ExternalDisks ,
751768) {
752769 loop {
753- match poll_device_tree ( & log, & hardware_view_tx, & nonsled_observed_disks)
754- {
770+ match poll_device_tree ( & log, & hardware_view_tx, & external_disks) {
755771 // We've already warned about `NotAnOxideSled` by this point,
756772 // so let's not spam the logs.
757773 Ok ( _) | Err ( Error :: NotAnOxideSled ( _) ) => ( ) ,
@@ -785,7 +801,7 @@ impl HardwareManager {
785801 pub fn new (
786802 log : & Logger ,
787803 sled_mode : SledMode ,
788- nonsled_observed_disks : Vec < UnparsedDisk > ,
804+ external_disks : ExternalDisks ,
789805 ) -> Result < Self , String > {
790806 let log = log. new ( o ! ( "component" => "HardwareManager" ) ) ;
791807 info ! ( log, "Creating HardwareManager" ) ;
@@ -837,8 +853,7 @@ impl HardwareManager {
837853 // This mitigates issues where the Sled Agent could try to propagate
838854 // an "empty" view of hardware to other consumers before the first
839855 // query.
840- match poll_device_tree ( & log, & hardware_view_tx, & nonsled_observed_disks)
841- {
856+ match poll_device_tree ( & log, & hardware_view_tx, & external_disks) {
842857 Ok ( _) => ( ) ,
843858 // Allow non-sled devices to proceed with a "null" view of
844859 // hardware, otherwise they won't be able to start.
@@ -865,11 +880,7 @@ impl HardwareManager {
865880 } ) ;
866881
867882 std:: thread:: spawn ( move || {
868- hardware_tracking_task (
869- log,
870- hardware_view_tx,
871- nonsled_observed_disks,
872- ) ;
883+ hardware_tracking_task ( log, hardware_view_tx, external_disks) ;
873884 } ) ;
874885
875886 Ok ( Self { hardware_view_rx } )
0 commit comments