diff --git a/rs/registry/admin/bin/main.rs b/rs/registry/admin/bin/main.rs index d014456e3900..ca8a9ec2621f 100644 --- a/rs/registry/admin/bin/main.rs +++ b/rs/registry/admin/bin/main.rs @@ -88,16 +88,17 @@ use ic_protobuf::registry::{ }; use ic_registry_client::client::RegistryClientImpl; use ic_registry_client_helpers::{ - chain_keys::ChainKeysRegistry, crypto::CryptoRegistry, deserialize_registry_value, - ecdsa_keys::EcdsaKeysRegistry, hostos_version::HostosRegistry, + api_boundary_node::ApiBoundaryNodeRegistry, chain_keys::ChainKeysRegistry, + crypto::CryptoRegistry, deserialize_registry_value, ecdsa_keys::EcdsaKeysRegistry, + hostos_version::HostosRegistry, node_operator::NodeOperatorRegistry, replica_version::ReplicaVersionRegistry, subnet::SubnetRegistry, }; use ic_registry_keys::{ - API_BOUNDARY_NODE_RECORD_KEY_PREFIX, FirewallRulesScope, NODE_OPERATOR_RECORD_KEY_PREFIX, - NODE_RECORD_KEY_PREFIX, NODE_REWARDS_TABLE_KEY, ROOT_SUBNET_ID_KEY, - get_node_operator_id_from_record_key, get_node_record_node_id, is_node_operator_record_key, - is_node_record_key, make_api_boundary_node_record_key, make_canister_migrations_record_key, - make_crypto_node_key, make_crypto_threshold_signing_pubkey_key, make_crypto_tls_cert_key, + FirewallRulesScope, NODE_OPERATOR_RECORD_KEY_PREFIX, NODE_RECORD_KEY_PREFIX, + NODE_REWARDS_TABLE_KEY, ROOT_SUBNET_ID_KEY, get_node_operator_id_from_record_key, + get_node_record_node_id, is_node_operator_record_key, is_node_record_key, + make_api_boundary_node_record_key, make_canister_migrations_record_key, make_crypto_node_key, + make_crypto_threshold_signing_pubkey_key, make_crypto_tls_cert_key, make_data_center_record_key, make_firewall_config_record_key, make_firewall_rules_record_key, make_node_operator_record_key, make_node_record_key, make_provisional_whitelist_record_key, make_replica_version_key, make_subnet_list_record_key, make_subnet_record_key, @@ -4775,7 +4776,12 @@ async fn main() { } eprintln!("INFO: Fetching API Boundary nodes..."); // list all API Boundary Nodes - let api_bn_node_ids = get_api_boundary_node_ids(reachable_nns_urls.clone()) + let registry_client = make_registry_client( + reachable_nns_urls.clone(), + opts.verify_nns_responses, + opts.nns_public_key_pem_file, + ); + let api_bn_node_ids = get_api_boundary_node_ids(registry_client) .iter() .map(|n| NodeId::from(PrincipalId::from_str(n).unwrap())) .collect(); @@ -5329,12 +5335,10 @@ async fn main() { .await; } SubCommand::GetNodeOperatorList => { - let registry_client = RegistryClientImpl::new( - Arc::new(NnsDataProvider::new( - tokio::runtime::Handle::current(), - reachable_nns_urls.clone(), - )), - None, + let registry_client = make_registry_client( + reachable_nns_urls, + opts.verify_nns_responses, + opts.nns_public_key_pem_file, ); // maximum number of retries, let the user ctrl+c if necessary @@ -5342,20 +5346,14 @@ async fn main() { .try_polling_latest_version(usize::MAX) .unwrap(); - let keys = registry_client - .get_key_family( - NODE_OPERATOR_RECORD_KEY_PREFIX, - registry_client.get_latest_version(), - ) - .unwrap(); + let node_operators = registry_client + .get_node_operators(registry_client.get_latest_version()) + .unwrap() + .unwrap_or_default(); - let records = keys - .iter() - .map(|k| k.strip_prefix(NODE_OPERATOR_RECORD_KEY_PREFIX).unwrap()) - .collect::>(); println!( "{}", - serde_json::to_string_pretty(&records) + serde_json::to_string_pretty(&node_operators) .expect("Failed to serialize the records to JSON") ); } @@ -5853,12 +5851,10 @@ async fn main() { .await; } SubCommand::GetElectedHostosVersions => { - let registry_client = RegistryClientImpl::new( - Arc::new(NnsDataProvider::new( - tokio::runtime::Handle::current(), - reachable_nns_urls.clone(), - )), - None, + let registry_client = make_registry_client( + reachable_nns_urls, + opts.verify_nns_responses, + opts.nns_public_key_pem_file, ); // maximum number of retries, let the user ctrl+c if necessary @@ -5939,7 +5935,12 @@ async fn main() { .await; } SubCommand::GetApiBoundaryNodes => { - let records = get_api_boundary_node_ids(reachable_nns_urls.clone()); + let registry_client = make_registry_client( + reachable_nns_urls.clone(), + opts.verify_nns_responses, + opts.nns_public_key_pem_file, + ); + let records = get_api_boundary_node_ids(registry_client); println!( "{}", serde_json::to_string_pretty(&records) @@ -6750,32 +6751,17 @@ async fn get_subnet_pk(registry: &RegistryCanister, subnet_id: SubnetId) -> Publ } } -fn get_api_boundary_node_ids(nns_url: Vec) -> Vec { - let registry_client = RegistryClientImpl::new( - Arc::new(NnsDataProvider::new( - tokio::runtime::Handle::current(), - nns_url, - )), - None, - ); +fn get_api_boundary_node_ids(registry_client: RegistryClientImpl) -> Vec { // maximum number of retries, let the user ctrl+c if necessary registry_client .try_polling_latest_version(usize::MAX) .unwrap(); - let keys = registry_client - .get_key_family( - API_BOUNDARY_NODE_RECORD_KEY_PREFIX, - registry_client.get_latest_version(), - ) + + let bns = registry_client + .get_api_boundary_node_ids(registry_client.get_latest_version()) .unwrap(); - keys.iter() - .map(|k| { - k.strip_prefix(API_BOUNDARY_NODE_RECORD_KEY_PREFIX) - .unwrap() - .to_string() - }) - .collect::>() + bns.iter().map(|v| v.to_string()).collect::>() } fn print_routing_table(routing_table: &Vec<(CanisterIdRange, SubnetId)>, version: RegistryVersion) { diff --git a/rs/registry/helpers/src/node_operator.rs b/rs/registry/helpers/src/node_operator.rs index ddc2779b7768..e5d9f8d78d71 100644 --- a/rs/registry/helpers/src/node_operator.rs +++ b/rs/registry/helpers/src/node_operator.rs @@ -2,10 +2,15 @@ use crate::deserialize_registry_value; use ic_interfaces_registry::{RegistryClient, RegistryClientResult}; pub use ic_protobuf::registry::node::v1::{ConnectionEndpoint, NodeRecord}; pub use ic_protobuf::registry::node_operator::v1::NodeOperatorRecord; -use ic_registry_keys::make_node_operator_record_key; +use ic_registry_keys::{NODE_OPERATOR_RECORD_KEY_PREFIX, make_node_operator_record_key}; pub use ic_types::{NodeId, PrincipalId, RegistryVersion, SubnetId}; pub trait NodeOperatorRegistry { + fn get_node_operators( + &self, + version: RegistryVersion, + ) -> RegistryClientResult>; + fn get_node_operator_record( &self, node_operator_id: PrincipalId, @@ -14,6 +19,23 @@ pub trait NodeOperatorRegistry { } impl NodeOperatorRegistry for T { + fn get_node_operators( + &self, + version: RegistryVersion, + ) -> RegistryClientResult> { + let keys = self.get_key_family(NODE_OPERATOR_RECORD_KEY_PREFIX, version)?; + + let mut records = Vec::new(); + for key in keys { + let bytes = self.get_value(&key, version); + let node_operator_proto = + deserialize_registry_value::(bytes)?.unwrap_or_default(); + records.push(node_operator_proto) + } + + Ok(Some(records)) + } + fn get_node_operator_record( &self, node_operator_id: PrincipalId,