diff --git a/pbs-api-types/src/datastore.rs b/pbs-api-types/src/datastore.rs index 39e44de6..75f82ea4 100644 --- a/pbs-api-types/src/datastore.rs +++ b/pbs-api-types/src/datastore.rs @@ -506,6 +506,88 @@ pub struct TypeCounts { pub snapshots: u64, } +#[api( + properties: { + "upid": { + optional: true, + type: UPID, + }, + }, +)] +#[derive(Clone, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +/// Garbage collection status. +pub struct GarbageCollectionStatus { + pub upid: Option, + /// Number of processed index files. + pub index_file_count: usize, + /// Sum of bytes referred by index files. + pub index_data_bytes: u64, + /// Bytes used on disk. + pub disk_bytes: u64, + /// Chunks used on disk. + pub disk_chunks: usize, + /// Sum of removed bytes. + pub removed_bytes: u64, + /// Number of removed chunks. + pub removed_chunks: usize, + /// Sum of pending bytes (pending removal - kept for safety). + pub pending_bytes: u64, + /// Number of pending chunks (pending removal - kept for safety). + pub pending_chunks: usize, + /// Number of chunks marked as .bad by verify that have been removed by GC. + pub removed_bad: usize, + /// Number of chunks still marked as .bad after garbage collection. + pub still_bad: usize, +} + +impl Default for GarbageCollectionStatus { + fn default() -> Self { + GarbageCollectionStatus { + upid: None, + index_file_count: 0, + index_data_bytes: 0, + disk_bytes: 0, + disk_chunks: 0, + removed_bytes: 0, + removed_chunks: 0, + pending_bytes: 0, + pending_chunks: 0, + removed_bad: 0, + still_bad: 0, + } + } +} + +#[api( + properties: { + "gc-status": { + type: GarbageCollectionStatus, + optional: true, + }, + counts: { + type: Counts, + optional: true, + }, + }, +)] +#[derive(Serialize, Deserialize)] +#[serde(rename_all="kebab-case")] +/// Overall Datastore status and useful information. +pub struct DataStoreStatus { + /// Total space (bytes). + pub total: u64, + /// Used space (bytes). + pub used: u64, + /// Available space (bytes). + pub avail: u64, + /// Status of last GC + #[serde(skip_serializing_if="Option::is_none")] + pub gc_status: Option, + /// Group/Snapshot counts + #[serde(skip_serializing_if="Option::is_none")] + pub counts: Option, +} pub const ADMIN_DATASTORE_LIST_SNAPSHOTS_RETURN_TYPE: ReturnType = ReturnType { optional: false, diff --git a/pbs-api-types/src/jobs.rs b/pbs-api-types/src/jobs.rs index a96fcc10..1526dbc4 100644 --- a/pbs-api-types/src/jobs.rs +++ b/pbs-api-types/src/jobs.rs @@ -17,10 +17,6 @@ const_regex!{ pub SYNC_JOB_WORKER_ID_REGEX = concat!(r"^(", PROXMOX_SAFE_ID_REGEX_STR!(), r"):(", PROXMOX_SAFE_ID_REGEX_STR!(), r"):(", PROXMOX_SAFE_ID_REGEX_STR!(), r"):"); } -pub const UPID_SCHEMA: Schema = StringSchema::new("Unique Process/Task ID.") - .max_length(256) - .schema(); - pub const JOB_ID_SCHEMA: Schema = StringSchema::new("Job ID.") .format(&PROXMOX_SAFE_ID_FORMAT) .min_length(3) diff --git a/pbs-api-types/src/lib.rs b/pbs-api-types/src/lib.rs index 388bf0f7..6b0246f5 100644 --- a/pbs-api-types/src/lib.rs +++ b/pbs-api-types/src/lib.rs @@ -4,9 +4,7 @@ use serde::{Deserialize, Serialize}; use anyhow::bail; use proxmox::api::api; -use proxmox::api::schema::{ - ApiStringFormat, ApiType, ArraySchema, ReturnType, Schema, StringSchema, -}; +use proxmox::api::schema::{ApiStringFormat, ArraySchema, Schema, StringSchema}; use proxmox::const_regex; use proxmox::{IPRE, IPRE_BRACKET, IPV4OCTET, IPV4RE, IPV6H16, IPV6LS32, IPV6RE}; @@ -63,7 +61,7 @@ mod user; pub use user::*; pub mod upid; -pub use upid::UPID; +pub use upid::*; mod crypto; pub use crypto::{CryptMode, Fingerprint}; @@ -276,58 +274,6 @@ pub const PROXMOX_CONFIG_DIGEST_SCHEMA: Schema = StringSchema::new( /// API schema format definition for repository URLs pub const BACKUP_REPO_URL: ApiStringFormat = ApiStringFormat::Pattern(&BACKUP_REPO_URL_REGEX); -#[api( - properties: { - "upid": { - optional: true, - type: UPID, - }, - }, -)] -#[derive(Clone, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -/// Garbage collection status. -pub struct GarbageCollectionStatus { - pub upid: Option, - /// Number of processed index files. - pub index_file_count: usize, - /// Sum of bytes referred by index files. - pub index_data_bytes: u64, - /// Bytes used on disk. - pub disk_bytes: u64, - /// Chunks used on disk. - pub disk_chunks: usize, - /// Sum of removed bytes. - pub removed_bytes: u64, - /// Number of removed chunks. - pub removed_chunks: usize, - /// Sum of pending bytes (pending removal - kept for safety). - pub pending_bytes: u64, - /// Number of pending chunks (pending removal - kept for safety). - pub pending_chunks: usize, - /// Number of chunks marked as .bad by verify that have been removed by GC. - pub removed_bad: usize, - /// Number of chunks still marked as .bad after garbage collection. - pub still_bad: usize, -} - -impl Default for GarbageCollectionStatus { - fn default() -> Self { - GarbageCollectionStatus { - upid: None, - index_file_count: 0, - index_data_bytes: 0, - disk_bytes: 0, - disk_chunks: 0, - removed_bytes: 0, - removed_chunks: 0, - pending_bytes: 0, - pending_chunks: 0, - removed_bad: 0, - still_bad: 0, - } - } -} // Complex type definitions @@ -383,46 +329,6 @@ impl std::convert::TryFrom> for RsaPubK } } -#[api( - properties: { - upid: { schema: UPID::API_SCHEMA }, - }, -)] -#[derive(Serialize, Deserialize)] -/// Task properties. -pub struct TaskListItem { - pub upid: String, - /// The node name where the task is running on. - pub node: String, - /// The Unix PID - pub pid: i64, - /// The task start time (Epoch) - pub pstart: u64, - /// The task start time (Epoch) - pub starttime: i64, - /// Worker type (arbitrary ASCII string) - pub worker_type: String, - /// Worker ID (arbitrary ASCII string) - pub worker_id: Option, - /// The authenticated entity who started the task - pub user: Authid, - /// The task end time (Epoch) - #[serde(skip_serializing_if="Option::is_none")] - pub endtime: Option, - /// Task end status - #[serde(skip_serializing_if="Option::is_none")] - pub status: Option, -} - - -pub const NODE_TASKS_LIST_TASKS_RETURN_TYPE: ReturnType = ReturnType { - optional: false, - schema: &ArraySchema::new( - "A list of tasks.", - &TaskListItem::API_SCHEMA, - ).schema(), -}; - #[api()] #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] diff --git a/pbs-api-types/src/upid.rs b/pbs-api-types/src/upid.rs index 9447b8a0..50d70b67 100644 --- a/pbs-api-types/src/upid.rs +++ b/pbs-api-types/src/upid.rs @@ -1,8 +1,10 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use anyhow::{bail, Error}; +use serde::{Deserialize, Serialize}; -use proxmox::api::schema::{ApiStringFormat, ApiType, Schema, StringSchema}; +use proxmox::api::api; +use proxmox::api::schema::{ApiStringFormat, ApiType, Schema, StringSchema, ArraySchema, ReturnType}; use proxmox::const_regex; use proxmox::sys::linux::procfs; @@ -54,12 +56,14 @@ const_regex! { pub const PROXMOX_UPID_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&PROXMOX_UPID_REGEX); +pub const UPID_SCHEMA: Schema = StringSchema::new("Unique Process/Task Identifier") + .min_length("UPID:N:12345678:12345678:12345678:::".len()) + .max_length(128) // arbitrary + .format(&PROXMOX_UPID_FORMAT) + .schema(); + impl ApiType for UPID { - const API_SCHEMA: Schema = StringSchema::new("Unique Process/Task Identifier") - .min_length("UPID:N:12345678:12345678:12345678:::".len()) - .max_length(128) // arbitrary - .format(&PROXMOX_UPID_FORMAT) - .schema(); + const API_SCHEMA: Schema = UPID_SCHEMA; } impl UPID { @@ -143,3 +147,57 @@ impl std::fmt::Display for UPID { self.node, self.pid, self.pstart, self.task_id, self.starttime, self.worker_type, wid, self.auth_id) } } + +#[api()] +#[derive(Eq, PartialEq, Debug, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum TaskStateType { + /// Ok + OK, + /// Warning + Warning, + /// Error + Error, + /// Unknown + Unknown, +} + +#[api( + properties: { + upid: { schema: UPID::API_SCHEMA }, + }, +)] +#[derive(Serialize, Deserialize)] +/// Task properties. +pub struct TaskListItem { + pub upid: String, + /// The node name where the task is running on. + pub node: String, + /// The Unix PID + pub pid: i64, + /// The task start time (Epoch) + pub pstart: u64, + /// The task start time (Epoch) + pub starttime: i64, + /// Worker type (arbitrary ASCII string) + pub worker_type: String, + /// Worker ID (arbitrary ASCII string) + pub worker_id: Option, + /// The authenticated entity who started the task + pub user: Authid, + /// The task end time (Epoch) + #[serde(skip_serializing_if="Option::is_none")] + pub endtime: Option, + /// Task end status + #[serde(skip_serializing_if="Option::is_none")] + pub status: Option, +} + +pub const NODE_TASKS_LIST_TASKS_RETURN_TYPE: ReturnType = ReturnType { + optional: false, + schema: &ArraySchema::new( + "A list of tasks.", + &TaskListItem::API_SCHEMA, + ).schema(), +}; +