From cfefba9b0f49a3e2d724785708332eeb3720e8a3 Mon Sep 17 00:00:00 2001 From: Ulan Degenbaev Date: Tue, 12 Sep 2023 13:08:04 +0000 Subject: [PATCH] RUN-753: Add the reserved balance to canister status result --- .../src/canister_manager.rs | 1 + .../src/canister_manager/tests.rs | 43 +++++++++++++++++-- rs/replica_tests/tests/canister_lifecycle.rs | 2 + rs/types/ic00_types/src/lib.rs | 9 ++++ 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/rs/execution_environment/src/canister_manager.rs b/rs/execution_environment/src/canister_manager.rs index fe5240c3bbf..ad16a278075 100644 --- a/rs/execution_environment/src/canister_manager.rs +++ b/rs/execution_environment/src/canister_manager.rs @@ -1002,6 +1002,7 @@ impl CanisterManager { subnet_size, ) .get(), + canister.system_state.reserved_balance().get(), )) } diff --git a/rs/execution_environment/src/canister_manager/tests.rs b/rs/execution_environment/src/canister_manager/tests.rs index b7722b6d425..7eb664bcfe3 100644 --- a/rs/execution_environment/src/canister_manager/tests.rs +++ b/rs/execution_environment/src/canister_manager/tests.rs @@ -21,9 +21,9 @@ use ic_cycles_account_manager::{CyclesAccountManager, ResourceSaturation}; use ic_error_types::{ErrorCode, UserError}; use ic_ic00_types::{ CanisterChange, CanisterChangeDetails, CanisterChangeOrigin, CanisterIdRecord, - CanisterInstallMode, CanisterInstallModeV2, CanisterSettingsArgsBuilder, CanisterStatusType, - CreateCanisterArgs, EmptyBlob, InstallCodeArgsV2, Method, Payload, SkipPreUpgrade, - UpdateSettingsArgs, + CanisterInstallMode, CanisterInstallModeV2, CanisterSettingsArgsBuilder, + CanisterStatusResultV2, CanisterStatusType, CreateCanisterArgs, EmptyBlob, InstallCodeArgsV2, + Method, Payload, SkipPreUpgrade, UpdateSettingsArgs, }; use ic_interfaces::execution_environment::{ ExecutionComplexity, ExecutionMode, HypervisorError, SubnetAvailableMemory, @@ -6525,3 +6525,40 @@ fn update_settings_can_set_reserved_cycles_limit() { Some(Cycles::new(1)) ); } + +#[test] +fn canister_status_contains_reserved_cycles() { + const CYCLES: Cycles = Cycles::new(1_000_000_000_000_000); + const CAPACITY: u64 = 20_000_000_000; + + let mut test = ExecutionTestBuilder::new() + .with_subnet_execution_memory(CAPACITY as i64) + .with_subnet_memory_reservation(0) + .with_subnet_memory_threshold(0) + .build(); + + let canister_id = test + .create_canister_with_allocation(CYCLES, None, Some(1_000_000)) + .unwrap(); + let result = test.canister_status(canister_id); + let reply = get_reply(result); + let status = Decode!(reply.as_slice(), CanisterStatusResultV2).unwrap(); + assert_eq!( + status.reserved_cycles(), + test.cycles_account_manager() + .storage_reservation_cycles( + NumBytes::new(1_000_000), + &ResourceSaturation::new(0, 0, CAPACITY), + test.subnet_size() + ) + .get() + ); + assert_eq!( + status.reserved_cycles(), + test.canister_state(canister_id) + .system_state + .reserved_balance() + .get() + ); + assert!(status.reserved_cycles() > 0); +} diff --git a/rs/replica_tests/tests/canister_lifecycle.rs b/rs/replica_tests/tests/canister_lifecycle.rs index 21abcdc152d..0fc9ac7fab6 100644 --- a/rs/replica_tests/tests/canister_lifecycle.rs +++ b/rs/replica_tests/tests/canister_lifecycle.rs @@ -711,6 +711,7 @@ fn can_get_canister_information() { None, 2592000, 0u128, + 0u128, ) ); @@ -762,6 +763,7 @@ fn can_get_canister_information() { None, 259200, 0u128, + 0u128, ), CanisterStatusResultV2::decode(&res).unwrap(), 2 * BALANCE_EPSILON, diff --git a/rs/types/ic00_types/src/lib.rs b/rs/types/ic00_types/src/lib.rs index 997f0c45250..f2da3926702 100644 --- a/rs/types/ic00_types/src/lib.rs +++ b/rs/types/ic00_types/src/lib.rs @@ -841,7 +841,9 @@ impl Payload<'_> for CanisterStatusResult {} /// controller: principal; /// memory_size: nat; /// cycles: nat; +/// freezing_threshold: nat, /// idle_cycles_burned_per_day: nat; +/// reserved_cycles: nat; /// })` #[derive(CandidType, Debug, Deserialize, Eq, PartialEq)] pub struct CanisterStatusResultV2 { @@ -855,6 +857,7 @@ pub struct CanisterStatusResultV2 { balance: Vec<(Vec, candid::Nat)>, freezing_threshold: candid::Nat, idle_cycles_burned_per_day: candid::Nat, + reserved_cycles: candid::Nat, } impl CanisterStatusResultV2 { @@ -870,6 +873,7 @@ impl CanisterStatusResultV2 { memory_allocation: Option, freezing_threshold: u64, idle_cycles_burned_per_day: u128, + reserved_cycles: u128, ) -> Self { Self { status, @@ -889,6 +893,7 @@ impl CanisterStatusResultV2 { ), freezing_threshold: candid::Nat::from(freezing_threshold), idle_cycles_burned_per_day: candid::Nat::from(idle_cycles_burned_per_day), + reserved_cycles: candid::Nat::from(reserved_cycles), } } @@ -923,6 +928,10 @@ impl CanisterStatusResultV2 { pub fn idle_cycles_burned_per_day(&self) -> u128 { self.idle_cycles_burned_per_day.0.to_u128().unwrap() } + + pub fn reserved_cycles(&self) -> u128 { + self.reserved_cycles.0.to_u128().unwrap() + } } /// Indicates whether the canister is running, stopping, or stopped.