Skip to content

Commit dfd8bcb

Browse files
committed
feat: provide node-manager command
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.
1 parent f79bd4b commit dfd8bcb

File tree

6 files changed

+190
-12
lines changed

6 files changed

+190
-12
lines changed

.github/workflows/pr.yml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ env:
1212
RUSTFLAGS: "-D warnings"
1313
CLIENT_VERSION: 0.77.27
1414
NODE_VERSION: 0.83.25
15+
NODE_MANAGER_VERSION: 0.1.8
1516
TESTNET_VERSION: 0.1.29
1617

1718
jobs:
@@ -140,6 +141,7 @@ jobs:
140141
run: |
141142
cargo run -- client --version $env:CLIENT_VERSION
142143
cargo run -- node --version $env:NODE_VERSION
144+
cargo run -- node-manager --version $env:NODE_MANAGER_VERSION
143145
cargo run -- testnet --version $env:TESTNET_VERSION
144146
- name: Check if binaries are available in new shell session
145147
shell: pwsh
@@ -152,6 +154,10 @@ jobs:
152154
Write-Host "safenode.exe does not exist"
153155
exit 1
154156
}
157+
if (!(Test-Path "$env:USERPROFILE\safe\safenode-manager.exe")) {
158+
Write-Host "safenode-manager.exe does not exist"
159+
exit 1
160+
}
155161
if (!(Test-Path "$env:USERPROFILE\safe\testnet.exe")) {
156162
Write-Host "testnet.exe does not exist"
157163
exit 1
@@ -185,6 +191,18 @@ jobs:
185191
exit 1
186192
}
187193
194+
$output = & "${env:USERPROFILE}\safe\safenode-manager.exe" --version
195+
$version = $output | Select-String -Pattern "sn-node-manager (\d+\.\d+\.\d+)"
196+
$versionNumber = $version.Matches.Groups[1].Value
197+
if ($versionNumber -eq "$env:NODE_MANAGER_VERSION") {
198+
Write-Host "The correct version of safenode-manager has been installed"
199+
} else {
200+
Write-Host "The correct version of safenode-manager has not been installed"
201+
Write-Host "We expected version $env:NODE_MANAGER_VERSION"
202+
Write-Host "The downloaded binary has $versionNumber"
203+
exit 1
204+
}
205+
188206
$output = & "${env:USERPROFILE}\safe\testnet.exe" --version
189207
$version = $output | Select-String -Pattern "testnet (\d+\.\d+\.\d+)"
190208
$versionNumber = $version.Matches.Groups[1].Value
@@ -213,6 +231,7 @@ jobs:
213231
run: |
214232
cargo run -- client --version $CLIENT_VERSION
215233
cargo run -- node --version $NODE_VERSION
234+
cargo run -- node-manager --version $NODE_MANAGER_VERSION
216235
cargo run -- testnet --version $TESTNET_VERSION
217236
- name: Check if binaries are available in new shell session
218237
shell: bash
@@ -228,6 +247,7 @@ jobs:
228247
229248
[[ -f "$HOME/.local/bin/safe" ]] || { echo "safe not in expected location"; exit 1; }
230249
[[ -f "$HOME/.local/bin/safenode" ]] || { echo "safenode not in expected location"; exit 1; }
250+
[[ -f "$HOME/.local/bin/safenode-manager" ]] || { echo "safenode-manager not in expected location"; exit 1; }
231251
[[ -f "$HOME/.local/bin/testnet" ]] || { echo "testnet not in expected location"; exit 1; }
232252
233253
version=$(safe --version | awk '{ print $2 }')
@@ -250,6 +270,16 @@ jobs:
250270
exit 1
251271
fi
252272
273+
version=$(safenode-manager --version | awk '{ print $2 }')
274+
if [[ "$version" == "$NODE_MANAGER_VERSION" ]]; then
275+
echo "The correct version of safenode-manager has been installed"
276+
else
277+
echo "The correct version of safenode-manager has not been installed"
278+
echo "We expected $NODE_MANAGER_VERSION"
279+
echo "The downloaded binary has $version"
280+
exit 1
281+
fi
282+
253283
version=$(testnet --version | awk '{ print $2 }')
254284
if [[ "$version" == "$TESTNET_VERSION" ]]; then
255285
echo "The correct version of testnet has been installed"
@@ -275,6 +305,7 @@ jobs:
275305
run: |
276306
cargo run -- client --version $CLIENT_VERSION
277307
cargo run -- node --version $NODE_VERSION
308+
cargo run -- node-manager --version $NODE_MANAGER_VERSION
278309
cargo run -- testnet --version $TESTNET_VERSION
279310
- name: Check if binaries are available in new shell session
280311
run: |
@@ -283,6 +314,7 @@ jobs:
283314
284315
[[ -f "$HOME/.local/bin/safe" ]] || { echo "safe not in expected location"; exit 1; }
285316
[[ -f "$HOME/.local/bin/safenode" ]] || { echo "safenode not in expected location"; exit 1; }
317+
[[ -f "$HOME/.local/bin/safenode-manager" ]] || { echo "safenode-manager not in expected location"; exit 1; }
286318
[[ -f "$HOME/.local/bin/testnet" ]] || { echo "testnet not in expected location"; exit 1; }
287319
288320
version=$(safe --version | awk '{ print $2 }')
@@ -305,6 +337,16 @@ jobs:
305337
exit 1
306338
fi
307339
340+
version=$(safenode-manager --version | awk '{ print $2 }')
341+
if [[ "$version" == "$NODE_MANAGER_VERSION" ]]; then
342+
echo "The correct version of safenode-manager has been installed"
343+
else
344+
echo "The correct version of safenode-manager has not been installed"
345+
echo "We expected $NODE_MANAGER_VERSION"
346+
echo "The downloaded binary has $version"
347+
exit 1
348+
fi
349+
308350
version=$(testnet --version | awk '{ print $2 }')
309351
if [[ "$version" == "$TESTNET_VERSION" ]]; then
310352
echo "The correct version of testnet has been installed"

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ semver = "1.0.4"
2525
serde = "1.0"
2626
serde_derive = "1.0"
2727
serde_json = "1.0"
28-
sn-releases = { git = "https://github.com/jacderida/sn-releases", branch = "custom-url" }
28+
sn-releases = "0.1.5"
2929
tempfile = "3.8.1"
3030
textwrap = "0.16.0"
3131
tokio = { version = "1.26", features = ["full"] }

src/cmd.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,10 @@ async fn do_install_binary(
172172
settings.safenode_path = bin_path;
173173
settings.safenode_version = installed_version;
174174
}
175+
AssetType::NodeManager => {
176+
settings.safenode_manager_path = bin_path;
177+
settings.safenode_manager_version = installed_version;
178+
}
175179
AssetType::Testnet => {
176180
settings.testnet_path = bin_path;
177181
settings.testnet_version = installed_version;

src/install.rs

Lines changed: 48 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,25 @@ const SET_PATH_FILE_CONTENT: &str = indoc! {r#"
4949
pub enum AssetType {
5050
Client,
5151
Node,
52+
NodeManager,
5253
Testnet,
5354
}
5455

5556
impl AssetType {
5657
pub fn variants() -> Vec<AssetType> {
57-
vec![AssetType::Client, AssetType::Node, AssetType::Testnet]
58+
vec![
59+
AssetType::Client,
60+
AssetType::Node,
61+
AssetType::NodeManager,
62+
AssetType::Testnet,
63+
]
5864
}
5965

6066
pub fn get_release_type(&self) -> ReleaseType {
6167
match self {
6268
AssetType::Client => ReleaseType::Safe,
6369
AssetType::Node => ReleaseType::Safenode,
70+
AssetType::NodeManager => ReleaseType::SafenodeManager,
6471
AssetType::Testnet => ReleaseType::Testnet,
6572
}
6673
}
@@ -71,6 +78,7 @@ impl std::fmt::Display for AssetType {
7178
match *self {
7279
AssetType::Client => write!(f, "safe"),
7380
AssetType::Node => write!(f, "safenode"),
81+
AssetType::NodeManager => write!(f, "safenode-manager"),
7482
AssetType::Testnet => write!(f, "testnet"),
7583
}
7684
}
@@ -82,6 +90,8 @@ pub struct Settings {
8290
pub safe_version: String,
8391
pub safenode_path: PathBuf,
8492
pub safenode_version: String,
93+
pub safenode_manager_path: PathBuf,
94+
pub safenode_manager_version: String,
8595
pub testnet_path: PathBuf,
8696
pub testnet_version: String,
8797
}
@@ -96,6 +106,8 @@ impl Settings {
96106
safe_version: String::new(),
97107
safenode_path: PathBuf::new(),
98108
safenode_version: String::new(),
109+
safenode_manager_path: PathBuf::new(),
110+
safenode_manager_version: String::new(),
99111
testnet_path: PathBuf::new(),
100112
testnet_version: String::new(),
101113
})
@@ -105,6 +117,8 @@ impl Settings {
105117
safe_version: String::new(),
106118
safenode_path: PathBuf::new(),
107119
safenode_version: String::new(),
120+
safenode_manager_path: PathBuf::new(),
121+
safenode_manager_version: String::new(),
108122
testnet_path: PathBuf::new(),
109123
testnet_version: String::new(),
110124
}
@@ -116,6 +130,7 @@ impl Settings {
116130
match asset_type {
117131
AssetType::Client => self.safe_version.clone(),
118132
AssetType::Node => self.safenode_version.clone(),
133+
AssetType::NodeManager => self.safenode_manager_version.clone(),
119134
AssetType::Testnet => self.testnet_version.clone(),
120135
}
121136
}
@@ -124,6 +139,7 @@ impl Settings {
124139
match asset_type {
125140
AssetType::Client => !self.safe_version.is_empty(),
126141
AssetType::Node => !self.safenode_version.is_empty(),
142+
AssetType::NodeManager => !self.safenode_manager_version.is_empty(),
127143
AssetType::Testnet => !self.testnet_version.is_empty(),
128144
}
129145
}
@@ -132,6 +148,7 @@ impl Settings {
132148
match asset_type {
133149
AssetType::Client => self.safe_path.clone(),
134150
AssetType::Node => self.safenode_path.clone(),
151+
AssetType::NodeManager => self.safenode_manager_path.clone(),
135152
AssetType::Testnet => self.testnet_path.clone(),
136153
}
137154
}
@@ -341,6 +358,7 @@ fn get_bin_name(asset_type: &AssetType) -> String {
341358
let mut bin_name = match asset_type {
342359
AssetType::Client => "safe".to_string(),
343360
AssetType::Node => "safenode".to_string(),
361+
AssetType::NodeManager => "safenode-manager".to_string(),
344362
AssetType::Testnet => "testnet".to_string(),
345363
};
346364
if OS == "windows" {
@@ -374,9 +392,6 @@ mod test {
374392
};
375393
#[cfg(unix)]
376394
use std::os::unix::fs::PermissionsExt;
377-
#[cfg(windows)]
378-
use std::path::PathBuf;
379-
#[cfg(unix)]
380395
use std::path::{Path, PathBuf};
381396

382397
/// These may seem pointless, but they are useful for when the tests run on different
@@ -440,7 +455,7 @@ mod test {
440455
mock_release_repo
441456
.expect_download_release_from_s3()
442457
.with(
443-
eq(&ReleaseType::Safenode),
458+
eq(&ReleaseType::Safe),
444459
eq(latest_version),
445460
always(), // Varies per platform
446461
eq(&ArchiveType::TarGz),
@@ -518,7 +533,7 @@ mod test {
518533
mock_release_repo
519534
.expect_download_release_from_s3()
520535
.with(
521-
eq(&ReleaseType::Safenode),
536+
eq(&ReleaseType::Safe),
522537
eq(latest_version),
523538
always(), // Varies per platform
524539
eq(&ArchiveType::TarGz),
@@ -580,7 +595,7 @@ mod test {
580595
mock_release_repo
581596
.expect_download_release_from_s3()
582597
.with(
583-
eq(&ReleaseType::Safenode),
598+
eq(&ReleaseType::Safe),
584599
eq(specific_version),
585600
always(), // Varies per platform
586601
eq(&ArchiveType::TarGz),
@@ -706,6 +721,8 @@ mod test {
706721
safe_bin_file.write_binary(b"fake safe code")?;
707722
let safenode_bin_file = tmp_data_path.child("safenode");
708723
safenode_bin_file.write_binary(b"fake safenode code")?;
724+
let safenode_manager_bin_file = tmp_data_path.child("safenode-manager");
725+
safenode_manager_bin_file.write_binary(b"fake safenode-manager code")?;
709726
let testnet_bin_file = tmp_data_path.child("testnet");
710727
testnet_bin_file.write_binary(b"fake testnet code")?;
711728

@@ -714,6 +731,8 @@ mod test {
714731
safe_version: "v0.75.1".to_string(),
715732
safenode_path: safenode_bin_file.to_path_buf(),
716733
safenode_version: "v0.75.2".to_string(),
734+
safenode_manager_path: safenode_manager_bin_file.to_path_buf(),
735+
safenode_manager_version: "v0.1.8".to_string(),
717736
testnet_path: testnet_bin_file.to_path_buf(),
718737
testnet_version: "v0.75.3".to_string(),
719738
};
@@ -726,6 +745,11 @@ mod test {
726745
assert_eq!(settings.safe_version, "v0.75.1");
727746
assert_eq!(settings.safenode_path, safenode_bin_file.to_path_buf());
728747
assert_eq!(settings.safenode_version, "v0.75.2");
748+
assert_eq!(
749+
settings.safenode_manager_path,
750+
safenode_manager_bin_file.to_path_buf()
751+
);
752+
assert_eq!(settings.safenode_manager_version, "v0.1.8");
729753
assert_eq!(settings.testnet_path, testnet_bin_file.to_path_buf());
730754
assert_eq!(settings.testnet_version, "v0.75.3");
731755
Ok(())
@@ -744,6 +768,8 @@ mod test {
744768
safe_bin_file.write_binary(b"fake safe code")?;
745769
let safenode_bin_file = tmp_data_path.child("safenode");
746770
safenode_bin_file.write_binary(b"fake safenode code")?;
771+
let safenode_manager_bin_file = tmp_data_path.child("safenode-manager");
772+
safenode_manager_bin_file.write_binary(b"fake safenode-manager code")?;
747773
let testnet_bin_file = tmp_data_path.child("testnet");
748774
testnet_bin_file.write_binary(b"fake testnet code")?;
749775

@@ -752,6 +778,8 @@ mod test {
752778
safe_version: "v0.75.1".to_string(),
753779
safenode_path: safenode_bin_file.to_path_buf(),
754780
safenode_version: "v0.75.2".to_string(),
781+
safenode_manager_path: safenode_manager_bin_file.to_path_buf(),
782+
safenode_manager_version: "v0.1.8".to_string(),
755783
testnet_path: testnet_bin_file.to_path_buf(),
756784
testnet_version: "v0.75.3".to_string(),
757785
};
@@ -764,6 +792,11 @@ mod test {
764792
assert_eq!(settings.safe_version, "v0.75.1");
765793
assert_eq!(settings.safenode_path, safenode_bin_file.to_path_buf());
766794
assert_eq!(settings.safenode_version, "v0.75.2");
795+
assert_eq!(
796+
settings.safenode_manager_path,
797+
safenode_manager_bin_file.to_path_buf()
798+
);
799+
assert_eq!(settings.safenode_manager_version, "v0.1.8");
767800
assert_eq!(settings.testnet_path, testnet_bin_file.to_path_buf());
768801
assert_eq!(settings.testnet_version, "v0.75.3");
769802
Ok(())
@@ -778,13 +811,12 @@ mod test {
778811
{
779812
"safe_path": "/home/chris/.local/safe",
780813
"safe_version": "v0.75.1",
781-
"safe_is_elevated_install": false,
782814
"safenode_path": "/home/chris/.local/bin/safenode",
783815
"safenode_version": "v0.75.2",
784-
"safenode_is_elevated_install": false,
816+
"safenode_manager_path": "/home/chris/.local/bin/safenode-manager",
817+
"safenode_manager_version": "v0.1.8",
785818
"testnet_path": "/home/chris/.local/bin/testnet",
786-
"testnet_version": "v0.75.3",
787-
"testnet_is_elevated_install": false
819+
"testnet_version": "v0.75.3"
788820
}
789821
"#,
790822
)?;
@@ -803,6 +835,11 @@ mod test {
803835
assert_eq!(settings.safe_version, "v0.75.1");
804836
assert_eq!(settings.safenode_path, safenode_bin_file.to_path_buf());
805837
assert_eq!(settings.safenode_version, "v0.75.2");
838+
assert_eq!(
839+
settings.safenode_manager_path,
840+
PathBuf::from("/home/chris/.local/bin/safenode-manager")
841+
);
842+
assert_eq!(settings.safenode_manager_version, "v0.1.8");
806843
assert_eq!(
807844
settings.testnet_path,
808845
PathBuf::from("/home/chris/.local/bin/testnet")

0 commit comments

Comments
 (0)