use super::{NnsTopologyProviderAccumulator, data_centers::insert_provider_data_center};
use crate::nns::{
node::report::NnsNodeListReport,
node_operator::report::{NnsNodeOperatorListReport, NnsNodeOperatorRow},
node_provider::report::NnsNodeProviderListReport,
};
impl NnsTopologyProviderAccumulator {
pub(in crate::nns::topology::report::providers) fn add_registered_providers(
&mut self,
report: &NnsNodeProviderListReport,
) {
for provider in &report.node_providers {
self.provider_principals
.insert(provider.node_provider_principal.clone());
self.provider_metadata.insert(
provider.node_provider_principal.clone(),
(provider.name.clone(), provider.node_count.map(u64::from)),
);
}
}
pub(in crate::nns::topology::report::providers) fn add_nodes(
&mut self,
report: &NnsNodeListReport,
) {
for node in &report.nodes {
let provider = node.node_provider_principal.clone();
self.provider_principals.insert(provider.clone());
*self
.topology_node_counts
.entry(provider.clone())
.or_default() += 1;
insert_provider_data_center(
&provider,
&node.data_center_id,
&self.data_center_regions,
&mut self.data_center_ids,
&mut self.region_ids,
);
}
}
pub(in crate::nns::topology::report::providers) fn add_node_operators(
&mut self,
report: &NnsNodeOperatorListReport,
) {
for operator in &report.node_operators {
self.add_node_operator(operator);
}
}
fn add_node_operator(&mut self, operator: &NnsNodeOperatorRow) {
let provider = operator.node_provider_principal.clone();
let assigned_node_count = operator.node_count.map_or(0, u64::from);
self.provider_principals.insert(provider.clone());
*self
.node_operator_counts
.entry(provider.clone())
.or_default() += 1;
*self.node_allowances.entry(provider.clone()).or_default() += operator.node_allowance;
*self
.assigned_node_counts
.entry(provider.clone())
.or_default() += assigned_node_count;
*self
.available_node_slots
.entry(provider.clone())
.or_default() += operator.node_allowance.saturating_sub(assigned_node_count);
*self
.over_assigned_node_counts
.entry(provider.clone())
.or_default() += assigned_node_count.saturating_sub(operator.node_allowance);
insert_provider_data_center(
&provider,
&operator.data_center_id,
&self.data_center_regions,
&mut self.data_center_ids,
&mut self.region_ids,
);
}
}