added upstream url to config

This commit is contained in:
Jędrzej Stuczyński
2023-11-06 10:28:51 +00:00
parent aaeb6a7cbf
commit e853e8ffc1
6 changed files with 108 additions and 4 deletions
+1
View File
@@ -24,6 +24,7 @@ serde_json = { workspace = true }
tokio = { workspace = true, features = ["rt", "macros", "signal", "process", "sync"] }
thiserror = { workspace = true }
tracing = { workspace = true }
url = { workspace = true, features = ["serde"] }
async-file-watcher = { path = "../../common/async-file-watcher" }
nym-bin-common = { path = "../../common/bin-common", features = ["output_format", "basic_tracing"] }
+20
View File
@@ -12,6 +12,7 @@ use std::fs;
use std::path::{Path, PathBuf};
use std::time::Duration;
use tracing::{debug, error, info, trace, warn};
use url::Url;
#[derive(clap::Args, Debug)]
pub(crate) struct Args {
@@ -23,6 +24,12 @@ pub(crate) struct Args {
#[arg(long)]
id: Option<String>,
/// Sets the base url of the upstream source for obtaining upgrade information for the deaemon.
/// It will be used fo constructing the full url, i.e. $NYMVISOR_UPSTREAM_BASE_UPGRADE_URL/$DAEMON_NAME/upgrade-info.json
/// Can be overridden with $NYMVISOR_UPSTREAM_BASE_UPGRADE_URL environmental variable.
#[arg(long)]
upstream_base_upgrade_url: Option<Url>,
/// If enabled, this will disable `nymvisor` logs (but not the underlying process)
/// Can be overridden with $NYMVISOR_DISABLE_LOGS environmental variable.
#[arg(long)]
@@ -41,6 +48,13 @@ pub(crate) struct Args {
#[arg(long)]
daemon_home: Option<PathBuf>,
/// Override url to the upstream source for upgrade plans for this daeamon.
/// The Url has to point to an endpoint containing a valid [`UpgradeInfo`] json.
/// Note: if set this takes precedence over `upstream_base_upgrade_url`
/// Can be overridden with $DAEMON_ABSOLUTE_UPSTREAM_UPGRADE_URL environmental variable.
#[arg(long)]
daemon_absolute_upstream_upgrade_url: Option<Url>,
/// If set to true, this will enable auto-downloading of new binaries using the url provided in the `upgrade-info.json`
/// Can be overridden with $DAEMON_ALLOW_BINARIES_DOWNLOAD environmental variable.
#[arg(long)]
@@ -108,6 +122,9 @@ impl Args {
if let Some(nymvisor_id) = &self.id {
config.nymvisor.id = nymvisor_id.clone();
}
if let Some(upstream) = &self.upstream_base_upgrade_url {
config.nymvisor.debug.upstream_base_upgrade_url = upstream.clone()
}
if self.disable_nymvisor_logs {
config.nymvisor.debug.disable_logs = self.disable_nymvisor_logs;
}
@@ -118,6 +135,9 @@ impl Args {
if let Some(daemon_home) = &self.daemon_home {
config.daemon.home = daemon_home.clone();
}
if let Some(upstream) = &self.daemon_absolute_upstream_upgrade_url {
config.daemon.debug.absolute_upstream_upgrade_url = Some(upstream.clone())
}
if let Some(daemon_allow_binaries_download) = self.allow_download_upgrade_binaries {
config.daemon.debug.allow_binaries_download = daemon_allow_binaries_download;
}
+38 -4
View File
@@ -2,8 +2,7 @@
// SPDX-License-Identifier: Apache-2.0
use crate::config::template::CONFIG_TEMPLATE;
use crate::env::Env;
use nym_config::serde_helpers::de_maybe_path;
use nym_config::serde_helpers::de_maybe_stringified;
use nym_config::{
must_get_home, read_config_from_toml_file, save_formatted_config_to_file, NymConfigTemplate,
DEFAULT_CONFIG_DIR, DEFAULT_CONFIG_FILENAME, DEFAULT_DATA_DIR, NYM_DIR,
@@ -14,6 +13,7 @@ use std::io;
use std::path::{Path, PathBuf};
use std::time::Duration;
use tracing::{debug, warn};
use url::Url;
mod template;
@@ -22,6 +22,9 @@ pub(crate) const DEFAULT_STARTUP_PERIOD: Duration = Duration::from_secs(120);
pub(crate) const DEFAULT_MAX_STARTUP_FAILURES: usize = 10;
pub(crate) const DEFAULT_SHUTDOWN_GRACE_PERIOD: Duration = Duration::from_secs(10);
pub(crate) const DEFAULT_BASE_UPSTREAM_UPGRADE_INFO_SOURCE: &str =
"https://nymtech.net/.wellknown/";
pub(crate) const UPGRADE_PLAN_FILENAME: &str = "upgrade-plan.json";
pub(crate) const UPGRADE_INFO_FILENAME: &str = "upgrade-info.json";
pub(crate) const NYMVISOR_DIR: &str = "nymvisor";
@@ -261,6 +264,17 @@ impl Config {
pub fn upgrade_plan_filepath(&self) -> PathBuf {
self.upgrade_data_dir().join(UPGRADE_PLAN_FILENAME)
}
pub fn upstream_upgrade_url(&self) -> Url {
if let Some(absolute_url) = &self.daemon.debug.absolute_upstream_upgrade_url {
absolute_url.clone()
} else {
let mut base = self.nymvisor.debug.upstream_base_upgrade_url.clone();
base.set_path(&*format!("{}/{UPGRADE_INFO_FILENAME}", self.daemon.name));
base
}
}
}
#[derive(Debug, Deserialize, PartialEq, Serialize)]
@@ -278,6 +292,12 @@ pub struct Nymvisor {
#[derive(Debug, Deserialize, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct NymvisorDebug {
/// Sets the base url of the upstream source for obtaining upgrade information for the deaemon.
/// default: "https://nymtech.net/.wellknown/"
/// It will be used fo constructing the full url, i.e. $NYMVISOR_UPSTREAM_BASE_UPGRADE_URL/$DAEMON_NAME/upgrade-info.json
/// Can be overridden with $NYMVISOR_UPSTREAM_BASE_UPGRADE_URL environmental variable.
pub upstream_base_upgrade_url: Url,
/// If set to true, this will disable `nymvisor` logs (but not the underlying process)
/// default: false
/// Can be overridden with $NYMVISOR_DISABLE_LOGS environmental variable.
@@ -286,7 +306,7 @@ pub struct NymvisorDebug {
/// Set custom directory for upgrade data - binaries and upgrade plans.
/// If not set, the global nymvisors' data directory will be used instead.
/// Can be overridden with $NYMVISOR_UPGRADE_DATA_DIRECTORY environmental variable.
#[serde(deserialize_with = "de_maybe_path")]
#[serde(deserialize_with = "de_maybe_stringified")]
pub upgrade_data_directory: Option<PathBuf>,
}
@@ -294,6 +314,11 @@ pub struct NymvisorDebug {
impl Default for NymvisorDebug {
fn default() -> Self {
NymvisorDebug {
// this expect is fine as we're parsing a constant, hardcoded value that should always be valid
#[allow(clippy::expect_used)]
upstream_base_upgrade_url: DEFAULT_BASE_UPSTREAM_UPGRADE_INFO_SOURCE
.parse()
.expect("default upstream url was malformed"),
disable_logs: false,
upgrade_data_directory: None,
}
@@ -321,6 +346,14 @@ pub struct Daemon {
#[derive(Debug, Deserialize, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct DaemonDebug {
/// Override url to the upstream source for upgrade plans for this daeamon.
/// The Url has to point to an endpoint containing a valid [`UpgradeInfo`] json.
/// Note: if set this takes precedence over .nymvisor.debug.upstream_base_upgrade_url
/// default: None
/// Can be overridden with $DAEMON_ABSOLUTE_UPSTREAM_UPGRADE_URL environmental variable.
#[serde(deserialize_with = "de_maybe_stringified")]
pub absolute_upstream_upgrade_url: Option<Url>,
/// If set to true, this will enable auto-downloading of new binaries using the url provided in the `upgrade-info.json`
/// default: true
/// Can be overridden with $DAEMON_ALLOW_BINARIES_DOWNLOAD environmental variable.
@@ -375,7 +408,7 @@ pub struct DaemonDebug {
/// Set custom backup directory for daemon data. If not set, the daemon's home directory will be used instead.
/// Can be overridden with $DAEMON_BACKUP_DATA_DIRECTORY environmental variable.
#[serde(deserialize_with = "de_maybe_path")]
#[serde(deserialize_with = "de_maybe_stringified")]
pub backup_data_directory: Option<PathBuf>,
/// If enabled, `nymvisor` will perform upgrades directly without performing any backups.
@@ -387,6 +420,7 @@ pub struct DaemonDebug {
impl Default for DaemonDebug {
fn default() -> Self {
DaemonDebug {
absolute_upstream_upgrade_url: None,
allow_binaries_download: true,
enforce_download_checksum: true,
restart_after_upgrade: true,
+13
View File
@@ -14,6 +14,12 @@ id = '{{ nymvisor.id }}'
##### further optional configuration nymvisor options #####
# Sets the base url of the upstream source for obtaining upgrade information for the deaemon.
# default: "https://nymtech.net/.wellknown/"
# It will be used fo constructing the full url, i.e. $NYMVISOR_UPSTREAM_BASE_UPGRADE_URL/$DAEMON_NAME/upgrade-info.json
# Can be overridden with $NYMVISOR_UPSTREAM_BASE_UPGRADE_URL environmental variable.
upstream_base_upgrade_url = '{{ nymvisor.upstream_base_upgrade_url }}'
# If set to true, this will disable `nymvisor` logs (but not the underlying process)
# default: false
# Can be overridden with $NYMVISOR_DISABLE_LOGS environmental variable.
@@ -40,6 +46,13 @@ home = '{{ daemon.home }}'
##### further optional configuration daemon options #####
# Override url to the upstream source for upgrade plans for this daeamon.
# The Url has to point to an endpoint containing a valid [`UpgradeInfo`] json.
# Note: if set this takes precedence over .nymvisor.debug.upstream_base_upgrade_url
# default: None
# Can be overridden with $DAEMON_ABSOLUTE_UPSTREAM_UPGRADE_URL environmental variable.
absolute_upstream_upgrade_url = '{{ daemon.absolute_upstream_upgrade_url }}'
# If set to true, this will enable auto-downloading of new binaries using the url provided in the `upgrade-info.json`
# default: true
# Can be overridden with $DAEMON_ALLOW_BINARIES_DOWNLOAD environmental variable.
+28
View File
@@ -6,6 +6,7 @@ use crate::error::NymvisorError;
use std::env::VarError;
use std::path::PathBuf;
use std::time::Duration;
use url::Url;
const TRUTHY_BOOLS: &[&str] = &["true", "t", "1"];
const FALSY_BOOLS: &[&str] = &["false", "f", "0"];
@@ -13,11 +14,13 @@ const FALSY_BOOLS: &[&str] = &["false", "f", "0"];
pub mod vars {
pub const NYMVISOR_ID: &str = "NYMVISOR_ID";
pub const NYMVISOR_CONFIG_PATH: &str = "NYMVISOR_CONFIG_PATH";
pub const NYMVISOR_UPSTREAM_BASE_UPGRADE_URL: &str = "NYMVISOR_UPSTREAM_BASE_UPGRADE_URL";
pub const NYMVISOR_DISABLE_LOGS: &str = "NYMVISOR_DISABLE_LOGS";
pub const NYMVISOR_UPGRADE_DATA_DIRECTORY: &str = "NYMVISOR_UPGRADE_DATA_DIRECTORY";
pub const DAEMON_NAME: &str = "DAEMON_NAME";
pub const DAEMON_HOME: &str = "DAEMON_HOME";
pub const DAEMON_ABSOLUTE_UPSTREAM_UPGRADE_URL: &str = "DAEMON_ABSOLUTE_UPSTREAM_UPGRADE_URL";
pub const DAEMON_ALLOW_BINARIES_DOWNLOAD: &str = "DAEMON_ALLOW_BINARIES_DOWNLOAD";
pub const DAEMON_ENFORCE_DOWNLOAD_CHECKSUM: &str = "DAEMON_ENFORCE_DOWNLOAD_CHECKSUM";
pub const DAEMON_RESTART_AFTER_UPGRADE: &str = "DAEMON_RESTART_AFTER_UPGRADE";
@@ -41,11 +44,13 @@ pub(crate) fn setup_env(config_env_file: &Option<PathBuf>) -> Result<(), Nymviso
pub(crate) struct Env {
pub(crate) nymvisor_id: Option<String>,
pub(crate) nymvisor_config_path: Option<PathBuf>,
pub(crate) nymvisor_upstream_base_upgrade_url: Option<Url>,
pub(crate) nymvisor_disable_logs: Option<bool>,
pub(crate) nymvisor_upgrade_data_directory: Option<PathBuf>,
pub(crate) daemon_name: Option<String>,
pub(crate) daemon_home: Option<PathBuf>,
pub(crate) daemon_absolute_upstream_upgrade_url: Option<Url>,
pub(crate) daemon_allow_binaries_download: Option<bool>,
pub(crate) daemon_enforce_download_checksum: Option<bool>,
pub(crate) daemon_restart_after_upgrade: Option<bool>,
@@ -63,6 +68,9 @@ impl Env {
if let Some(nymvisor_id) = &self.nymvisor_id {
config.nymvisor.id = nymvisor_id.clone();
}
if let Some(upstream) = &self.nymvisor_upstream_base_upgrade_url {
config.nymvisor.debug.upstream_base_upgrade_url = upstream.clone()
}
if let Some(nymvisor_disable_logs) = self.nymvisor_disable_logs {
config.nymvisor.debug.disable_logs = nymvisor_disable_logs;
}
@@ -76,6 +84,9 @@ impl Env {
if let Some(daemon_home) = &self.daemon_home {
config.daemon.home = daemon_home.clone();
}
if let Some(upstream) = &self.daemon_absolute_upstream_upgrade_url {
config.daemon.debug.absolute_upstream_upgrade_url = Some(upstream.clone())
}
if let Some(daemon_allow_binaries_download) = self.daemon_allow_binaries_download {
config.daemon.debug.allow_binaries_download = daemon_allow_binaries_download;
}
@@ -167,6 +178,19 @@ fn read_pathbuf(var: &str) -> Result<Option<PathBuf>, NymvisorError> {
Ok(read_string(var)?.map(PathBuf::from))
}
fn read_url(var: &str) -> Result<Option<Url>, NymvisorError> {
read_string(var)?
.map(|raw| {
raw.parse()
.map_err(|source| NymvisorError::MalformedUrlEnvVariable {
variable: var.to_string(),
value: raw.to_string(),
source,
})
})
.transpose()
}
fn read_usize(var: &str) -> Result<Option<usize>, NymvisorError> {
read_string(var)?
.map(|raw| {
@@ -187,10 +211,14 @@ impl Env {
Ok(Env {
nymvisor_id: read_string(vars::NYMVISOR_ID)?,
nymvisor_config_path: read_pathbuf(vars::NYMVISOR_CONFIG_PATH)?,
nymvisor_upstream_base_upgrade_url: read_url(vars::NYMVISOR_UPSTREAM_BASE_UPGRADE_URL)?,
nymvisor_disable_logs: read_bool(vars::NYMVISOR_DISABLE_LOGS)?,
nymvisor_upgrade_data_directory: read_pathbuf(vars::NYMVISOR_UPGRADE_DATA_DIRECTORY)?,
daemon_name: read_string(vars::DAEMON_NAME)?,
daemon_home: read_pathbuf(vars::DAEMON_HOME)?,
daemon_absolute_upstream_upgrade_url: read_url(
vars::DAEMON_ABSOLUTE_UPSTREAM_UPGRADE_URL,
)?,
daemon_allow_binaries_download: read_bool(vars::DAEMON_ALLOW_BINARIES_DOWNLOAD)?,
daemon_enforce_download_checksum: read_bool(vars::DAEMON_ENFORCE_DOWNLOAD_CHECKSUM)?,
daemon_restart_after_upgrade: read_bool(vars::DAEMON_RESTART_AFTER_UPGRADE)?,
+8
View File
@@ -68,6 +68,14 @@ pub(crate) enum NymvisorError {
source: ParseIntError,
},
#[error("the value provided for environmental Url '{variable}': '{value}' is not a valid number: {source}")]
MalformedUrlEnvVariable {
variable: String,
value: String,
#[source]
source: url::ParseError,
},
#[error("failed to copy daemon binary from '{}' to '{}': {source}", source_path.display(), target_path.display())]
DaemonBinaryCopyFailure {
source_path: PathBuf,