vmgs_broker/
resolver.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Resource resolver for VMGS files.
5
6use crate::VmgsClient;
7use crate::non_volatile_store::EncryptionNotSupported;
8use crate::non_volatile_store::VmgsNonVolatileStore;
9use vm_resource::AsyncResolveResource;
10use vm_resource::CanResolveTo;
11use vm_resource::IntoResource;
12use vm_resource::PlatformResource;
13use vm_resource::ResolveResource;
14use vm_resource::ResourceKind;
15use vm_resource::ResourceResolver;
16use vm_resource::declare_static_async_resolver;
17use vm_resource::kind::NonVolatileStoreKind;
18use vmcore::non_volatile_store::resources::ResolvedNonVolatileStore;
19use vmgs_resources::VmgsFileHandle;
20
21/// A resource resolver for VMGS files.
22pub struct VmgsFileResolver;
23
24declare_static_async_resolver! {
25    VmgsFileResolver,
26    (NonVolatileStoreKind, VmgsFileHandle),
27}
28
29/// Errors that can occur while resolving a VMGS file.
30#[derive(Debug, thiserror::Error)]
31pub enum VmgsFileResolverError {
32    /// Error creating the VMGS non-volatile store.
33    #[error("error creating VMGS non-volatile store")]
34    Store(#[source] EncryptionNotSupported),
35    /// Error resolving the underlying non-volatile store.
36    #[error("error resolving VMGS client")]
37    Client(#[source] vm_resource::ResolveError),
38}
39
40#[async_trait::async_trait]
41impl AsyncResolveResource<NonVolatileStoreKind, VmgsFileHandle> for VmgsFileResolver {
42    type Output = ResolvedNonVolatileStore;
43    type Error = VmgsFileResolverError;
44
45    async fn resolve(
46        &self,
47        resolver: &ResourceResolver,
48        resource: VmgsFileHandle,
49        _: &(),
50    ) -> Result<Self::Output, Self::Error> {
51        Ok(VmgsNonVolatileStore::new(
52            resolver
53                .resolve::<VmgsClientKind, _>(PlatformResource.into_resource(), ())
54                .await
55                .map_err(VmgsFileResolverError::Client)?,
56            vmgs_format::FileId(resource.file_id),
57            resource.encrypted,
58        )
59        .map_err(VmgsFileResolverError::Store)?
60        .into())
61    }
62}
63
64/// A resource kind for getting a [`VmgsClient`].
65///
66/// This is primarily used with [`PlatformResource`].
67pub enum VmgsClientKind {}
68
69impl ResourceKind for VmgsClientKind {
70    const NAME: &'static str = "vmgs_client";
71}
72
73impl CanResolveTo<VmgsClient> for VmgsClientKind {
74    type Input<'a> = ();
75}
76
77impl ResolveResource<VmgsClientKind, PlatformResource> for VmgsClient {
78    type Output = VmgsClient;
79    type Error = std::convert::Infallible;
80
81    fn resolve(
82        &self,
83        PlatformResource: PlatformResource,
84        (): (),
85    ) -> Result<Self::Output, Self::Error> {
86        Ok(self.clone())
87    }
88}