Skip to content

Commit 31feeca

Browse files
authored
server: populate disk backend names correctly (#751)
1 parent 88fbde7 commit 31feeca

File tree

1 file changed

+59
-3
lines changed

1 file changed

+59
-3
lines changed

bin/propolis-server/src/lib/spec/api_request.rs

+59-3
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,14 @@ pub(super) fn parse_disk_from_request(
7373
disk: &DiskRequest,
7474
) -> Result<ParsedStorageDevice, DeviceRequestError> {
7575
let pci_path = slot_to_pci_path(disk.slot, SlotType::Disk)?;
76+
let backend_name = format!("{}-backend", disk.name);
7677
let device_spec = match disk.device.as_ref() {
7778
"virtio" => StorageDeviceV0::VirtioDisk(VirtioDisk {
78-
backend_name: disk.name.to_string(),
79+
backend_name: backend_name.clone(),
7980
pci_path,
8081
}),
8182
"nvme" => StorageDeviceV0::NvmeDisk(NvmeDisk {
82-
backend_name: disk.name.to_string(),
83+
backend_name: backend_name.clone(),
8384
pci_path,
8485
}),
8586
_ => {
@@ -91,7 +92,6 @@ pub(super) fn parse_disk_from_request(
9192
};
9293

9394
let device_name = disk.name.clone();
94-
let backend_name = format!("{}-backend", disk.name);
9595
let backend_spec = StorageBackendV0::Crucible(CrucibleStorageBackend {
9696
request_json: serde_json::to_string(&disk.volume_construction_request)
9797
.map_err(|e| {
@@ -152,3 +152,59 @@ pub(super) fn parse_nic_from_request(
152152
backend_spec,
153153
})
154154
}
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

Comments
 (0)