diff --git a/service-providers/network-requester/src/cli/init.rs b/service-providers/network-requester/src/cli/init.rs index 0c8057b7cd..ef9320b9a2 100644 --- a/service-providers/network-requester/src/cli/init.rs +++ b/service-providers/network-requester/src/cli/init.rs @@ -1,6 +1,7 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use crate::cli::try_upgrade_v1_1_13_config; use crate::{ cli::{override_config, OverrideConfig}, config::Config, @@ -93,6 +94,9 @@ pub(crate) async fn execute(args: &Init) -> Result<(), NetworkRequesterError> { let already_init = Config::default_config_file_path(id).exists(); if already_init { + // in case we're using old config, try to upgrade it + // (if we're using the current version, it's a no-op) + try_upgrade_v1_1_13_config(id)?; println!("Client \"{id}\" was already initialised before"); } diff --git a/service-providers/network-requester/src/cli/mod.rs b/service-providers/network-requester/src/cli/mod.rs index e65a3d642f..f7d287c4bb 100644 --- a/service-providers/network-requester/src/cli/mod.rs +++ b/service-providers/network-requester/src/cli/mod.rs @@ -2,9 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use clap::{CommandFactory, Parser, Subcommand}; +use log::info; use nym_bin_common::build_information::BinaryBuildInformation; use nym_bin_common::completions::{fig_generate, ArgShell}; +use nym_config::NymConfig; +use crate::config::old_config_v1_1_13::OldConfigV1_1_13; use crate::{ config::{BaseConfig, Config}, error::NetworkRequesterError, @@ -94,6 +97,20 @@ pub(crate) async fn execute(args: Cli) -> Result<(), NetworkRequesterError> { Ok(()) } +fn try_upgrade_v1_1_13_config(id: &str) -> std::io::Result<()> { + // explicitly load it as v1.1.13 (which is incompatible with the current, i.e. 1.1.14+) + let Ok(old_config) = OldConfigV1_1_13::load_from_file(id) else { + // if we failed to load it, there might have been nothing to upgrade + // or maybe it was an even older file. in either way. just ignore it and carry on with our day + return Ok(()); + }; + info!("It seems the client is using <= v1.1.13 config template."); + info!("It is going to get updated to the current specification."); + + let updated: Config = old_config.into(); + updated.save_to_file(None) +} + #[cfg(test)] mod tests { use super::*; diff --git a/service-providers/network-requester/src/cli/run.rs b/service-providers/network-requester/src/cli/run.rs index b52d804895..a0886720f1 100644 --- a/service-providers/network-requester/src/cli/run.rs +++ b/service-providers/network-requester/src/cli/run.rs @@ -1,6 +1,7 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use crate::cli::try_upgrade_v1_1_13_config; use crate::{ cli::{override_config, OverrideConfig}, config::Config, @@ -109,6 +110,10 @@ pub(crate) async fn execute(args: &Run) -> Result<(), NetworkRequesterError> { let id = &args.id; + // in case we're using old config, try to upgrade it + // (if we're using the current version, it's a no-op) + try_upgrade_v1_1_13_config(id)?; + let mut config = match Config::load_from_file(id) { Ok(cfg) => cfg, Err(err) => { diff --git a/service-providers/network-requester/src/config/mod.rs b/service-providers/network-requester/src/config/mod.rs index 24d34455e3..61259f4609 100644 --- a/service-providers/network-requester/src/config/mod.rs +++ b/service-providers/network-requester/src/config/mod.rs @@ -13,6 +13,7 @@ pub use client_core::config::Config as BaseConfig; pub use client_core::config::MISSING_VALUE; pub use client_core::config::{DebugConfig, GatewayEndpointConfig}; +pub mod old_config_v1_1_13; mod template; #[derive(Debug, Default, Deserialize, PartialEq, Serialize)] diff --git a/service-providers/network-requester/src/config/old_config_v1_1_13.rs b/service-providers/network-requester/src/config/old_config_v1_1_13.rs new file mode 100644 index 0000000000..c6c7cb93ee --- /dev/null +++ b/service-providers/network-requester/src/config/old_config_v1_1_13.rs @@ -0,0 +1,59 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::config::Config; +use client_core::config::old_config_v1_1_13::OldConfigV1_1_13 as OldBaseConfigV1_1_13; +use nym_config::NymConfig; +use serde::{Deserialize, Serialize}; +use std::path::PathBuf; + +#[derive(Debug, Default, Deserialize, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct OldConfigV1_1_13 { + #[serde(flatten)] + base: OldBaseConfigV1_1_13, +} + +impl NymConfig for OldConfigV1_1_13 { + fn template() -> &'static str { + // not intended to be used + unimplemented!() + } + + // TODO: merge base dir with `HostStore`. + fn default_root_directory() -> PathBuf { + dirs::home_dir() + .expect("Failed to evaluate $HOME value") + .join(".nym") + .join("service-providers") + .join("network-requester") + } + + fn try_default_root_directory() -> Option { + dirs::home_dir().map(|path| path.join(".nym").join("clients")) + } + + fn root_directory(&self) -> PathBuf { + self.base.client.nym_root_directory.clone() + } + + fn config_directory(&self) -> PathBuf { + self.root_directory() + .join(&self.base.client.id) + .join("config") + } + + fn data_directory(&self) -> PathBuf { + self.root_directory() + .join(&self.base.client.id) + .join("data") + } +} + +impl From for Config { + fn from(value: OldConfigV1_1_13) -> Self { + Config { + base: value.base.into(), + } + } +} diff --git a/service-providers/network-requester/src/config/template.rs b/service-providers/network-requester/src/config/template.rs index 395b8d7049..bc85b76e90 100644 --- a/service-providers/network-requester/src/config/template.rs +++ b/service-providers/network-requester/src/config/template.rs @@ -90,10 +90,15 @@ gateway_listener = '{{ client.gateway_endpoint.gateway_listener }}' [debug] -average_packet_delay = '{{ debug.average_packet_delay }}' -average_ack_delay = '{{ debug.average_ack_delay }}' -loop_cover_traffic_average_delay = '{{ debug.loop_cover_traffic_average_delay }}' -message_sending_average_delay = '{{ debug.message_sending_average_delay }}' +[debug.traffic] +average_packet_delay = '{{ debug.traffic.average_packet_delay }}' +message_sending_average_delay = '{{ debug.traffic.message_sending_average_delay }}' + +[debug.acknowledgements] +average_ack_delay = '{{ debug.acknowledgements.average_ack_delay }}' + +[debug.cover_traffic] +loop_cover_traffic_average_delay = '{{ debug.cover_traffic.loop_cover_traffic_average_delay }}' "# }