canic_host/deployment_truth/observe/inventory/
mod.rs1use super::super::*;
2use super::artifacts::{
3 collect_observed_artifacts, observe_canonical_runtime_config_digest, observe_config_sha256,
4 observe_deployment_manifest_digest,
5};
6use super::config::observe_local_config_facts;
7use super::identity::{InventoryIdentityFacts, local_inventory_identity};
8use super::root::{fleet_catalog_observations, observed_root_observation};
9use crate::fleet_catalog::{FleetCatalogError, read_fleet_catalog_entry_from_root};
10use crate::network::resolve_canonical_network_id_from_root;
11use std::path::PathBuf;
12use thiserror::Error as ThisError;
13
14#[derive(Clone, Debug, Eq, PartialEq)]
18pub struct LocalInventoryRequest {
19 pub fleet_name: String,
20 pub environment: String,
21 pub artifact_environment: String,
22 pub workspace_root: PathBuf,
23 pub icp_root: PathBuf,
24 pub config_path: Option<PathBuf>,
25 pub observed_at: String,
26}
27
28#[derive(Debug, ThisError)]
32pub enum DeploymentTruthError {
33 #[error("failed to read the canonical-network Fleet catalog: {0}")]
34 FleetCatalog(#[source] FleetCatalogError),
35}
36
37pub fn collect_local_deployment_inventory(
39 request: &LocalInventoryRequest,
40) -> Result<DeploymentInventoryV1, DeploymentTruthError> {
41 let config = deployment_config_path(&request.workspace_root, request.config_path.as_deref());
42 let mut unresolved_observations = Vec::new();
43 let local_config_facts = observe_local_config_facts(&config, &mut unresolved_observations);
44
45 let installed_fleet = read_fleet_catalog_entry_from_root(
46 &request.icp_root,
47 &request.environment,
48 &request.fleet_name,
49 )
50 .map_err(DeploymentTruthError::FleetCatalog)?;
51 let canonical_network_id =
52 resolve_canonical_network_id_from_root(&request.icp_root, &request.environment)
53 .map_err(FleetCatalogError::from)
54 .map_err(DeploymentTruthError::FleetCatalog)?;
55 let raw_config_sha256 = observe_config_sha256(&config, &mut unresolved_observations);
56 let canonical_runtime_config_digest =
57 observe_canonical_runtime_config_digest(&config, &mut unresolved_observations);
58 let deployment_manifest_digest = observe_deployment_manifest_digest(
59 &request.icp_root,
60 &request.artifact_environment,
61 &mut unresolved_observations,
62 );
63 let observed_artifacts = collect_observed_artifacts(
64 &request.icp_root,
65 &request.artifact_environment,
66 &local_config_facts.roles,
67 &mut unresolved_observations,
68 );
69 let (observed_canisters, observed_pool) = fleet_catalog_observations(
70 installed_fleet.as_ref(),
71 request,
72 &local_config_facts.pool_expectations,
73 &mut unresolved_observations,
74 );
75 let observed_root =
76 observed_root_observation(installed_fleet.as_ref(), request, &observed_canisters);
77 let observed_identity = Some(local_inventory_identity(
78 request,
79 InventoryIdentityFacts {
80 canonical_network_id,
81 fleet_id: installed_fleet.as_ref().map(|fleet| fleet.fleet_id),
82 app: installed_fleet.as_ref().map_or_else(
83 || local_config_facts.app.clone(),
84 |fleet| fleet.app.to_string(),
85 ),
86 root_principal: installed_fleet
87 .as_ref()
88 .map(|fleet| fleet.root_principal.clone()),
89 deployment_manifest_digest,
90 canonical_runtime_config_digest: canonical_runtime_config_digest.clone(),
91 observed_canisters: &observed_canisters,
92 observed_artifacts: &observed_artifacts,
93 observed_pool: &observed_pool,
94 },
95 ));
96
97 Ok(DeploymentInventoryV1 {
98 schema_version: DEPLOYMENT_TRUTH_SCHEMA_VERSION,
99 inventory_id: format!("local:{}:{}", request.environment, request.fleet_name),
100 observed_at: request.observed_at.clone(),
101 observed_identity,
102 observed_root,
103 local_config: LocalDeploymentConfigV1 {
104 config_path: Some(config.display().to_string()),
105 raw_config_sha256,
106 canonical_embedded_config_sha256: canonical_runtime_config_digest,
107 },
108 observed_canisters,
109 observed_pool,
110 observed_artifacts,
111 observed_verifier_readiness: VerifierReadinessObservationV1 {
112 status: ObservationStatusV1::NotObserved,
113 role_epochs: Vec::new(),
114 },
115 unresolved_observations,
116 })
117}