@@ -73,13 +73,14 @@ pub(super) fn parse_disk_from_request(
73
73
disk : & DiskRequest ,
74
74
) -> Result < ParsedStorageDevice , DeviceRequestError > {
75
75
let pci_path = slot_to_pci_path ( disk. slot , SlotType :: Disk ) ?;
76
+ let backend_name = format ! ( "{}-backend" , disk. name) ;
76
77
let device_spec = match disk. device . as_ref ( ) {
77
78
"virtio" => StorageDeviceV0 :: VirtioDisk ( VirtioDisk {
78
- backend_name : disk . name . to_string ( ) ,
79
+ backend_name : backend_name . clone ( ) ,
79
80
pci_path,
80
81
} ) ,
81
82
"nvme" => StorageDeviceV0 :: NvmeDisk ( NvmeDisk {
82
- backend_name : disk . name . to_string ( ) ,
83
+ backend_name : backend_name . clone ( ) ,
83
84
pci_path,
84
85
} ) ,
85
86
_ => {
@@ -91,7 +92,6 @@ pub(super) fn parse_disk_from_request(
91
92
} ;
92
93
93
94
let device_name = disk. name . clone ( ) ;
94
- let backend_name = format ! ( "{}-backend" , disk. name) ;
95
95
let backend_spec = StorageBackendV0 :: Crucible ( CrucibleStorageBackend {
96
96
request_json : serde_json:: to_string ( & disk. volume_construction_request )
97
97
. map_err ( |e| {
@@ -152,3 +152,59 @@ pub(super) fn parse_nic_from_request(
152
152
backend_spec,
153
153
} )
154
154
}
155
+
156
+ #[ cfg( test) ]
157
+ mod test {
158
+ use propolis_api_types:: VolumeConstructionRequest ;
159
+ use uuid:: Uuid ;
160
+
161
+ use super :: * ;
162
+
163
+ fn check_parsed_storage_device_backend_pointer (
164
+ parsed : & ParsedStorageDevice ,
165
+ ) {
166
+ let device_to_backend = match & parsed. device_spec {
167
+ StorageDeviceV0 :: VirtioDisk ( d) => d. backend_name . clone ( ) ,
168
+ StorageDeviceV0 :: NvmeDisk ( d) => d. backend_name . clone ( ) ,
169
+ } ;
170
+
171
+ assert_eq ! ( device_to_backend, parsed. backend_name) ;
172
+ }
173
+
174
+ #[ test]
175
+ fn parsed_disk_devices_point_to_backends ( ) {
176
+ let vcr = VolumeConstructionRequest :: File {
177
+ id : Uuid :: nil ( ) ,
178
+ block_size : 512 ,
179
+ path : "" . to_string ( ) ,
180
+ } ;
181
+
182
+ let req = DiskRequest {
183
+ name : "my-disk" . to_string ( ) ,
184
+ slot : Slot ( 0 ) ,
185
+ read_only : false ,
186
+ device : "nvme" . to_string ( ) ,
187
+ volume_construction_request : vcr,
188
+ } ;
189
+
190
+ let parsed = parse_disk_from_request ( & req) . unwrap ( ) ;
191
+ check_parsed_storage_device_backend_pointer ( & parsed) ;
192
+ }
193
+
194
+ #[ test]
195
+ fn parsed_network_devices_point_to_backends ( ) {
196
+ let req =
197
+ NetworkInterfaceRequest { name : "vnic" . to_string ( ) , slot : Slot ( 0 ) } ;
198
+
199
+ let parsed = parse_nic_from_request ( & req) . unwrap ( ) ;
200
+ let NetworkDeviceV0 :: VirtioNic ( nic) = & parsed. device_spec ;
201
+ assert_eq ! ( nic. backend_name, parsed. backend_name) ;
202
+ }
203
+
204
+ #[ test]
205
+ fn parsed_cloud_init_devices_point_to_backends ( ) {
206
+ let base64 = "AAAAAAAAAAAAAAAAAAAAAAAAAAA" . to_string ( ) ;
207
+ let parsed = parse_cloud_init_from_request ( base64) . unwrap ( ) ;
208
+ check_parsed_storage_device_backend_pointer ( & parsed) ;
209
+ }
210
+ }
0 commit comments