]> git.proxmox.com Git - proxmox-backup.git/blob - src/api2/admin/traffic_control.rs
update to proxmox-sys 0.2 crate
[proxmox-backup.git] / src / api2 / admin / traffic_control.rs
1 use anyhow::Error;
2 use serde::{Deserialize, Serialize};
3
4 use proxmox_router::{Router, RpcEnvironment, Permission};
5 use proxmox_schema::api;
6
7 use pbs_api_types::{
8 TrafficControlRule, PRIV_SYS_AUDIT,
9 };
10
11 use crate::TRAFFIC_CONTROL_CACHE;
12
13 #[api(
14 properties: {
15 config: {
16 type: TrafficControlRule,
17 },
18 },
19 )]
20 #[derive(Serialize, Deserialize)]
21 #[serde(rename_all="kebab-case")]
22 /// Traffic control rule config with current rates
23 pub struct TrafficControlCurrentRate {
24 #[serde(flatten)]
25 config: TrafficControlRule,
26 /// Current ingress rate in bytes/second
27 cur_rate_in: u64,
28 /// Current egress rate in bytes/second
29 cur_rate_out: u64,
30 }
31
32 #[api(
33 input: {
34 properties: {},
35 },
36 returns: {
37 description: "Show current traffic control rates.",
38 type: Array,
39 items: {
40 type: TrafficControlCurrentRate,
41 },
42 },
43 access: {
44 permission: &Permission::Privilege(&[], PRIV_SYS_AUDIT, false),
45 },
46 )]
47 /// Show current traffic for all traffic control rules.
48 pub fn show_current_traffic(
49 mut rpcenv: &mut dyn RpcEnvironment,
50 ) -> Result<Vec<TrafficControlCurrentRate>, Error> {
51
52 let (config, digest) = pbs_config::traffic_control::config()?;
53
54 let rules: Vec<TrafficControlRule> = config.convert_to_typed_array("rule")?;
55
56 let cache = TRAFFIC_CONTROL_CACHE.lock().unwrap();
57
58 let mut list = Vec::new();
59
60 for config in rules {
61 let (cur_rate_in, cur_rate_out) = match cache.current_rate_map().get(&config.name) {
62 None => (0, 0),
63 Some(state) => (state.rate_in, state.rate_out),
64 };
65 list.push(TrafficControlCurrentRate {config, cur_rate_in, cur_rate_out});
66 }
67
68 // also return the configuration digest
69 rpcenv["digest"] = hex::encode(&digest).into();
70
71 Ok(list)
72 }
73
74 pub const ROUTER: Router = Router::new()
75 .get(&API_METHOD_SHOW_CURRENT_TRAFFIC);