diff --git a/Cargo.lock b/Cargo.lock index 3133d68aad4..224642148bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11861,6 +11861,7 @@ dependencies = [ "rust_decimal_macros", "serde", "serde_bytes", + "serde_json", "strum", "strum_macros", "tempfile", diff --git a/rs/nervous_system/common/src/lib.rs b/rs/nervous_system/common/src/lib.rs index 04dc8386068..59900b4db52 100644 --- a/rs/nervous_system/common/src/lib.rs +++ b/rs/nervous_system/common/src/lib.rs @@ -722,21 +722,6 @@ pub fn serve_metrics( } } -pub fn serve_journal(journal: &Journal) -> HttpResponse -where - Journal: serde::Serialize, -{ - match serde_json::to_string(journal) { - Err(err) => { - HttpResponseBuilder::server_error(format!("Failed to encode journal: {}", err)).build() - } - Ok(body) => HttpResponseBuilder::ok() - .header("Content-Type", "application/json") - .with_body_and_content_length(body) - .build(), - } -} - /// Returns the total amount of memory (heap, stable memory, etc) that the calling canister has allocated. #[cfg(target_arch = "wasm32")] pub fn total_memory_size_bytes() -> usize { diff --git a/rs/sns/governance/BUILD.bazel b/rs/sns/governance/BUILD.bazel index 7cdf3aa0716..763d4df9757 100644 --- a/rs/sns/governance/BUILD.bazel +++ b/rs/sns/governance/BUILD.bazel @@ -62,6 +62,7 @@ DEPENDENCIES = [ "@crate_index//:rust_decimal", "@crate_index//:serde", "@crate_index//:serde_bytes", + "@crate_index//:serde_json", "@crate_index//:strum", ] diff --git a/rs/sns/governance/Cargo.toml b/rs/sns/governance/Cargo.toml index 8c76978b518..6d00f0868f6 100644 --- a/rs/sns/governance/Cargo.toml +++ b/rs/sns/governance/Cargo.toml @@ -79,6 +79,7 @@ rust_decimal = "1.36.0" rust_decimal_macros = "1.36.0" serde = { workspace = true } serde_bytes = { workspace = true } +serde_json = { workspace = true } strum = { workspace = true } strum_macros = { workspace = true } canbench-rs = { version = "0.1.7", optional = true } diff --git a/rs/sns/governance/canister/canister.rs b/rs/sns/governance/canister/canister.rs index 6b7755c17f0..2c5e83ebaf4 100644 --- a/rs/sns/governance/canister/canister.rs +++ b/rs/sns/governance/canister/canister.rs @@ -11,7 +11,7 @@ use ic_nervous_system_clients::{ }; use ic_nervous_system_common::{ dfn_core_stable_mem_utils::{BufferedStableMemReader, BufferedStableMemWriter}, - serve_journal, serve_logs, serve_logs_v2, serve_metrics, + serve_logs, serve_logs_v2, serve_metrics, }; use ic_nervous_system_proto::pb::v1::{ GetTimersRequest, GetTimersResponse, ResetTimersRequest, ResetTimersResponse, Timers, @@ -25,6 +25,20 @@ use ic_sns_governance::{ logs::{ERROR, INFO}, pb::v1 as sns_gov_pb, types::{Environment, HeapGrowthPotential}, + upgrade_journal::serve_journal, +}; +use ic_sns_governance_api::pb::v1::{ + get_running_sns_version_response::UpgradeInProgress, governance::Version, + ClaimSwapNeuronsRequest, ClaimSwapNeuronsResponse, FailStuckUpgradeInProgressRequest, + FailStuckUpgradeInProgressResponse, GetMaturityModulationRequest, + GetMaturityModulationResponse, GetMetadataRequest, GetMetadataResponse, GetMode, + GetModeResponse, GetNeuron, GetNeuronResponse, GetProposal, GetProposalResponse, + GetRunningSnsVersionRequest, GetRunningSnsVersionResponse, + GetSnsInitializationParametersRequest, GetSnsInitializationParametersResponse, + GetUpgradeJournalRequest, GetUpgradeJournalResponse, Governance as GovernanceProto, + ListNervousSystemFunctionsResponse, ListNeurons, ListNeuronsResponse, ListProposals, + ListProposalsResponse, ManageNeuron, ManageNeuronResponse, NervousSystemParameters, + RewardEvent, SetMode, SetModeResponse, }; #[cfg(feature = "test")] use ic_sns_governance_api::pb::v1::{ @@ -32,22 +46,6 @@ use ic_sns_governance_api::pb::v1::{ AdvanceTargetVersionResponse, GovernanceError, MintTokensRequest, MintTokensResponse, Neuron, RefreshCachedUpgradeStepsRequest, RefreshCachedUpgradeStepsResponse, }; -use ic_sns_governance_api::pb::{ - v1 as api, - v1::{ - get_running_sns_version_response::UpgradeInProgress, governance::Version, - ClaimSwapNeuronsRequest, ClaimSwapNeuronsResponse, FailStuckUpgradeInProgressRequest, - FailStuckUpgradeInProgressResponse, GetMaturityModulationRequest, - GetMaturityModulationResponse, GetMetadataRequest, GetMetadataResponse, GetMode, - GetModeResponse, GetNeuron, GetNeuronResponse, GetProposal, GetProposalResponse, - GetRunningSnsVersionRequest, GetRunningSnsVersionResponse, - GetSnsInitializationParametersRequest, GetSnsInitializationParametersResponse, - GetUpgradeJournalRequest, GetUpgradeJournalResponse, Governance as GovernanceProto, - ListNervousSystemFunctionsResponse, ListNeurons, ListNeuronsResponse, ListProposals, - ListProposalsResponse, ManageNeuron, ManageNeuronResponse, NervousSystemParameters, - RewardEvent, SetMode, SetModeResponse, - }, -}; use prost::Message; use rand::{RngCore, SeedableRng}; use rand_chacha::ChaCha20Rng; @@ -646,9 +644,7 @@ pub fn http_request(request: HttpRequest) -> HttpResponse { .clone() .expect("The upgrade journal is not initialized for this SNS."); - let journal = api::UpgradeJournal::from(journal); - - serve_journal(&journal.entries) + serve_journal(&journal) } "/metrics" => serve_metrics(encode_metrics), "/logs" => serve_logs_v2(request, &INFO, &ERROR), diff --git a/rs/sns/governance/canister/tests.rs b/rs/sns/governance/canister/tests.rs index d0ed0b1ee29..f5c7e7a90c2 100644 --- a/rs/sns/governance/canister/tests.rs +++ b/rs/sns/governance/canister/tests.rs @@ -1,11 +1,7 @@ use super::*; use assert_matches::assert_matches; use candid_parser::utils::{service_equal, CandidSource}; -use ic_sns_governance_api::pb::v1::{ - governance::{Version, Versions}, - upgrade_journal_entry::{Event, UpgradeStepsRefreshed}, - DisburseMaturityInProgress, Neuron, UpgradeJournal, UpgradeJournalEntry, -}; +use ic_sns_governance_api::pb::v1::{DisburseMaturityInProgress, Neuron}; use maplit::btreemap; use pretty_assertions::assert_eq; use std::collections::HashSet; @@ -115,6 +111,12 @@ fn test_populate_finalize_disbursement_timestamp_seconds() { #[test] fn test_upgrade_journal() { + use ic_sns_governance::pb::v1::{ + governance::{Version, Versions}, + upgrade_journal_entry::{Event, UpgradeStepsRefreshed}, + UpgradeJournal, UpgradeJournalEntry, + }; + let journal = UpgradeJournal { entries: vec![UpgradeJournalEntry { timestamp_seconds: Some(1000), @@ -135,7 +137,7 @@ fn test_upgrade_journal() { // Currently, the `/journal` Http endpoint serves the entries directly, rather than the whole // journal object. - let http_response = serve_journal(&journal.entries); + let http_response = serve_journal(&journal); let expected_headers: HashSet<(_, _)> = HashSet::from_iter([ ("Content-Type".to_string(), "application/json".to_string()), ("Content-Length".to_string(), "277".to_string()), diff --git a/rs/sns/governance/src/upgrade_journal.rs b/rs/sns/governance/src/upgrade_journal.rs index 1ca20da4916..623955d2a5b 100644 --- a/rs/sns/governance/src/upgrade_journal.rs +++ b/rs/sns/governance/src/upgrade_journal.rs @@ -238,3 +238,17 @@ impl upgrade_journal_entry::Event { } } } + +pub fn serve_journal(journal: &UpgradeJournal) -> ic_canisters_http_types::HttpResponse { + use ic_canisters_http_types::HttpResponseBuilder; + let journal = ic_sns_governance_api::pb::v1::UpgradeJournal::from(journal.clone()); + match serde_json::to_string(&journal.entries) { + Err(err) => { + HttpResponseBuilder::server_error(format!("Failed to encode journal: {}", err)).build() + } + Ok(body) => HttpResponseBuilder::ok() + .header("Content-Type", "application/json") + .with_body_and_content_length(body) + .build(), + } +}