1#![forbid(unsafe_code)]
7
8use mesh::MeshPayload;
9use vm_resource::Resource;
10use vm_resource::ResourceId;
11use vm_resource::kind::DiskHandleKind;
12use vm_resource::kind::NonVolatileStoreKind;
13use vmgs_format::FileId;
14
15#[derive(MeshPayload)]
17pub struct VmgsFileHandle {
18 pub file_id: u32,
22 pub encrypted: bool,
24}
25
26impl VmgsFileHandle {
27 pub fn new(file_id: FileId, encrypted: bool) -> Self {
29 Self {
30 file_id: file_id.0,
31 encrypted,
32 }
33 }
34}
35
36impl ResourceId<NonVolatileStoreKind> for VmgsFileHandle {
37 const ID: &'static str = "vmgs";
38}
39
40#[derive(MeshPayload, Debug)]
42pub enum VmgsResource {
43 Disk(VmgsDisk),
45 ReprovisionOnFailure(VmgsDisk),
47 Reprovision(VmgsDisk),
49 Ephemeral,
51}
52
53impl VmgsResource {
54 pub fn encryption_policy(&self) -> GuestStateEncryptionPolicy {
56 match self {
57 VmgsResource::Disk(vmgs)
58 | VmgsResource::ReprovisionOnFailure(vmgs)
59 | VmgsResource::Reprovision(vmgs) => vmgs.encryption_policy,
60 VmgsResource::Ephemeral => GuestStateEncryptionPolicy::None(true),
61 }
62 }
63}
64
65#[derive(MeshPayload, Debug)]
67pub struct VmgsDisk {
68 pub disk: Resource<DiskHandleKind>,
70 pub encryption_policy: GuestStateEncryptionPolicy,
72}
73
74#[derive(MeshPayload, Debug, Clone, Copy)]
78pub enum GuestStateEncryptionPolicy {
79 Auto,
81 None(bool),
83 GspById(bool),
85 GspKey(bool),
87}
88
89impl GuestStateEncryptionPolicy {
90 pub fn is_strict(&self) -> bool {
92 match self {
93 GuestStateEncryptionPolicy::Auto => false,
94 GuestStateEncryptionPolicy::None(strict)
95 | GuestStateEncryptionPolicy::GspById(strict)
96 | GuestStateEncryptionPolicy::GspKey(strict) => *strict,
97 }
98 }
99}