pub mod builder;
use crate::{
InternalError,
dto::topology::{DirectoryProvenance, FleetDirectoryInput, SubnetDirectoryInput},
ops::{
config::ConfigOps,
runtime::env::EnvOps,
storage::{
StorageOpsError,
directory::{
ensure_provenance,
fleet::FleetDirectoryOps,
mapper::{FleetDirectoryDataMapper, SubnetDirectoryDataMapper},
subnet::SubnetDirectoryOps,
},
fleet_activation::FleetActivationOps,
registry::subnet::SubnetRegistryOps,
},
},
storage::stable::directory::{fleet::FleetDirectoryData, subnet::SubnetDirectoryData},
};
use self::builder::{RootFleetDirectoryBuilder, RootSubnetDirectoryBuilder};
pub struct FleetDirectoryResolver;
impl FleetDirectoryResolver {
pub fn resolve() -> Result<FleetDirectoryData, InternalError> {
if EnvOps::is_root() {
let registry = SubnetRegistryOps::data();
let cfg = ConfigOps::get()?;
RootFleetDirectoryBuilder::build(®istry, &cfg.services.fleet.roles)
} else {
Ok(FleetDirectoryOps::data())
}
}
pub fn resolve_input() -> Result<FleetDirectoryInput, InternalError> {
Ok(FleetDirectoryDataMapper::data_to_input(
Self::resolve()?,
current_provenance()?,
))
}
}
pub struct SubnetDirectoryResolver;
impl SubnetDirectoryResolver {
pub fn resolve() -> Result<SubnetDirectoryData, InternalError> {
if EnvOps::is_root() {
let registry = SubnetRegistryOps::data();
let cfg = ConfigOps::current_subnet()?;
RootSubnetDirectoryBuilder::build(®istry, &cfg.subnet_directory_roles())
} else {
Ok(SubnetDirectoryOps::data())
}
}
pub fn resolve_input() -> Result<SubnetDirectoryInput, InternalError> {
Ok(SubnetDirectoryDataMapper::data_to_input(
Self::resolve()?,
current_provenance()?,
))
}
}
pub fn current_provenance() -> Result<DirectoryProvenance, InternalError> {
Ok(DirectoryProvenance {
fleet: FleetActivationOps::fleet_binding().map_err(StorageOpsError::from)?,
source_root: EnvOps::prime_root_pid()?,
})
}
pub fn validate_provenance(provenance: &DirectoryProvenance) -> Result<(), InternalError> {
let expected_fleet = FleetActivationOps::fleet_binding().map_err(StorageOpsError::from)?;
let expected_source_root = EnvOps::prime_root_pid()?;
ensure_provenance(provenance, &expected_fleet, expected_source_root)?;
Ok(())
}