src/api2/types.rs: define and use new api type SnapshotListItem

This commit is contained in:
Dietmar Maurer 2020-01-07 12:52:15 +01:00
parent 70cd0e1b12
commit fc189b198c
2 changed files with 68 additions and 27 deletions

View File

@ -8,6 +8,7 @@ use hyper::{header, Body, Response, StatusCode};
use serde_json::{json, Value}; use serde_json::{json, Value};
use proxmox::{sortable, identity}; use proxmox::{sortable, identity};
use proxmox::api::api;
use proxmox::api::{http_err, list_subdirs_api_method}; use proxmox::api::{http_err, list_subdirs_api_method};
use proxmox::api::{ApiResponseFuture, ApiHandler, ApiMethod, Router, RpcEnvironment, RpcEnvironmentType}; use proxmox::api::{ApiResponseFuture, ApiHandler, ApiMethod, Router, RpcEnvironment, RpcEnvironmentType};
use proxmox::api::router::SubdirMap; use proxmox::api::router::SubdirMap;
@ -145,11 +146,36 @@ fn delete_snapshots (
Ok(Value::Null) Ok(Value::Null)
} }
#[api(
input: {
properties: {
store: {
schema: DATASTORE_SCHEMA,
},
"backup-type": {
optional: true,
schema: BACKUP_TYPE_SCHEMA,
},
"backup-id": {
optional: true,
schema: BACKUP_ID_SCHEMA,
},
},
},
returns: {
type: Array,
description: "Returns the list of snapshots.",
items: {
type: SnapshotListItem,
}
},
)]
/// List backup snapshots.
fn list_snapshots ( fn list_snapshots (
param: Value, param: Value,
_info: &ApiMethod, _info: &ApiMethod,
_rpcenv: &mut dyn RpcEnvironment, _rpcenv: &mut dyn RpcEnvironment,
) -> Result<Value, Error> { ) -> Result<Vec<SnapshotListItem>, Error> {
let store = tools::required_string_param(&param, "store")?; let store = tools::required_string_param(&param, "store")?;
let backup_type = param["backup-type"].as_str(); let backup_type = param["backup-type"].as_str();
@ -172,12 +198,13 @@ fn list_snapshots (
if backup_id != group.backup_id() { continue; } if backup_id != group.backup_id() { continue; }
} }
let mut result_item = json!({ let mut result_item = SnapshotListItem {
"backup-type": group.backup_type(), backup_type: group.backup_type().to_string(),
"backup-id": group.backup_id(), backup_id: group.backup_id().to_string(),
"backup-time": info.backup_dir.backup_time().timestamp(), backup_time: info.backup_dir.backup_time().timestamp(),
"files": info.files, files: info.files,
}); size: None,
};
if let Ok(index) = read_backup_index(&datastore, &info.backup_dir) { if let Ok(index) = read_backup_index(&datastore, &info.backup_dir) {
let mut backup_size = 0; let mut backup_size = 0;
@ -186,13 +213,13 @@ fn list_snapshots (
backup_size += item_size; backup_size += item_size;
} }
} }
result_item["size"] = backup_size.into(); result_item.size = Some(backup_size);
} }
snapshots.push(result_item); snapshots.push(result_item);
} }
Ok(json!(snapshots)) Ok(snapshots)
} }
#[sortable] #[sortable]
@ -643,19 +670,7 @@ const DATASTORE_INFO_SUBDIRS: SubdirMap = &[
( (
"snapshots", "snapshots",
&Router::new() &Router::new()
.get( .get(&API_METHOD_LIST_SNAPSHOTS)
&ApiMethod::new(
&ApiHandler::Sync(&list_snapshots),
&ObjectSchema::new(
"List backup groups.",
&sorted!([
("store", false, &DATASTORE_SCHEMA),
("backup-type", true, &BACKUP_TYPE_SCHEMA),
("backup-id", true, &BACKUP_ID_SCHEMA),
]),
)
)
)
.delete( .delete(
&ApiMethod::new( &ApiMethod::new(
&ApiHandler::Sync(&delete_snapshots), &ApiHandler::Sync(&delete_snapshots),

View File

@ -1,10 +1,7 @@
//use std::sync::Arc;
use failure::*; use failure::*;
//use lazy_static::lazy_static; use ::serde::{Deserialize, Serialize};
use proxmox::api::const_regex; use proxmox::api::{api, const_regex, schema::*};
use proxmox::api::schema::*;
use proxmox::tools::*; // required to use IPRE!() macro ??? use proxmox::tools::*; // required to use IPRE!() macro ???
// File names: may not contain slashes, may not start with "." // File names: may not contain slashes, may not start with "."
@ -118,3 +115,32 @@ pub const DATASTORE_SCHEMA: Schema = StringSchema::new("Datastore name.")
.format(&PROXMOX_SAFE_ID_FORMAT) .format(&PROXMOX_SAFE_ID_FORMAT)
.max_length(32) .max_length(32)
.schema(); .schema();
// Complex type definitions
#[api(
description: "Basic information about backup snapshot.",
properties: {
"backup-type": {
schema: BACKUP_TYPE_SCHEMA,
},
"backup-id": {
schema: BACKUP_ID_SCHEMA,
},
"backup-time": {
schema: BACKUP_TIME_SCHEMA,
},
},
)]
#[derive(Serialize, Deserialize)]
#[serde(rename_all="kebab-case")]
pub struct SnapshotListItem {
pub backup_type: String, // enum
pub backup_id: String,
pub backup_time: i64,
pub files: Vec<String>,
#[serde(skip_serializing_if="Option::is_none")]
pub size: Option<u64>,
}