]> git.proxmox.com Git - proxmox-backup.git/blob - src/bin/proxmox_backup_client/benchmark.rs
proxmox-backup-client: add benchmark command
[proxmox-backup.git] / src / bin / proxmox_backup_client / benchmark.rs
1 use std::path::PathBuf;
2 use std::sync::Arc;
3
4 use anyhow::{Error};
5 use serde_json::Value;
6 use chrono::{TimeZone, Utc};
7
8 use proxmox::api::{ApiMethod, RpcEnvironment};
9 use proxmox::api::api;
10
11 use proxmox_backup::backup::{
12 load_and_decrypt_key,
13 CryptConfig,
14
15 };
16
17 use proxmox_backup::client::*;
18
19 use crate::{
20 KEYFILE_SCHEMA, REPO_URL_SCHEMA,
21 extract_repository_from_value,
22 get_encryption_key_password,
23 record_repository,
24 connect,
25 };
26
27 #[api(
28 input: {
29 properties: {
30 repository: {
31 schema: REPO_URL_SCHEMA,
32 optional: true,
33 },
34 keyfile: {
35 schema: KEYFILE_SCHEMA,
36 optional: true,
37 },
38 }
39 }
40 )]
41 /// Run benchmark tests
42 pub async fn benchmark(
43 param: Value,
44 _info: &ApiMethod,
45 _rpcenv: &mut dyn RpcEnvironment,
46 ) -> Result<(), Error> {
47
48 let repo = extract_repository_from_value(&param)?;
49
50 let keyfile = param["keyfile"].as_str().map(PathBuf::from);
51
52 let crypt_config = match keyfile {
53 None => None,
54 Some(path) => {
55 let (key, _) = load_and_decrypt_key(&path, &get_encryption_key_password)?;
56 let crypt_config = CryptConfig::new(key)?;
57 Some(Arc::new(crypt_config))
58 }
59 };
60
61 let backup_time = Utc.timestamp(Utc::now().timestamp(), 0);
62
63 let client = connect(repo.host(), repo.user())?;
64 record_repository(&repo);
65
66 let client = BackupWriter::start(
67 client,
68 crypt_config.clone(),
69 repo.store(),
70 "host",
71 "benshmark",
72 backup_time,
73 false,
74 ).await?;
75
76 println!("Start upload speed test");
77 let speed = client.upload_speedtest().await?;
78
79 println!("Upload speed: {} MiB/s", speed);
80
81 Ok(())
82 }