firecracker_http_client/
vm.rs

1use async_trait::async_trait;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Serialize, Deserialize)]
5pub struct VmConfig {
6    #[serde(skip_serializing_if = "Option::is_none")]
7    pub vcpu_count: Option<i32>,
8    #[serde(skip_serializing_if = "Option::is_none")]
9    pub mem_size_mib: Option<i32>,
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub ht_enabled: Option<bool>,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub track_dirty_pages: Option<bool>,
14}
15
16#[derive(Debug, Serialize, Deserialize)]
17pub struct VmInfo {
18    pub state: String,
19    pub id: String,
20}
21
22#[async_trait]
23pub trait VmOperations {
24    async fn get_vm_info(&self) -> Result<VmInfo, crate::FirecrackerError>;
25    async fn put_vm_config(&self, config: &VmConfig) -> Result<(), crate::FirecrackerError>;
26}
27
28#[async_trait]
29impl VmOperations for crate::FirecrackerClient {
30    async fn get_vm_info(&self) -> Result<VmInfo, crate::FirecrackerError> {
31        let url = self.url("vm")?;
32        let response = self.client.get(url).send().await?;
33
34        if !response.status().is_success() {
35            return Err(crate::FirecrackerError::Api {
36                status_code: response.status().as_u16(),
37                message: response.text().await?,
38            });
39        }
40
41        Ok(response.json().await?)
42    }
43
44    async fn put_vm_config(&self, config: &VmConfig) -> Result<(), crate::FirecrackerError> {
45        let url = self.url("vm/config")?;
46        let response = self.client.put(url).json(config).send().await?;
47
48        if !response.status().is_success() {
49            return Err(crate::FirecrackerError::Api {
50                status_code: response.status().as_u16(),
51                message: response.text().await?,
52            });
53        }
54
55        Ok(())
56    }
57}