cli: use new alias feature for "snapshots"
Now maps to "snapshot list".
This commit is contained in:
		| @ -48,7 +48,7 @@ percent-encoding = "2.1" | |||||||
| pin-utils = "0.1.0" | pin-utils = "0.1.0" | ||||||
| pin-project = "0.4" | pin-project = "0.4" | ||||||
| pathpatterns = "0.1.2" | pathpatterns = "0.1.2" | ||||||
| proxmox = { version = "0.7.1", features = [ "sortable-macro", "api-macro", "websocket" ] } | proxmox = { version = "0.7.2", features = [ "sortable-macro", "api-macro", "websocket" ] } | ||||||
| #proxmox = { git = "git://git.proxmox.com/git/proxmox", version = "0.1.2", features = [ "sortable-macro", "api-macro" ] } | #proxmox = { git = "git://git.proxmox.com/git/proxmox", version = "0.1.2", features = [ "sortable-macro", "api-macro" ] } | ||||||
| #proxmox = { path = "../proxmox/proxmox", features = [ "sortable-macro", "api-macro", "websocket" ] } | #proxmox = { path = "../proxmox/proxmox", features = [ "sortable-macro", "api-macro", "websocket" ] } | ||||||
| proxmox-fuse = "0.1.0" | proxmox-fuse = "0.1.0" | ||||||
|  | |||||||
| @ -456,75 +456,6 @@ async fn change_backup_owner(group: String, mut param: Value) -> Result<(), Erro | |||||||
|     Ok(()) |     Ok(()) | ||||||
| } | } | ||||||
|  |  | ||||||
| #[api( |  | ||||||
|    input: { |  | ||||||
|         properties: { |  | ||||||
|             repository: { |  | ||||||
|                 schema: REPO_URL_SCHEMA, |  | ||||||
|                 optional: true, |  | ||||||
|             }, |  | ||||||
|             group: { |  | ||||||
|                 type: String, |  | ||||||
|                 description: "Backup group.", |  | ||||||
|                 optional: true, |  | ||||||
|             }, |  | ||||||
|             "output-format": { |  | ||||||
|                 schema: OUTPUT_FORMAT, |  | ||||||
|                 optional: true, |  | ||||||
|             }, |  | ||||||
|         } |  | ||||||
|    } |  | ||||||
| )] |  | ||||||
| /// List backup snapshots. |  | ||||||
| async fn list_snapshots(param: Value) -> Result<Value, Error> { |  | ||||||
|  |  | ||||||
|     let repo = extract_repository_from_value(¶m)?; |  | ||||||
|  |  | ||||||
|     let output_format = get_output_format(¶m); |  | ||||||
|  |  | ||||||
|     let client = connect(&repo)?; |  | ||||||
|  |  | ||||||
|     let group: Option<BackupGroup> = if let Some(path) = param["group"].as_str() { |  | ||||||
|         Some(path.parse()?) |  | ||||||
|     } else { |  | ||||||
|         None |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     let mut data = api_datastore_list_snapshots(&client, repo.store(), group).await?; |  | ||||||
|  |  | ||||||
|     record_repository(&repo); |  | ||||||
|  |  | ||||||
|     let render_snapshot_path = |_v: &Value, record: &Value| -> Result<String, Error> { |  | ||||||
|         let item: SnapshotListItem = serde_json::from_value(record.to_owned())?; |  | ||||||
|         let snapshot = BackupDir::new(item.backup_type, item.backup_id, item.backup_time)?; |  | ||||||
|         Ok(snapshot.relative_path().to_str().unwrap().to_owned()) |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     let render_files = |_v: &Value, record: &Value| -> Result<String, Error> { |  | ||||||
|         let item: SnapshotListItem = serde_json::from_value(record.to_owned())?; |  | ||||||
|         let mut filenames = Vec::new(); |  | ||||||
|         for file in &item.files { |  | ||||||
|             filenames.push(file.filename.to_string()); |  | ||||||
|         } |  | ||||||
|         Ok(tools::format::render_backup_file_list(&filenames[..])) |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     let options = default_table_format_options() |  | ||||||
|         .sortby("backup-type", false) |  | ||||||
|         .sortby("backup-id", false) |  | ||||||
|         .sortby("backup-time", false) |  | ||||||
|         .column(ColumnConfig::new("backup-id").renderer(render_snapshot_path).header("snapshot")) |  | ||||||
|         .column(ColumnConfig::new("size").renderer(tools::format::render_bytes_human_readable)) |  | ||||||
|         .column(ColumnConfig::new("files").renderer(render_files)) |  | ||||||
|         ; |  | ||||||
|  |  | ||||||
|     let info = &proxmox_backup::api2::admin::datastore::API_RETURN_SCHEMA_LIST_SNAPSHOTS; |  | ||||||
|  |  | ||||||
|     format_and_print_result_full(&mut data, info, &output_format, &options); |  | ||||||
|  |  | ||||||
|     Ok(Value::Null) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #[api( | #[api( | ||||||
|    input: { |    input: { | ||||||
|         properties: { |         properties: { | ||||||
| @ -2051,11 +1982,6 @@ fn main() { | |||||||
|     let list_cmd_def = CliCommand::new(&API_METHOD_LIST_BACKUP_GROUPS) |     let list_cmd_def = CliCommand::new(&API_METHOD_LIST_BACKUP_GROUPS) | ||||||
|         .completion_cb("repository", complete_repository); |         .completion_cb("repository", complete_repository); | ||||||
|  |  | ||||||
|     let snapshots_cmd_def = CliCommand::new(&API_METHOD_LIST_SNAPSHOTS) |  | ||||||
|         .arg_param(&["group"]) |  | ||||||
|         .completion_cb("group", complete_backup_group) |  | ||||||
|         .completion_cb("repository", complete_repository); |  | ||||||
|  |  | ||||||
|     let forget_cmd_def = CliCommand::new(&API_METHOD_FORGET_SNAPSHOTS) |     let forget_cmd_def = CliCommand::new(&API_METHOD_FORGET_SNAPSHOTS) | ||||||
|         .arg_param(&["snapshot"]) |         .arg_param(&["snapshot"]) | ||||||
|         .completion_cb("repository", complete_repository) |         .completion_cb("repository", complete_repository) | ||||||
| @ -2109,7 +2035,6 @@ fn main() { | |||||||
|         .insert("logout", logout_cmd_def) |         .insert("logout", logout_cmd_def) | ||||||
|         .insert("prune", prune_cmd_def) |         .insert("prune", prune_cmd_def) | ||||||
|         .insert("restore", restore_cmd_def) |         .insert("restore", restore_cmd_def) | ||||||
|         .insert("snapshots", snapshots_cmd_def) |  | ||||||
|         .insert("snapshot", snapshot_mgtm_cli()) |         .insert("snapshot", snapshot_mgtm_cli()) | ||||||
|         .insert("files", files_cmd_def) |         .insert("files", files_cmd_def) | ||||||
|         .insert("status", status_cmd_def) |         .insert("status", status_cmd_def) | ||||||
| @ -2121,7 +2046,10 @@ fn main() { | |||||||
|         .insert("task", task_mgmt_cli()) |         .insert("task", task_mgmt_cli()) | ||||||
|         .insert("version", version_cmd_def) |         .insert("version", version_cmd_def) | ||||||
|         .insert("benchmark", benchmark_cmd_def) |         .insert("benchmark", benchmark_cmd_def) | ||||||
|         .insert("change-owner", change_owner_cmd_def); |         .insert("change-owner", change_owner_cmd_def) | ||||||
|  |  | ||||||
|  |         .alias(&["snapshots"], &["snapshot", "list"]) | ||||||
|  |         ; | ||||||
|  |  | ||||||
|     let rpcenv = CliEnvironment::new(); |     let rpcenv = CliEnvironment::new(); | ||||||
|     run_cli_command(cmd_def, rpcenv, Some(|future| { |     run_cli_command(cmd_def, rpcenv, Some(|future| { | ||||||
|  | |||||||
| @ -2,12 +2,95 @@ use anyhow::Error; | |||||||
| use serde_json::{json, Value}; | use serde_json::{json, Value}; | ||||||
|  |  | ||||||
| use proxmox::api::{api, cli::*}; | use proxmox::api::{api, cli::*}; | ||||||
| use proxmox_backup::tools; | use proxmox_backup::{ | ||||||
|  |     tools, | ||||||
|  |     api2::types::*, | ||||||
|  |     backup::{ | ||||||
|  |         BackupGroup, | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  |  | ||||||
| use crate::{ | use crate::{ | ||||||
|     complete_backup_snapshot, connect, extract_repository_from_value, BackupDir, REPO_URL_SCHEMA, |     REPO_URL_SCHEMA, | ||||||
|  |     BackupDir, | ||||||
|  |     api_datastore_list_snapshots, | ||||||
|  |     complete_backup_snapshot, | ||||||
|  |     complete_backup_group, | ||||||
|  |     complete_repository, | ||||||
|  |     connect, | ||||||
|  |     extract_repository_from_value, | ||||||
|  |     record_repository, | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | #[api( | ||||||
|  |    input: { | ||||||
|  |         properties: { | ||||||
|  |             repository: { | ||||||
|  |                 schema: REPO_URL_SCHEMA, | ||||||
|  |                 optional: true, | ||||||
|  |             }, | ||||||
|  |             group: { | ||||||
|  |                 type: String, | ||||||
|  |                 description: "Backup group.", | ||||||
|  |                 optional: true, | ||||||
|  |             }, | ||||||
|  |             "output-format": { | ||||||
|  |                 schema: OUTPUT_FORMAT, | ||||||
|  |                 optional: true, | ||||||
|  |             }, | ||||||
|  |         } | ||||||
|  |    } | ||||||
|  | )] | ||||||
|  | /// List backup snapshots. | ||||||
|  | async fn list_snapshots(param: Value) -> Result<Value, Error> { | ||||||
|  |  | ||||||
|  |     let repo = extract_repository_from_value(¶m)?; | ||||||
|  |  | ||||||
|  |     let output_format = get_output_format(¶m); | ||||||
|  |  | ||||||
|  |     let client = connect(&repo)?; | ||||||
|  |  | ||||||
|  |     let group: Option<BackupGroup> = if let Some(path) = param["group"].as_str() { | ||||||
|  |         Some(path.parse()?) | ||||||
|  |     } else { | ||||||
|  |         None | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     let mut data = api_datastore_list_snapshots(&client, repo.store(), group).await?; | ||||||
|  |  | ||||||
|  |     record_repository(&repo); | ||||||
|  |  | ||||||
|  |     let render_snapshot_path = |_v: &Value, record: &Value| -> Result<String, Error> { | ||||||
|  |         let item: SnapshotListItem = serde_json::from_value(record.to_owned())?; | ||||||
|  |         let snapshot = BackupDir::new(item.backup_type, item.backup_id, item.backup_time)?; | ||||||
|  |         Ok(snapshot.relative_path().to_str().unwrap().to_owned()) | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     let render_files = |_v: &Value, record: &Value| -> Result<String, Error> { | ||||||
|  |         let item: SnapshotListItem = serde_json::from_value(record.to_owned())?; | ||||||
|  |         let mut filenames = Vec::new(); | ||||||
|  |         for file in &item.files { | ||||||
|  |             filenames.push(file.filename.to_string()); | ||||||
|  |         } | ||||||
|  |         Ok(tools::format::render_backup_file_list(&filenames[..])) | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     let options = default_table_format_options() | ||||||
|  |         .sortby("backup-type", false) | ||||||
|  |         .sortby("backup-id", false) | ||||||
|  |         .sortby("backup-time", false) | ||||||
|  |         .column(ColumnConfig::new("backup-id").renderer(render_snapshot_path).header("snapshot")) | ||||||
|  |         .column(ColumnConfig::new("size").renderer(tools::format::render_bytes_human_readable)) | ||||||
|  |         .column(ColumnConfig::new("files").renderer(render_files)) | ||||||
|  |         ; | ||||||
|  |  | ||||||
|  |     let info = &proxmox_backup::api2::admin::datastore::API_RETURN_SCHEMA_LIST_SNAPSHOTS; | ||||||
|  |  | ||||||
|  |     format_and_print_result_full(&mut data, info, &output_format, &options); | ||||||
|  |  | ||||||
|  |     Ok(Value::Null) | ||||||
|  | } | ||||||
|  |  | ||||||
| #[api( | #[api( | ||||||
|     input: { |     input: { | ||||||
|         properties: { |         properties: { | ||||||
| @ -122,5 +205,12 @@ fn notes_cli() -> CliCommandMap { | |||||||
| } | } | ||||||
|  |  | ||||||
| pub fn snapshot_mgtm_cli() -> CliCommandMap { | pub fn snapshot_mgtm_cli() -> CliCommandMap { | ||||||
|     CliCommandMap::new().insert("notes", notes_cli()) |     CliCommandMap::new() | ||||||
|  |         .insert("notes", notes_cli()) | ||||||
|  |         .insert( | ||||||
|  |             "list", CliCommand::new(&API_METHOD_LIST_SNAPSHOTS) | ||||||
|  |                 .arg_param(&["group"]) | ||||||
|  |                 .completion_cb("group", complete_backup_group) | ||||||
|  |                 .completion_cb("repository", complete_repository) | ||||||
|  |         ) | ||||||
| } | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user