Skip to content

Commit 9970e03

Browse files
Added support for load_canister_snapshot to rs/nervous_system/clients. This is analogous to the changes in PR 8158.
1 parent 9a58716 commit 9970e03

File tree

4 files changed

+81
-1
lines changed

4 files changed

+81
-1
lines changed

rs/nervous_system/clients/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ pub mod canister_metadata;
33
pub mod canister_status;
44
pub mod delete_canister;
55
pub mod ledger_client;
6+
pub mod load_canister_snapshot;
67
pub mod management_canister_client;
78
pub mod stop_canister;
89
pub mod take_canister_snapshot;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
use ic_management_canister_types_private::{IC_00, LoadCanisterSnapshotArgs};
2+
use ic_nervous_system_runtime::Runtime;
3+
4+
pub async fn load_canister_snapshot<Rt>(args: LoadCanisterSnapshotArgs) -> Result<(), (i32, String)>
5+
where
6+
Rt: Runtime,
7+
{
8+
Rt::call_with_cleanup(IC_00, "load_canister_snapshot", (args,)).await
9+
}

rs/nervous_system/clients/src/management_canister_client.rs

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::{
33
canister_metadata::canister_metadata,
44
canister_status::{CanisterStatusResultFromManagementCanister, canister_status},
55
delete_canister::delete_canister,
6+
load_canister_snapshot::load_canister_snapshot,
67
stop_canister::stop_canister,
78
take_canister_snapshot::take_canister_snapshot,
89
update_settings::{UpdateSettings, update_settings},
@@ -12,7 +13,7 @@ use candid::Encode;
1213
use ic_base_types::PrincipalId;
1314
use ic_error_types::RejectCode;
1415
use ic_management_canister_types_private::{
15-
CanisterSnapshotResponse, IC_00, TakeCanisterSnapshotArgs,
16+
CanisterSnapshotResponse, IC_00, LoadCanisterSnapshotArgs, TakeCanisterSnapshotArgs,
1617
};
1718
use ic_nervous_system_proxied_canister_calls_tracker::ProxiedCanisterCallsTracker;
1819
use ic_nervous_system_runtime::Runtime;
@@ -62,6 +63,11 @@ pub trait ManagementCanisterClient {
6263
&self,
6364
args: TakeCanisterSnapshotArgs,
6465
) -> Result<CanisterSnapshotResponse, (i32, String)>;
66+
67+
async fn load_canister_snapshot(
68+
&self,
69+
args: LoadCanisterSnapshotArgs,
70+
) -> Result<(), (i32, String)>;
6571
}
6672

6773
/// An example implementation of the ManagementCanisterClient trait.
@@ -197,6 +203,24 @@ impl<Rt: Runtime + Sync> ManagementCanisterClient for ManagementCanisterClientIm
197203

198204
take_canister_snapshot::<Rt>(args).await
199205
}
206+
207+
async fn load_canister_snapshot(
208+
&self,
209+
args: LoadCanisterSnapshotArgs,
210+
) -> Result<(), (i32, String)> {
211+
let _tracker = self.proxied_canister_calls_tracker.map(|tracker| {
212+
let encoded_args = Encode!(&args).unwrap_or_default();
213+
ProxiedCanisterCallsTracker::start_tracking(
214+
tracker,
215+
dfn_core::api::caller(),
216+
IC_00,
217+
"load_canister_snapshot",
218+
&encoded_args,
219+
)
220+
});
221+
222+
load_canister_snapshot::<Rt>(args).await
223+
}
200224
}
201225

202226
/// A ManagementCanisterClient that wraps another ManagementCanisterClient.
@@ -322,6 +346,14 @@ where
322346
let _loan = self.try_borrow_slot()?;
323347
self.inner.take_canister_snapshot(args).await
324348
}
349+
350+
async fn load_canister_snapshot(
351+
&self,
352+
args: LoadCanisterSnapshotArgs,
353+
) -> Result<(), (i32, String)> {
354+
let _loan = self.try_borrow_slot()?;
355+
self.inner.load_canister_snapshot(args).await
356+
}
325357
}
326358

327359
/// Increments available_slot_count by used_slot_count when dropped.
@@ -376,6 +408,7 @@ pub enum MockManagementCanisterClientCall {
376408
StopCanister(CanisterIdRecord),
377409
DeleteCanister(CanisterIdRecord),
378410
TakeCanisterSnapshot(TakeCanisterSnapshotArgs),
411+
LoadCanisterSnapshot(LoadCanisterSnapshotArgs),
379412
}
380413

381414
#[derive(Clone, Eq, PartialEq, Debug)]
@@ -387,6 +420,7 @@ pub enum MockManagementCanisterClientReply {
387420
StopCanister(Result<(), (i32, String)>),
388421
DeleteCanister(Result<(), (i32, String)>),
389422
TakeCanisterSnapshot(Result<CanisterSnapshotResponse, (i32, String)>),
423+
LoadCanisterSnapshot(Result<(), (i32, String)>),
390424
}
391425

392426
#[async_trait]
@@ -555,6 +589,32 @@ impl ManagementCanisterClient for MockManagementCanisterClient {
555589
),
556590
}
557591
}
592+
593+
async fn load_canister_snapshot(
594+
&self,
595+
args: LoadCanisterSnapshotArgs,
596+
) -> Result<(), (i32, String)> {
597+
self.calls
598+
.lock()
599+
.unwrap()
600+
.push_back(MockManagementCanisterClientCall::LoadCanisterSnapshot(args));
601+
602+
let reply = self
603+
.replies
604+
.lock()
605+
.unwrap()
606+
.pop_front()
607+
.expect("Expected a MockManagementCanisterClientCall to be on the queue.");
608+
609+
match reply {
610+
MockManagementCanisterClientReply::LoadCanisterSnapshot(result) => result,
611+
err => panic!(
612+
"Expected MockManagementCanisterClientReply::LoadCanisterSnapshot to be at \
613+
the front of the queue. Had {:?}",
614+
err
615+
),
616+
}
617+
}
558618
}
559619

560620
impl Drop for MockManagementCanisterClient {

rs/nervous_system/clients/src/management_canister_client/tests.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ use crate::canister_status::{
55
};
66
use candid::Nat;
77
use ic_base_types::{CanisterId, PrincipalId};
8+
use ic_management_canister_types_private::{
9+
CanisterSnapshotResponse, LoadCanisterSnapshotArgs, TakeCanisterSnapshotArgs,
10+
};
811
use rand::{Rng, thread_rng};
912
use std::time::Duration;
1013

@@ -91,6 +94,13 @@ async fn test_limit_outstanding_calls() {
9194
) -> Result<CanisterSnapshotResponse, (i32, String)> {
9295
unimplemented!();
9396
}
97+
98+
async fn load_canister_snapshot(
99+
&self,
100+
_args: LoadCanisterSnapshotArgs,
101+
) -> Result<(), (i32, String)> {
102+
unimplemented!();
103+
}
94104
}
95105

96106
impl Drop for MockManagementCanisterClient {

0 commit comments

Comments
 (0)