disk_blob/
resolver.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Resolver implementation for [`BlobDisk`].
5
6use 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
18/// A resolver for blob disks.
19pub 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}