firecracker_http_client/
balloon.rs

1use 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}