firecracker_http_client/
vm.rs1use 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}