firecracker_http_client/
balloon.rs1use crate::models::{Balloon, BalloonStats};
2use crate::FirecrackerError;
3use async_trait::async_trait;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Serialize, Deserialize)]
7pub struct BalloonUpdate {
8 pub amount_mib: u32,
9}
10
11#[derive(Debug, Serialize, Deserialize)]
12pub struct BalloonStatsUpdate {
13 pub stats_polling_interval_s: u32,
14}
15
16#[async_trait]
17pub trait BalloonOperations {
18 async fn get_balloon_config(&self) -> Result<Balloon, FirecrackerError>;
19 async fn put_balloon_config(&self, config: &Balloon) -> Result<(), FirecrackerError>;
20 async fn patch_balloon_config(&self, update: &BalloonUpdate) -> Result<(), FirecrackerError>;
21 async fn get_balloon_stats(&self) -> Result<BalloonStats, FirecrackerError>;
22 async fn patch_balloon_stats(
23 &self,
24 update: &BalloonStatsUpdate,
25 ) -> Result<(), FirecrackerError>;
26}
27
28#[async_trait]
29impl BalloonOperations for crate::FirecrackerClient {
30 async fn get_balloon_config(&self) -> Result<Balloon, FirecrackerError> {
31 let url = self.url("balloon")?;
32 let response = self.client.get(url).send().await?;
33
34 if !response.status().is_success() {
35 return Err(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_balloon_config(&self, config: &Balloon) -> Result<(), FirecrackerError> {
45 let url = self.url("balloon")?;
46 let response = self.client.put(url).json(config).send().await?;
47
48 if !response.status().is_success() {
49 return Err(FirecrackerError::Api {
50 status_code: response.status().as_u16(),
51 message: response.text().await?,
52 });
53 }
54
55 Ok(())
56 }
57
58 async fn patch_balloon_config(&self, update: &BalloonUpdate) -> Result<(), FirecrackerError> {
59 let url = self.url("balloon")?;
60 let response = self.client.patch(url).json(update).send().await?;
61
62 if !response.status().is_success() {
63 return Err(FirecrackerError::Api {
64 status_code: response.status().as_u16(),
65 message: response.text().await?,
66 });
67 }
68
69 Ok(())
70 }
71
72 async fn get_balloon_stats(&self) -> Result<BalloonStats, FirecrackerError> {
73 let url = self.url("balloon/statistics")?;
74 let response = self.client.get(url).send().await?;
75
76 if !response.status().is_success() {
77 return Err(FirecrackerError::Api {
78 status_code: response.status().as_u16(),
79 message: response.text().await?,
80 });
81 }
82
83 Ok(response.json().await?)
84 }
85
86 async fn patch_balloon_stats(
87 &self,
88 update: &BalloonStatsUpdate,
89 ) -> Result<(), FirecrackerError> {
90 let url = self.url("balloon/statistics")?;
91 let response = self.client.patch(url).json(update).send().await?;
92
93 if !response.status().is_success() {
94 return Err(FirecrackerError::Api {
95 status_code: response.status().as_u16(),
96 message: response.text().await?,
97 });
98 }
99
100 Ok(())
101 }
102}