Skip to content

Commit

Permalink
feat: provide node-manager command
Browse files Browse the repository at this point in the history
BREAKING CHANGE: the new settings file will have additional entries for keeping track of the
safenode-manager installation. Previously serialised settings files will be incompatible with this
change. Users will need to clear their previous settings file when they upgrade.

This will install the node manager alongside the other binaries. After the `sn-releases` crate was
extended for the new release type, adding the new command was quite straight forward, since it's
just the installation of another binary.

At some point later we may need to extend this installation to also distribute the RPC client, which
may be required for the node manager if we're going to use it in service shutdown commands. For now
though, it's just distributing the `safenode-manager` binary.
  • Loading branch information
jacderida committed Dec 14, 2023
1 parent f79bd4b commit dfd8bcb
Show file tree
Hide file tree
Showing 6 changed files with 190 additions and 12 deletions.
42 changes: 42 additions & 0 deletions .github/workflows/pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ env:
RUSTFLAGS: "-D warnings"
CLIENT_VERSION: 0.77.27
NODE_VERSION: 0.83.25
NODE_MANAGER_VERSION: 0.1.8
TESTNET_VERSION: 0.1.29

jobs:
Expand Down Expand Up @@ -140,6 +141,7 @@ jobs:
run: |
cargo run -- client --version $env:CLIENT_VERSION
cargo run -- node --version $env:NODE_VERSION
cargo run -- node-manager --version $env:NODE_MANAGER_VERSION
cargo run -- testnet --version $env:TESTNET_VERSION
- name: Check if binaries are available in new shell session
shell: pwsh
Expand All @@ -152,6 +154,10 @@ jobs:
Write-Host "safenode.exe does not exist"
exit 1
}
if (!(Test-Path "$env:USERPROFILE\safe\safenode-manager.exe")) {
Write-Host "safenode-manager.exe does not exist"
exit 1
}
if (!(Test-Path "$env:USERPROFILE\safe\testnet.exe")) {
Write-Host "testnet.exe does not exist"
exit 1
Expand Down Expand Up @@ -185,6 +191,18 @@ jobs:
exit 1
}
$output = & "${env:USERPROFILE}\safe\safenode-manager.exe" --version
$version = $output | Select-String -Pattern "sn-node-manager (\d+\.\d+\.\d+)"
$versionNumber = $version.Matches.Groups[1].Value
if ($versionNumber -eq "$env:NODE_MANAGER_VERSION") {
Write-Host "The correct version of safenode-manager has been installed"
} else {
Write-Host "The correct version of safenode-manager has not been installed"
Write-Host "We expected version $env:NODE_MANAGER_VERSION"
Write-Host "The downloaded binary has $versionNumber"
exit 1
}
$output = & "${env:USERPROFILE}\safe\testnet.exe" --version
$version = $output | Select-String -Pattern "testnet (\d+\.\d+\.\d+)"
$versionNumber = $version.Matches.Groups[1].Value
Expand Down Expand Up @@ -213,6 +231,7 @@ jobs:
run: |
cargo run -- client --version $CLIENT_VERSION
cargo run -- node --version $NODE_VERSION
cargo run -- node-manager --version $NODE_MANAGER_VERSION
cargo run -- testnet --version $TESTNET_VERSION
- name: Check if binaries are available in new shell session
shell: bash
Expand All @@ -228,6 +247,7 @@ jobs:
[[ -f "$HOME/.local/bin/safe" ]] || { echo "safe not in expected location"; exit 1; }
[[ -f "$HOME/.local/bin/safenode" ]] || { echo "safenode not in expected location"; exit 1; }
[[ -f "$HOME/.local/bin/safenode-manager" ]] || { echo "safenode-manager not in expected location"; exit 1; }
[[ -f "$HOME/.local/bin/testnet" ]] || { echo "testnet not in expected location"; exit 1; }
version=$(safe --version | awk '{ print $2 }')
Expand All @@ -250,6 +270,16 @@ jobs:
exit 1
fi
version=$(safenode-manager --version | awk '{ print $2 }')
if [[ "$version" == "$NODE_MANAGER_VERSION" ]]; then
echo "The correct version of safenode-manager has been installed"
else
echo "The correct version of safenode-manager has not been installed"
echo "We expected $NODE_MANAGER_VERSION"
echo "The downloaded binary has $version"
exit 1
fi
version=$(testnet --version | awk '{ print $2 }')
if [[ "$version" == "$TESTNET_VERSION" ]]; then
echo "The correct version of testnet has been installed"
Expand All @@ -275,6 +305,7 @@ jobs:
run: |
cargo run -- client --version $CLIENT_VERSION
cargo run -- node --version $NODE_VERSION
cargo run -- node-manager --version $NODE_MANAGER_VERSION
cargo run -- testnet --version $TESTNET_VERSION
- name: Check if binaries are available in new shell session
run: |
Expand All @@ -283,6 +314,7 @@ jobs:
[[ -f "$HOME/.local/bin/safe" ]] || { echo "safe not in expected location"; exit 1; }
[[ -f "$HOME/.local/bin/safenode" ]] || { echo "safenode not in expected location"; exit 1; }
[[ -f "$HOME/.local/bin/safenode-manager" ]] || { echo "safenode-manager not in expected location"; exit 1; }
[[ -f "$HOME/.local/bin/testnet" ]] || { echo "testnet not in expected location"; exit 1; }
version=$(safe --version | awk '{ print $2 }')
Expand All @@ -305,6 +337,16 @@ jobs:
exit 1
fi
version=$(safenode-manager --version | awk '{ print $2 }')
if [[ "$version" == "$NODE_MANAGER_VERSION" ]]; then
echo "The correct version of safenode-manager has been installed"
else
echo "The correct version of safenode-manager has not been installed"
echo "We expected $NODE_MANAGER_VERSION"
echo "The downloaded binary has $version"
exit 1
fi
version=$(testnet --version | awk '{ print $2 }')
if [[ "$version" == "$TESTNET_VERSION" ]]; then
echo "The correct version of testnet has been installed"
Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ semver = "1.0.4"
serde = "1.0"
serde_derive = "1.0"
serde_json = "1.0"
sn-releases = { git = "https://github.com/jacderida/sn-releases", branch = "custom-url" }
sn-releases = "0.1.5"
tempfile = "3.8.1"
textwrap = "0.16.0"
tokio = { version = "1.26", features = ["full"] }
Expand Down
4 changes: 4 additions & 0 deletions src/cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,10 @@ async fn do_install_binary(
settings.safenode_path = bin_path;
settings.safenode_version = installed_version;
}
AssetType::NodeManager => {
settings.safenode_manager_path = bin_path;
settings.safenode_manager_version = installed_version;
}
AssetType::Testnet => {
settings.testnet_path = bin_path;
settings.testnet_version = installed_version;
Expand Down
59 changes: 48 additions & 11 deletions src/install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,18 +49,25 @@ const SET_PATH_FILE_CONTENT: &str = indoc! {r#"
pub enum AssetType {
Client,
Node,
NodeManager,
Testnet,
}

impl AssetType {
pub fn variants() -> Vec<AssetType> {
vec![AssetType::Client, AssetType::Node, AssetType::Testnet]
vec![
AssetType::Client,
AssetType::Node,
AssetType::NodeManager,
AssetType::Testnet,
]
}

pub fn get_release_type(&self) -> ReleaseType {
match self {
AssetType::Client => ReleaseType::Safe,
AssetType::Node => ReleaseType::Safenode,
AssetType::NodeManager => ReleaseType::SafenodeManager,
AssetType::Testnet => ReleaseType::Testnet,
}
}
Expand All @@ -71,6 +78,7 @@ impl std::fmt::Display for AssetType {
match *self {
AssetType::Client => write!(f, "safe"),
AssetType::Node => write!(f, "safenode"),
AssetType::NodeManager => write!(f, "safenode-manager"),
AssetType::Testnet => write!(f, "testnet"),
}
}
Expand All @@ -82,6 +90,8 @@ pub struct Settings {
pub safe_version: String,
pub safenode_path: PathBuf,
pub safenode_version: String,
pub safenode_manager_path: PathBuf,
pub safenode_manager_version: String,
pub testnet_path: PathBuf,
pub testnet_version: String,
}
Expand All @@ -96,6 +106,8 @@ impl Settings {
safe_version: String::new(),
safenode_path: PathBuf::new(),
safenode_version: String::new(),
safenode_manager_path: PathBuf::new(),
safenode_manager_version: String::new(),
testnet_path: PathBuf::new(),
testnet_version: String::new(),
})
Expand All @@ -105,6 +117,8 @@ impl Settings {
safe_version: String::new(),
safenode_path: PathBuf::new(),
safenode_version: String::new(),
safenode_manager_path: PathBuf::new(),
safenode_manager_version: String::new(),
testnet_path: PathBuf::new(),
testnet_version: String::new(),
}
Expand All @@ -116,6 +130,7 @@ impl Settings {
match asset_type {
AssetType::Client => self.safe_version.clone(),
AssetType::Node => self.safenode_version.clone(),
AssetType::NodeManager => self.safenode_manager_version.clone(),
AssetType::Testnet => self.testnet_version.clone(),
}
}
Expand All @@ -124,6 +139,7 @@ impl Settings {
match asset_type {
AssetType::Client => !self.safe_version.is_empty(),
AssetType::Node => !self.safenode_version.is_empty(),
AssetType::NodeManager => !self.safenode_manager_version.is_empty(),
AssetType::Testnet => !self.testnet_version.is_empty(),
}
}
Expand All @@ -132,6 +148,7 @@ impl Settings {
match asset_type {
AssetType::Client => self.safe_path.clone(),
AssetType::Node => self.safenode_path.clone(),
AssetType::NodeManager => self.safenode_manager_path.clone(),
AssetType::Testnet => self.testnet_path.clone(),
}
}
Expand Down Expand Up @@ -341,6 +358,7 @@ fn get_bin_name(asset_type: &AssetType) -> String {
let mut bin_name = match asset_type {
AssetType::Client => "safe".to_string(),
AssetType::Node => "safenode".to_string(),
AssetType::NodeManager => "safenode-manager".to_string(),
AssetType::Testnet => "testnet".to_string(),
};
if OS == "windows" {
Expand Down Expand Up @@ -374,9 +392,6 @@ mod test {
};
#[cfg(unix)]
use std::os::unix::fs::PermissionsExt;
#[cfg(windows)]
use std::path::PathBuf;
#[cfg(unix)]
use std::path::{Path, PathBuf};

/// These may seem pointless, but they are useful for when the tests run on different
Expand Down Expand Up @@ -440,7 +455,7 @@ mod test {
mock_release_repo
.expect_download_release_from_s3()
.with(
eq(&ReleaseType::Safenode),
eq(&ReleaseType::Safe),
eq(latest_version),
always(), // Varies per platform
eq(&ArchiveType::TarGz),
Expand Down Expand Up @@ -518,7 +533,7 @@ mod test {
mock_release_repo
.expect_download_release_from_s3()
.with(
eq(&ReleaseType::Safenode),
eq(&ReleaseType::Safe),
eq(latest_version),
always(), // Varies per platform
eq(&ArchiveType::TarGz),
Expand Down Expand Up @@ -580,7 +595,7 @@ mod test {
mock_release_repo
.expect_download_release_from_s3()
.with(
eq(&ReleaseType::Safenode),
eq(&ReleaseType::Safe),
eq(specific_version),
always(), // Varies per platform
eq(&ArchiveType::TarGz),
Expand Down Expand Up @@ -706,6 +721,8 @@ mod test {
safe_bin_file.write_binary(b"fake safe code")?;
let safenode_bin_file = tmp_data_path.child("safenode");
safenode_bin_file.write_binary(b"fake safenode code")?;
let safenode_manager_bin_file = tmp_data_path.child("safenode-manager");
safenode_manager_bin_file.write_binary(b"fake safenode-manager code")?;
let testnet_bin_file = tmp_data_path.child("testnet");
testnet_bin_file.write_binary(b"fake testnet code")?;

Expand All @@ -714,6 +731,8 @@ mod test {
safe_version: "v0.75.1".to_string(),
safenode_path: safenode_bin_file.to_path_buf(),
safenode_version: "v0.75.2".to_string(),
safenode_manager_path: safenode_manager_bin_file.to_path_buf(),
safenode_manager_version: "v0.1.8".to_string(),
testnet_path: testnet_bin_file.to_path_buf(),
testnet_version: "v0.75.3".to_string(),
};
Expand All @@ -726,6 +745,11 @@ mod test {
assert_eq!(settings.safe_version, "v0.75.1");
assert_eq!(settings.safenode_path, safenode_bin_file.to_path_buf());
assert_eq!(settings.safenode_version, "v0.75.2");
assert_eq!(
settings.safenode_manager_path,
safenode_manager_bin_file.to_path_buf()
);
assert_eq!(settings.safenode_manager_version, "v0.1.8");
assert_eq!(settings.testnet_path, testnet_bin_file.to_path_buf());
assert_eq!(settings.testnet_version, "v0.75.3");
Ok(())
Expand All @@ -744,6 +768,8 @@ mod test {
safe_bin_file.write_binary(b"fake safe code")?;
let safenode_bin_file = tmp_data_path.child("safenode");
safenode_bin_file.write_binary(b"fake safenode code")?;
let safenode_manager_bin_file = tmp_data_path.child("safenode-manager");
safenode_manager_bin_file.write_binary(b"fake safenode-manager code")?;
let testnet_bin_file = tmp_data_path.child("testnet");
testnet_bin_file.write_binary(b"fake testnet code")?;

Expand All @@ -752,6 +778,8 @@ mod test {
safe_version: "v0.75.1".to_string(),
safenode_path: safenode_bin_file.to_path_buf(),
safenode_version: "v0.75.2".to_string(),
safenode_manager_path: safenode_manager_bin_file.to_path_buf(),
safenode_manager_version: "v0.1.8".to_string(),
testnet_path: testnet_bin_file.to_path_buf(),
testnet_version: "v0.75.3".to_string(),
};
Expand All @@ -764,6 +792,11 @@ mod test {
assert_eq!(settings.safe_version, "v0.75.1");
assert_eq!(settings.safenode_path, safenode_bin_file.to_path_buf());
assert_eq!(settings.safenode_version, "v0.75.2");
assert_eq!(
settings.safenode_manager_path,
safenode_manager_bin_file.to_path_buf()
);
assert_eq!(settings.safenode_manager_version, "v0.1.8");
assert_eq!(settings.testnet_path, testnet_bin_file.to_path_buf());
assert_eq!(settings.testnet_version, "v0.75.3");
Ok(())
Expand All @@ -778,13 +811,12 @@ mod test {
{
"safe_path": "/home/chris/.local/safe",
"safe_version": "v0.75.1",
"safe_is_elevated_install": false,
"safenode_path": "/home/chris/.local/bin/safenode",
"safenode_version": "v0.75.2",
"safenode_is_elevated_install": false,
"safenode_manager_path": "/home/chris/.local/bin/safenode-manager",
"safenode_manager_version": "v0.1.8",
"testnet_path": "/home/chris/.local/bin/testnet",
"testnet_version": "v0.75.3",
"testnet_is_elevated_install": false
"testnet_version": "v0.75.3"
}
"#,
)?;
Expand All @@ -803,6 +835,11 @@ mod test {
assert_eq!(settings.safe_version, "v0.75.1");
assert_eq!(settings.safenode_path, safenode_bin_file.to_path_buf());
assert_eq!(settings.safenode_version, "v0.75.2");
assert_eq!(
settings.safenode_manager_path,
PathBuf::from("/home/chris/.local/bin/safenode-manager")
);
assert_eq!(settings.safenode_manager_version, "v0.1.8");
assert_eq!(
settings.testnet_path,
PathBuf::from("/home/chris/.local/bin/testnet")
Expand Down

0 comments on commit dfd8bcb

Please sign in to comment.