1use crate::BlobDisk;
7use crate::blob::http::HttpBlob;
8use async_trait::async_trait;
9use disk_backend::resolve::ResolveDiskParameters;
10use disk_backend::resolve::ResolvedDisk;
11use disk_backend_resources::BlobDiskFormat;
12use disk_backend_resources::BlobDiskHandle;
13use vm_resource::AsyncResolveResource;
14use vm_resource::ResourceResolver;
15use vm_resource::declare_static_async_resolver;
16use vm_resource::kind::DiskHandleKind;
17
18pub struct BlobDiskResolver;
20
21declare_static_async_resolver!(BlobDiskResolver, (DiskHandleKind, BlobDiskHandle));
22
23#[async_trait]
24impl AsyncResolveResource<DiskHandleKind, BlobDiskHandle> for BlobDiskResolver {
25 type Output = ResolvedDisk;
26 type Error = anyhow::Error;
27
28 async fn resolve(
29 &self,
30 _resolver: &ResourceResolver,
31 rsrc: BlobDiskHandle,
32 params: ResolveDiskParameters<'_>,
33 ) -> Result<Self::Output, Self::Error> {
34 if !params.read_only {
35 anyhow::bail!("writable blob disks not supported");
36 }
37
38 let blob = HttpBlob::new(&rsrc.url).await?;
39 let disk = match rsrc.format {
40 BlobDiskFormat::Flat => BlobDisk::new(blob),
41 BlobDiskFormat::FixedVhd1 => BlobDisk::new_fixed_vhd1(blob).await?,
42 };
43
44 Ok(ResolvedDisk::new(disk)?)
45 }
46}