canic-core 0.110.35

Canic — a canister orchestration and management toolkit for the Internet Computer
Documentation
use crate::{
    api::lifecycle::metrics::{
        LifecycleMetricOutcome, LifecycleMetricPhase, LifecycleMetricRole, LifecycleMetricsApi,
    },
    bootstrap,
    config::{RoleRuntimeAuthority, schema::ConfigModel},
    lifecycle::{LifecyclePhase, lifecycle_trap},
    ops::runtime::env::EnvOps,
    workflow,
};

pub fn post_upgrade_root_canister_before_bootstrap(
    embedded_release_build_id: Option<&str>,
    runtime_authority: RoleRuntimeAuthority,
    config: ConfigModel,
    config_source: &str,
    config_path: &str,
) -> bool {
    crate::api::timer::TimerApi::initialize_root_runtime_required();
    LifecycleMetricsApi::record_runtime(
        LifecycleMetricPhase::PostUpgrade,
        LifecycleMetricRole::Root,
        LifecycleMetricOutcome::Started,
    );

    if let Err(err) = bootstrap::init_compiled_config(config, config_source) {
        LifecycleMetricsApi::record_runtime(
            LifecycleMetricPhase::PostUpgrade,
            LifecycleMetricRole::Root,
            LifecycleMetricOutcome::Failed,
        );
        lifecycle_trap(
            LifecyclePhase::PostUpgrade,
            format!("config init failed (config_path={config_path}): {err}"),
        );
    }
    if let Err(err) =
        bootstrap::init_role_runtime_authority(&crate::ids::CanisterRole::ROOT, runtime_authority)
    {
        LifecycleMetricsApi::record_runtime(
            LifecycleMetricPhase::PostUpgrade,
            LifecycleMetricRole::Root,
            LifecycleMetricOutcome::Failed,
        );
        lifecycle_trap(
            LifecyclePhase::PostUpgrade,
            format!("runtime authority init failed: {err}"),
        );
    }

    match workflow::runtime::init_memory_registry_post_upgrade() {
        Ok(()) => {}
        Err(err) => {
            LifecycleMetricsApi::record_runtime(
                LifecycleMetricPhase::PostUpgrade,
                LifecycleMetricRole::Root,
                LifecycleMetricOutcome::Failed,
            );
            lifecycle_trap(LifecyclePhase::PostUpgrade, err);
        }
    }

    if let Err(err) = EnvOps::restore_root() {
        LifecycleMetricsApi::record_runtime(
            LifecycleMetricPhase::PostUpgrade,
            LifecycleMetricRole::Root,
            LifecycleMetricOutcome::Failed,
        );
        lifecycle_trap(
            LifecyclePhase::PostUpgrade,
            format!("env restore failed (root upgrade): {err}"),
        );
    }
    let sealed = crate::ops::storage::authority_restore::AuthorityRestoreFenceOps::is_sealed_for(
        crate::ops::ic::IcOps::canister_self(),
    )
    .unwrap_or_else(|error| {
        lifecycle_trap(
            LifecyclePhase::PostUpgrade,
            format!("authority restore fence recovery failed: {error}"),
        )
    });
    crate::api::timer::TimerApi::restore_snapshot_suspension(sealed);
    let active = match workflow::runtime::post_upgrade_root_canister_after_memory_init(
        embedded_release_build_id,
    ) {
        Ok(active) => active,
        Err(err) => {
            LifecycleMetricsApi::record_runtime(
                LifecycleMetricPhase::PostUpgrade,
                LifecycleMetricRole::Root,
                LifecycleMetricOutcome::Failed,
            );
            lifecycle_trap(LifecyclePhase::PostUpgrade, err);
        }
    };

    LifecycleMetricsApi::record_runtime(
        LifecycleMetricPhase::PostUpgrade,
        LifecycleMetricRole::Root,
        LifecycleMetricOutcome::Completed,
    );
    active
}