use crate::{
cdk::types::Cycles,
dto::{prelude::*, rpc::RootRequestMetadata},
};
pub use crate::domain::pool::CanisterPoolStatus;
#[derive(CandidType, Clone, Debug, Deserialize)]
pub struct CanisterPoolResponse {
pub entries: Vec<CanisterPoolEntry>,
}
#[derive(CandidType, Clone, Debug, Deserialize)]
pub struct CanisterPoolEntry {
pub pid: Principal,
pub created_at: u64,
pub cycles: Cycles,
pub status: CanisterPoolStatus,
pub role: Option<CanisterRole>,
pub parent: Option<Principal>,
pub module_hash: Option<Vec<u8>>,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub enum PoolAdminCommand {
CreateEmpty(CreateEmptyPoolRequest),
Recycle { pid: Principal },
ImportImmediate { pid: Principal },
ImportQueued { pids: Vec<Principal> },
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct CreateEmptyPoolRequest {
#[serde(default)]
pub metadata: Option<RootRequestMetadata>,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub enum PoolAdminResponse {
Created { pid: Principal },
Recycled,
Imported,
QueuedImported { result: PoolBatchResult },
FailedRequeued { result: PoolBatchResult },
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct PoolBatchResult {
pub total: u64,
pub added: u64,
pub requeued: u64,
pub skipped: u64,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn reexported_pool_status_roundtrips_through_candid() {
let entry = CanisterPoolEntry {
pid: Principal::from_slice(&[3; 29]),
created_at: 42,
cycles: Cycles::new(10_000),
status: crate::domain::pool::CanisterPoolStatus::Failed {
reason: "bounded reset failure".to_string(),
},
role: Some(CanisterRole::new("worker")),
parent: None,
module_hash: Some(vec![1, 2, 3]),
};
let bytes = candid::encode_one(&entry).expect("encode pool entry");
let decoded: CanisterPoolEntry = candid::decode_one(&bytes).expect("decode pool entry");
let dto_status: CanisterPoolStatus = crate::domain::pool::CanisterPoolStatus::Failed {
reason: "bounded reset failure".to_string(),
};
assert_eq!(decoded.pid, Principal::from_slice(&[3; 29]));
assert_eq!(decoded.created_at, 42);
assert_eq!(decoded.cycles, Cycles::new(10_000));
assert_eq!(decoded.status, dto_status);
assert_eq!(decoded.role, Some(CanisterRole::new("worker")));
assert_eq!(decoded.parent, None);
assert_eq!(decoded.module_hash, Some(vec![1, 2, 3]));
}
}