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-project = "0.4"
 | 
			
		||||
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 = { path = "../proxmox/proxmox", features = [ "sortable-macro", "api-macro", "websocket" ] }
 | 
			
		||||
proxmox-fuse = "0.1.0"
 | 
			
		||||
 | 
			
		||||
@ -456,75 +456,6 @@ async fn change_backup_owner(group: String, mut param: Value) -> Result<(), Erro
 | 
			
		||||
    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(
 | 
			
		||||
   input: {
 | 
			
		||||
        properties: {
 | 
			
		||||
@ -2051,11 +1982,6 @@ fn main() {
 | 
			
		||||
    let list_cmd_def = CliCommand::new(&API_METHOD_LIST_BACKUP_GROUPS)
 | 
			
		||||
        .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)
 | 
			
		||||
        .arg_param(&["snapshot"])
 | 
			
		||||
        .completion_cb("repository", complete_repository)
 | 
			
		||||
@ -2109,7 +2035,6 @@ fn main() {
 | 
			
		||||
        .insert("logout", logout_cmd_def)
 | 
			
		||||
        .insert("prune", prune_cmd_def)
 | 
			
		||||
        .insert("restore", restore_cmd_def)
 | 
			
		||||
        .insert("snapshots", snapshots_cmd_def)
 | 
			
		||||
        .insert("snapshot", snapshot_mgtm_cli())
 | 
			
		||||
        .insert("files", files_cmd_def)
 | 
			
		||||
        .insert("status", status_cmd_def)
 | 
			
		||||
@ -2121,7 +2046,10 @@ fn main() {
 | 
			
		||||
        .insert("task", task_mgmt_cli())
 | 
			
		||||
        .insert("version", version_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();
 | 
			
		||||
    run_cli_command(cmd_def, rpcenv, Some(|future| {
 | 
			
		||||
 | 
			
		||||
@ -2,12 +2,95 @@ use anyhow::Error;
 | 
			
		||||
use serde_json::{json, Value};
 | 
			
		||||
 | 
			
		||||
use proxmox::api::{api, cli::*};
 | 
			
		||||
use proxmox_backup::tools;
 | 
			
		||||
use proxmox_backup::{
 | 
			
		||||
    tools,
 | 
			
		||||
    api2::types::*,
 | 
			
		||||
    backup::{
 | 
			
		||||
        BackupGroup,
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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(
 | 
			
		||||
    input: {
 | 
			
		||||
        properties: {
 | 
			
		||||
@ -122,5 +205,12 @@ fn notes_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