use crate::{
InternalError,
cdk::types::Principal,
domain::policy::pure::topology::TopologyPolicy,
dto::cascade::{StateSnapshotInput, TopologySnapshotInput},
ids::CanisterRole,
ops::{
storage::{
directory::{fleet::FleetDirectoryOps, subnet::SubnetDirectoryOps},
registry::subnet::SubnetRegistryOps,
},
topology::input::mapper::TopologyRegistryMapper,
},
workflow::{
cascade::{
snapshot::adapter::StateSnapshotAdapter, state::StateCascadeWorkflow,
topology::TopologyCascadeWorkflow,
},
ic::provision::ProvisionWorkflow,
},
};
pub struct PropagationWorkflow;
impl PropagationWorkflow {
pub async fn propagate_topology(
target: Principal,
) -> Result<TopologySnapshotInput, InternalError> {
TopologyCascadeWorkflow::root_cascade_topology_for_pid(target).await
}
pub async fn propagate_state(role: &CanisterRole) -> Result<StateSnapshotInput, InternalError> {
let snapshot = ProvisionWorkflow::rebuild_directories_from_registry(Some(role))?
.with_fleet_state()
.build();
let input = StateSnapshotAdapter::to_input(&snapshot);
StateCascadeWorkflow::root_cascade_state(&snapshot).await?;
let registry_data = SubnetRegistryOps::data();
let registry_input = TopologyRegistryMapper::data_to_registry(registry_data);
let app_policy_input = FleetDirectoryOps::topology_entries();
let subnet_policy_input = SubnetDirectoryOps::topology_entries();
TopologyPolicy::assert_directory_consistent_with_registry(
®istry_input,
&app_policy_input,
)
.map_err(InternalError::from)?;
TopologyPolicy::assert_directory_consistent_with_registry(
®istry_input,
&subnet_policy_input,
)
.map_err(InternalError::from)?;
Ok(input)
}
}