feat: upgrade mode: VPN adjustments (#6189)
* placeholder handling of wg registration with upgrade mode token * include upgrade mode credentials as part of credential storage * introduce helper for decoding JWT payload * expose methods for removing emergency credentials from the storage * don't allow duplicate emergency credentials with the same content * added authenticator ClientMessage for upgrade mode check * retrieve credentials with longest expiration first * post rebasing fixes * fixed gateway config * feat: allow specifying minimum node performance for client init * nym-node UM improvements * fixed upgrade mode bandwidth on initial authentication * fix: logs and thresholds * expose attestation information from nym-node http api * additional logs * post rebasing fixes * make @simonwicky happy by removing empty lines in emergency_credential table definition * chore: remove '_' prefix for internal counters within in-mem ecash storage * improved import of 'UpgradeModeState' within the nym-node * use explicit time dependency within credential-storage * re-order imports within the gateway-client * moved 'AvailableBandwidth' definition to the monorepo
This commit is contained in:
committed by
GitHub
parent
6b2bb3029b
commit
d126d8e5a0
@@ -14,6 +14,7 @@ pub mod ip_packet_router;
|
||||
pub mod load;
|
||||
pub mod metrics;
|
||||
pub mod mixnode;
|
||||
pub mod network;
|
||||
pub mod network_requester;
|
||||
pub mod node;
|
||||
pub mod openapi;
|
||||
@@ -34,6 +35,7 @@ pub(super) fn routes(config: Config) -> Router<AppState> {
|
||||
Router::new()
|
||||
.route(v1::HEALTH, get(health::root_health))
|
||||
.route(v1::LOAD, get(load::root_load))
|
||||
.nest(v1::NETWORK, network::routes())
|
||||
.nest(v1::METRICS, metrics::routes(config.metrics))
|
||||
.nest(v1::BRIDGES, bridges::routes(config.bridges))
|
||||
.nest(v1::GATEWAY, gateway::routes(config.gateway))
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
|
||||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
use crate::node::http::api::v1::network::upgrade_mode::upgrade_mode_status;
|
||||
use crate::node::http::state::AppState;
|
||||
use axum::Router;
|
||||
use axum::routing::get;
|
||||
use nym_node_requests::routes::api::v1::network;
|
||||
|
||||
pub mod upgrade_mode;
|
||||
|
||||
pub(crate) fn routes() -> Router<AppState> {
|
||||
Router::new().route(network::UPGRADE_MODE_STATUS, get(upgrade_mode_status))
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
|
||||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
use crate::node::http::state::AppState;
|
||||
use axum::extract::{Query, State};
|
||||
use nym_http_api_common::{FormattedResponse, OutputParams};
|
||||
use nym_node_requests::api::v1::network::models::UpgradeModeStatus;
|
||||
|
||||
/// Returns current upgrade mode information as perceived by this node.
|
||||
#[utoipa::path(
|
||||
get,
|
||||
path = "/upgrade-mode-status",
|
||||
context_path = "/api/v1/network",
|
||||
tag = "Network",
|
||||
responses(
|
||||
(status = 200, content(
|
||||
(UpgradeModeStatus = "application/json"),
|
||||
(UpgradeModeStatus = "application/yaml"),
|
||||
(UpgradeModeStatus = "application/bincode")
|
||||
))
|
||||
),
|
||||
params(OutputParams)
|
||||
)]
|
||||
pub(crate) async fn upgrade_mode_status(
|
||||
Query(output): Query<OutputParams>,
|
||||
State(state): State<AppState>,
|
||||
) -> UpgradeModeStatusResponse {
|
||||
let output = output.get_output();
|
||||
let um_state = &state.upgrade_mode_state.node_state;
|
||||
output.to_response(UpgradeModeStatus {
|
||||
enabled: um_state.upgrade_mode_enabled(),
|
||||
last_queried: um_state.last_queried(),
|
||||
attestation_provider: state.upgrade_mode_state.attestation_url.clone(),
|
||||
attester_pubkey: um_state.attester_pubkey(),
|
||||
published_attestation: um_state.attestation().await,
|
||||
})
|
||||
}
|
||||
|
||||
pub type UpgradeModeStatusResponse = FormattedResponse<UpgradeModeStatus>;
|
||||
@@ -1,7 +1,6 @@
|
||||
// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
|
||||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
use crate::node::http::router::api;
|
||||
use axum::Router;
|
||||
use nym_node_requests::api as api_requests;
|
||||
use nym_node_requests::routes::api::{v1, v1_absolute};
|
||||
@@ -13,25 +12,31 @@ use utoipa_swagger_ui::SwaggerUi;
|
||||
#[openapi(
|
||||
info(title = "NymNode API"),
|
||||
paths(
|
||||
api::v1::node::build_information::build_information,
|
||||
api::v1::node::host_information::host_information,
|
||||
api::v1::node::roles::roles,
|
||||
api::v1::node::hardware::host_system,
|
||||
api::v1::node::description::description,
|
||||
api::v1::node::auxiliary::auxiliary,
|
||||
api::v1::metrics::legacy_mixing::legacy_mixing_stats,
|
||||
api::v1::metrics::packets_stats::packets_stats,
|
||||
api::v1::metrics::verloc::verloc_stats,
|
||||
api::v1::metrics::prometheus::prometheus_metrics,
|
||||
api::v1::health::root_health,
|
||||
api::v1::load::root_load,
|
||||
api::v1::gateway::root::root_gateway,
|
||||
api::v1::gateway::client_interfaces::client_interfaces,
|
||||
api::v1::gateway::client_interfaces::mixnet_websockets,
|
||||
api::v1::mixnode::root::root_mixnode,
|
||||
api::v1::network_requester::root::root_network_requester,
|
||||
api::v1::network_requester::exit_policy::node_exit_policy,
|
||||
api::v1::ip_packet_router::root::root_ip_packet_router,
|
||||
crate::node::http::router::api::v1::metrics::verloc::verloc_stats,
|
||||
crate::node::http::router::api::v1::metrics::legacy_mixing::legacy_mixing_stats,
|
||||
crate::node::http::router::api::v1::metrics::wireguard::wireguard_stats,
|
||||
crate::node::http::router::api::v1::metrics::sessions::sessions_stats,
|
||||
crate::node::http::router::api::v1::metrics::packets_stats::packets_stats,
|
||||
crate::node::http::router::api::v1::metrics::prometheus::prometheus_metrics,
|
||||
crate::node::http::router::api::v1::ip_packet_router::root::root_ip_packet_router,
|
||||
crate::node::http::router::api::v1::health::root_health,
|
||||
crate::node::http::router::api::v1::network::upgrade_mode::upgrade_mode_status,
|
||||
crate::node::http::router::api::v1::mixnode::root::root_mixnode,
|
||||
crate::node::http::router::api::v1::load::root_load,
|
||||
crate::node::http::router::api::v1::node::host_information::host_information,
|
||||
crate::node::http::router::api::v1::node::description::description,
|
||||
crate::node::http::router::api::v1::node::roles::roles,
|
||||
crate::node::http::router::api::v1::node::auxiliary::auxiliary,
|
||||
crate::node::http::router::api::v1::node::build_information::build_information,
|
||||
crate::node::http::router::api::v1::node::hardware::host_system,
|
||||
crate::node::http::router::api::v1::authenticator::root::root_authenticator,
|
||||
crate::node::http::router::api::v1::network_requester::exit_policy::node_exit_policy,
|
||||
crate::node::http::router::api::v1::network_requester::root::root_network_requester,
|
||||
crate::node::http::router::api::v1::gateway::client_interfaces::client_interfaces,
|
||||
crate::node::http::router::api::v1::gateway::client_interfaces::mixnet_websockets,
|
||||
crate::node::http::router::api::v1::gateway::client_interfaces::wireguard_details,
|
||||
crate::node::http::router::api::v1::gateway::root::root_gateway,
|
||||
|
||||
),
|
||||
components(
|
||||
schemas(
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
use crate::node::http::state::load::CachedNodeLoad;
|
||||
use crate::node::http::state::metrics::MetricsAppState;
|
||||
use crate::node::key_rotation::active_keys::ActiveSphinxKeys;
|
||||
use nym_credential_verification::UpgradeModeState;
|
||||
use nym_crypto::asymmetric::ed25519;
|
||||
use nym_node_metrics::NymNodeMetrics;
|
||||
use nym_noise_keys::VersionedNoiseKey;
|
||||
@@ -12,6 +13,7 @@ use std::net::IpAddr;
|
||||
use std::sync::Arc;
|
||||
use std::time::Duration;
|
||||
use tokio::time::Instant;
|
||||
use url::Url;
|
||||
|
||||
pub mod load;
|
||||
pub mod metrics;
|
||||
@@ -23,6 +25,12 @@ pub(crate) struct StaticNodeInformation {
|
||||
pub(crate) hostname: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub(crate) struct UpgradeModeApiState {
|
||||
pub(crate) node_state: UpgradeModeState,
|
||||
pub(crate) attestation_url: Url,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub(crate) struct AppState {
|
||||
pub(crate) startup_time: Instant,
|
||||
@@ -34,15 +42,18 @@ pub(crate) struct AppState {
|
||||
pub(crate) cached_load: CachedNodeLoad,
|
||||
|
||||
pub(crate) metrics: MetricsAppState,
|
||||
|
||||
pub(crate) upgrade_mode_state: UpgradeModeApiState,
|
||||
}
|
||||
|
||||
impl AppState {
|
||||
#[allow(clippy::new_without_default)]
|
||||
pub(crate) fn new(
|
||||
static_information: StaticNodeInformation,
|
||||
x25519_sphinx_keys: ActiveSphinxKeys,
|
||||
metrics: NymNodeMetrics,
|
||||
verloc: SharedVerlocStats,
|
||||
upgrade_mode_attestation_url: Url,
|
||||
upgrade_mode_state: UpgradeModeState,
|
||||
load_cache_ttl: Duration,
|
||||
) -> Self {
|
||||
AppState {
|
||||
@@ -56,6 +67,10 @@ impl AppState {
|
||||
startup_time: Instant::now(),
|
||||
cached_load: CachedNodeLoad::new(load_cache_ttl),
|
||||
metrics: MetricsAppState { metrics, verloc },
|
||||
upgrade_mode_state: UpgradeModeApiState {
|
||||
node_state: upgrade_mode_state,
|
||||
attestation_url: upgrade_mode_attestation_url,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,6 +39,7 @@ use crate::node::shared_network::{
|
||||
CachedNetwork, CachedTopologyProvider, LocalGatewayNode, NetworkRefresher,
|
||||
};
|
||||
use nym_bin_common::bin_info;
|
||||
use nym_credential_verification::UpgradeModeState;
|
||||
use nym_crypto::asymmetric::{ed25519, x25519};
|
||||
use nym_gateway::node::{ActiveClientsStore, GatewayTasksBuilder, UpgradeModeCheckRequestSender};
|
||||
use nym_mixnet_client::client::ActiveConnections;
|
||||
@@ -373,6 +374,8 @@ pub(crate) struct NymNode {
|
||||
|
||||
entry_gateway: GatewayTasksData,
|
||||
|
||||
upgrade_mode_state: UpgradeModeState,
|
||||
|
||||
#[allow(dead_code)]
|
||||
service_providers: ServiceProvidersData,
|
||||
|
||||
@@ -461,6 +464,9 @@ impl NymNode {
|
||||
metrics: NymNodeMetrics::new(),
|
||||
verloc_stats: Default::default(),
|
||||
entry_gateway: GatewayTasksData::new(&config.gateway_tasks).await?,
|
||||
upgrade_mode_state: UpgradeModeState::new(
|
||||
config.gateway_tasks.upgrade_mode.attester_public_key,
|
||||
),
|
||||
service_providers: ServiceProvidersData::new(&config.service_providers)?,
|
||||
wireguard: Some(wireguard_data),
|
||||
config,
|
||||
@@ -625,7 +631,7 @@ impl NymNode {
|
||||
self.metrics.clone(),
|
||||
self.entry_gateway.mnemonic.clone(),
|
||||
Self::user_agent(),
|
||||
self.config.gateway_tasks.upgrade_mode.attester_public_key,
|
||||
self.upgrade_mode_state.clone(),
|
||||
self.shutdown_tracker().clone(),
|
||||
);
|
||||
|
||||
@@ -861,6 +867,12 @@ impl NymNode {
|
||||
self.active_sphinx_keys()?.clone(),
|
||||
self.metrics.clone(),
|
||||
self.verloc_stats.clone(),
|
||||
self.config
|
||||
.gateway_tasks
|
||||
.upgrade_mode
|
||||
.attestation_url
|
||||
.clone(),
|
||||
self.upgrade_mode_state.clone(),
|
||||
self.config.http.node_load_cache_ttl,
|
||||
);
|
||||
|
||||
@@ -1152,7 +1164,7 @@ impl NymNode {
|
||||
}
|
||||
|
||||
pub(crate) async fn run_minimal_mixnet_processing(mut self) -> Result<(), NymNodeError> {
|
||||
let noise_config = nym_noise::config::NoiseConfig::new(
|
||||
let noise_config = NoiseConfig::new(
|
||||
self.x25519_noise_keys.clone(),
|
||||
NoiseNetworkView::new_empty(),
|
||||
self.config.mixnet.debug.initial_connection_timeout,
|
||||
|
||||
Reference in New Issue
Block a user