node: Populate address book with bootstrap nodes
As a starting point, we populate the address book (if empty) with some bootstrap nodes which are trusted. To prevent these nodes being connected to during tests (including e2e tests), we create a new constructor for `Config` that is used in tests. Note that a `cfg(test)` check is not enough given that e2e tests don't have that set.
This commit is contained in:
parent
5654f08841
commit
e888398519
|
|
@ -243,8 +243,8 @@ fn rad_node() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let bob = environment.node(Config::new(Alias::new("bob")));
|
let bob = environment.node(Config::test(Alias::new("bob")));
|
||||||
let working = tempfile::tempdir().unwrap();
|
let working = tempfile::tempdir().unwrap();
|
||||||
|
|
||||||
let alice = alice.spawn();
|
let alice = alice.spawn();
|
||||||
|
|
@ -411,7 +411,7 @@ fn rad_rm() {
|
||||||
#[test]
|
#[test]
|
||||||
fn rad_track() {
|
fn rad_track() {
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let working = tempfile::tempdir().unwrap();
|
let working = tempfile::tempdir().unwrap();
|
||||||
let alice = alice.spawn();
|
let alice = alice.spawn();
|
||||||
|
|
||||||
|
|
@ -429,8 +429,8 @@ fn rad_clone() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let mut alice = environment.node(Config::new(Alias::new("alice")));
|
let mut alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let bob = environment.node(Config::new(Alias::new("bob")));
|
let bob = environment.node(Config::test(Alias::new("bob")));
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
|
|
||||||
// Setup a test project.
|
// Setup a test project.
|
||||||
|
|
@ -451,9 +451,9 @@ fn rad_clone_all() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let mut alice = environment.node(Config::new(Alias::new("alice")));
|
let mut alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let bob = environment.node(Config::new(Alias::new("bob")));
|
let bob = environment.node(Config::test(Alias::new("bob")));
|
||||||
let eve = environment.node(Config::new(Alias::new("eve")));
|
let eve = environment.node(Config::test(Alias::new("eve")));
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
|
|
||||||
// Setup a test project.
|
// Setup a test project.
|
||||||
|
|
@ -490,7 +490,7 @@ fn rad_clone_all() {
|
||||||
#[test]
|
#[test]
|
||||||
fn rad_self() {
|
fn rad_self() {
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
|
|
||||||
test("examples/rad-self.md", working, Some(&alice.home), []).unwrap();
|
test("examples/rad-self.md", working, Some(&alice.home), []).unwrap();
|
||||||
|
|
@ -501,7 +501,7 @@ fn rad_clone_unknown() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
|
|
||||||
let alice = alice.spawn();
|
let alice = alice.spawn();
|
||||||
|
|
@ -520,8 +520,8 @@ fn rad_init_sync_and_clone() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let bob = environment.node(Config::new(Alias::new("bob")));
|
let bob = environment.node(Config::test(Alias::new("bob")));
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
|
|
||||||
let alice = alice.spawn();
|
let alice = alice.spawn();
|
||||||
|
|
@ -561,8 +561,8 @@ fn rad_init_sync_and_clone() {
|
||||||
fn rad_fetch() {
|
fn rad_fetch() {
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let bob = environment.node(Config::new(Alias::new("bob")));
|
let bob = environment.node(Config::test(Alias::new("bob")));
|
||||||
|
|
||||||
let mut alice = alice.spawn();
|
let mut alice = alice.spawn();
|
||||||
let bob = bob.spawn();
|
let bob = bob.spawn();
|
||||||
|
|
@ -595,8 +595,8 @@ fn rad_fetch() {
|
||||||
fn rad_fork() {
|
fn rad_fork() {
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let bob = environment.node(Config::new(Alias::new("bob")));
|
let bob = environment.node(Config::test(Alias::new("bob")));
|
||||||
|
|
||||||
let mut alice = alice.spawn();
|
let mut alice = alice.spawn();
|
||||||
let bob = bob.spawn();
|
let bob = bob.spawn();
|
||||||
|
|
@ -638,7 +638,7 @@ fn test_clone_without_seeds() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let mut alice = environment.node(Config::new(Alias::new("alice")));
|
let mut alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
let rid = alice.project("heartwood", "Radicle Heartwood Protocol & Stack");
|
let rid = alice.project("heartwood", "Radicle Heartwood Protocol & Stack");
|
||||||
let mut alice = alice.spawn();
|
let mut alice = alice.spawn();
|
||||||
|
|
@ -662,8 +662,8 @@ fn test_cob_replication() {
|
||||||
|
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let working = tempfile::tempdir().unwrap();
|
let working = tempfile::tempdir().unwrap();
|
||||||
let mut alice = environment.node(Config::new(Alias::new("alice")));
|
let mut alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let bob = environment.node(Config::new(Alias::new("bob")));
|
let bob = environment.node(Config::test(Alias::new("bob")));
|
||||||
|
|
||||||
let rid = alice.project("heartwood", "");
|
let rid = alice.project("heartwood", "");
|
||||||
|
|
||||||
|
|
@ -722,8 +722,8 @@ fn test_cob_replication() {
|
||||||
fn test_cob_deletion() {
|
fn test_cob_deletion() {
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let working = tempfile::tempdir().unwrap();
|
let working = tempfile::tempdir().unwrap();
|
||||||
let mut alice = environment.node(Config::new(Alias::new("alice")));
|
let mut alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let bob = environment.node(Config::new(Alias::new("bob")));
|
let bob = environment.node(Config::test(Alias::new("bob")));
|
||||||
|
|
||||||
let rid = alice.project("heartwood", "");
|
let rid = alice.project("heartwood", "");
|
||||||
|
|
||||||
|
|
@ -776,9 +776,9 @@ fn rad_sync() {
|
||||||
|
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let bob = environment.node(Config::new(Alias::new("bob")));
|
let bob = environment.node(Config::test(Alias::new("bob")));
|
||||||
let eve = environment.node(Config::new(Alias::new("eve")));
|
let eve = environment.node(Config::test(Alias::new("eve")));
|
||||||
let acme = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
|
let acme = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
|
||||||
|
|
||||||
fixtures::repository(working.join("acme"));
|
fixtures::repository(working.join("acme"));
|
||||||
|
|
@ -820,12 +820,12 @@ fn rad_sync() {
|
||||||
//
|
//
|
||||||
fn test_replication_via_seed() {
|
fn test_replication_via_seed() {
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let bob = environment.node(Config::new(Alias::new("bob")));
|
let bob = environment.node(Config::test(Alias::new("bob")));
|
||||||
let seed = environment.node(Config {
|
let seed = environment.node(Config {
|
||||||
policy: Policy::Track,
|
policy: Policy::Track,
|
||||||
scope: Scope::All,
|
scope: Scope::All,
|
||||||
..Config::new(Alias::new("seed"))
|
..Config::test(Alias::new("seed"))
|
||||||
});
|
});
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
let rid = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
|
let rid = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
|
||||||
|
|
@ -905,8 +905,8 @@ fn test_replication_via_seed() {
|
||||||
#[test]
|
#[test]
|
||||||
fn rad_remote() {
|
fn rad_remote() {
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let bob = environment.node(Config::new(Alias::new("bob")));
|
let bob = environment.node(Config::test(Alias::new("bob")));
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
let home = alice.home.clone();
|
let home = alice.home.clone();
|
||||||
let rid = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
|
let rid = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
|
||||||
|
|
@ -949,7 +949,7 @@ fn rad_merge_via_push() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
|
|
||||||
fixtures::repository(working.join("alice"));
|
fixtures::repository(working.join("alice"));
|
||||||
|
|
@ -976,7 +976,7 @@ fn rad_merge_via_push() {
|
||||||
#[test]
|
#[test]
|
||||||
fn rad_merge_after_update() {
|
fn rad_merge_after_update() {
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
|
|
||||||
fixtures::repository(working.join("alice"));
|
fixtures::repository(working.join("alice"));
|
||||||
|
|
@ -1005,8 +1005,8 @@ fn rad_patch_pull_update() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let bob = environment.node(Config::new(Alias::new("bob")));
|
let bob = environment.node(Config::test(Alias::new("bob")));
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
|
|
||||||
fixtures::repository(working.join("alice"));
|
fixtures::repository(working.join("alice"));
|
||||||
|
|
@ -1037,8 +1037,8 @@ fn framework_home() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let bob = environment.node(Config::new(Alias::new("bob")));
|
let bob = environment.node(Config::test(Alias::new("bob")));
|
||||||
|
|
||||||
formula(&environment.tmp(), "examples/framework/home.md")
|
formula(&environment.tmp(), "examples/framework/home.md")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
|
@ -1061,8 +1061,8 @@ fn git_push_and_pull() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let bob = environment.node(Config::new(Alias::new("bob")));
|
let bob = environment.node(Config::test(Alias::new("bob")));
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
|
|
||||||
fixtures::repository(working.join("alice"));
|
fixtures::repository(working.join("alice"));
|
||||||
|
|
@ -1113,8 +1113,8 @@ fn git_push_and_pull() {
|
||||||
#[test]
|
#[test]
|
||||||
fn rad_workflow() {
|
fn rad_workflow() {
|
||||||
let mut environment = Environment::new();
|
let mut environment = Environment::new();
|
||||||
let alice = environment.node(Config::new(Alias::new("alice")));
|
let alice = environment.node(Config::test(Alias::new("alice")));
|
||||||
let bob = environment.node(Config::new(Alias::new("bob")));
|
let bob = environment.node(Config::test(Alias::new("bob")));
|
||||||
let working = environment.tmp().join("working");
|
let working = environment.tmp().join("working");
|
||||||
|
|
||||||
fixtures::repository(working.join("alice"));
|
fixtures::repository(working.join("alice"));
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,9 @@ use reactor::Reactor;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
use radicle::git;
|
use radicle::git;
|
||||||
|
use radicle::node;
|
||||||
use radicle::node::address;
|
use radicle::node::address;
|
||||||
|
use radicle::node::address::Store as _;
|
||||||
use radicle::node::Handle as _;
|
use radicle::node::Handle as _;
|
||||||
use radicle::node::{ADDRESS_DB_FILE, NODE_ANNOUNCEMENT_FILE, ROUTING_DB_FILE, TRACKING_DB_FILE};
|
use radicle::node::{ADDRESS_DB_FILE, NODE_ANNOUNCEMENT_FILE, ROUTING_DB_FILE, TRACKING_DB_FILE};
|
||||||
use radicle::profile::Home;
|
use radicle::profile::Home;
|
||||||
|
|
@ -138,7 +140,7 @@ impl Runtime {
|
||||||
let tracking_db = node_dir.join(TRACKING_DB_FILE);
|
let tracking_db = node_dir.join(TRACKING_DB_FILE);
|
||||||
|
|
||||||
log::info!(target: "node", "Opening address book {}..", address_db.display());
|
log::info!(target: "node", "Opening address book {}..", address_db.display());
|
||||||
let addresses = address::Book::open(address_db)?;
|
let mut addresses = address::Book::open(address_db)?;
|
||||||
|
|
||||||
log::info!(target: "node", "Opening routing table {}..", routing_db.display());
|
log::info!(target: "node", "Opening routing table {}..", routing_db.display());
|
||||||
let routing = routing::Table::open(routing_db)?;
|
let routing = routing::Table::open(routing_db)?;
|
||||||
|
|
@ -176,6 +178,24 @@ impl Runtime {
|
||||||
.expect("Runtime::init: unable to solve proof-of-work puzzle")
|
.expect("Runtime::init: unable to solve proof-of-work puzzle")
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if config.connect.is_empty() && addresses.is_empty()? {
|
||||||
|
log::info!(target: "node", "Address book is empty. Adding bootstrap nodes..");
|
||||||
|
|
||||||
|
for (alias, addr) in config.network.bootstrap() {
|
||||||
|
let (id, addr) = addr.into();
|
||||||
|
|
||||||
|
addresses.insert(
|
||||||
|
&id,
|
||||||
|
radicle::node::Features::SEED,
|
||||||
|
alias,
|
||||||
|
0,
|
||||||
|
clock.as_secs(),
|
||||||
|
[node::KnownAddress::new(addr, address::Source::Bootstrap)],
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
log::info!(target: "node", "{} nodes added to address book", addresses.len()?);
|
||||||
|
}
|
||||||
|
|
||||||
let emitter: Emitter<Event> = Default::default();
|
let emitter: Emitter<Event> = Default::default();
|
||||||
let service = service::Service::new(
|
let service = service::Service::new(
|
||||||
config,
|
config,
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,7 @@ impl Default for Config<MockSigner> {
|
||||||
let signer = MockSigner::new(&mut rng);
|
let signer = MockSigner::new(&mut rng);
|
||||||
|
|
||||||
Config {
|
Config {
|
||||||
config: service::Config::new(Alias::from_str("mocky").unwrap()),
|
config: service::Config::test(Alias::from_str("mocky").unwrap()),
|
||||||
addrs: address::Book::memory().unwrap(),
|
addrs: address::Book::memory().unwrap(),
|
||||||
local_time: LocalTime::now(),
|
local_time: LocalTime::now(),
|
||||||
policy: Policy::default(),
|
policy: Policy::default(),
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,8 @@ fn test_inventory_sync_basic() {
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
|
|
||||||
let mut alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let mut alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let mut bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let mut bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
|
|
||||||
alice.project("alice", "");
|
alice.project("alice", "");
|
||||||
bob.project("bob", "");
|
bob.project("bob", "");
|
||||||
|
|
@ -48,9 +48,9 @@ fn test_inventory_sync_bridge() {
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
|
|
||||||
let mut alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let mut alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let mut bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let mut bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
let mut eve = Node::init(tmp.path(), Config::new(Alias::new("eve")));
|
let mut eve = Node::init(tmp.path(), Config::test(Alias::new("eve")));
|
||||||
|
|
||||||
alice.project("alice", "");
|
alice.project("alice", "");
|
||||||
bob.project("bob", "");
|
bob.project("bob", "");
|
||||||
|
|
@ -78,10 +78,10 @@ fn test_inventory_sync_ring() {
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
|
|
||||||
let mut alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let mut alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let mut bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let mut bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
let mut eve = Node::init(tmp.path(), Config::new(Alias::new("eve")));
|
let mut eve = Node::init(tmp.path(), Config::test(Alias::new("eve")));
|
||||||
let mut carol = Node::init(tmp.path(), Config::new(Alias::new("carol")));
|
let mut carol = Node::init(tmp.path(), Config::test(Alias::new("carol")));
|
||||||
|
|
||||||
alice.project("alice", "");
|
alice.project("alice", "");
|
||||||
bob.project("bob", "");
|
bob.project("bob", "");
|
||||||
|
|
@ -115,11 +115,11 @@ fn test_inventory_sync_star() {
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
|
|
||||||
let mut alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let mut alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let mut bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let mut bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
let mut eve = Node::init(tmp.path(), Config::new(Alias::new("eve")));
|
let mut eve = Node::init(tmp.path(), Config::test(Alias::new("eve")));
|
||||||
let mut carol = Node::init(tmp.path(), Config::new(Alias::new("carol")));
|
let mut carol = Node::init(tmp.path(), Config::test(Alias::new("carol")));
|
||||||
let mut dave = Node::init(tmp.path(), Config::new(Alias::new("dave")));
|
let mut dave = Node::init(tmp.path(), Config::test(Alias::new("dave")));
|
||||||
|
|
||||||
alice.project("alice", "");
|
alice.project("alice", "");
|
||||||
bob.project("bob", "");
|
bob.project("bob", "");
|
||||||
|
|
@ -147,8 +147,8 @@ fn test_replication() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
let alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let mut bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let mut bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
let acme = bob.project("acme", "");
|
let acme = bob.project("acme", "");
|
||||||
|
|
||||||
let mut alice = alice.spawn();
|
let mut alice = alice.spawn();
|
||||||
|
|
@ -204,8 +204,8 @@ fn test_replication_no_delegates() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
let alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let mut bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let mut bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
|
|
||||||
let acme = bob.project("acme", "");
|
let acme = bob.project("acme", "");
|
||||||
// Delete one of the signed refs.
|
// Delete one of the signed refs.
|
||||||
|
|
@ -237,8 +237,8 @@ fn test_replication_no_delegates() {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_replication_invalid() {
|
fn test_replication_invalid() {
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
let alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let mut bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let mut bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
let carol = MockSigner::default();
|
let carol = MockSigner::default();
|
||||||
let acme = bob.project("acme", "");
|
let acme = bob.project("acme", "");
|
||||||
let repo = bob.storage.repository_mut(acme).unwrap();
|
let repo = bob.storage.repository_mut(acme).unwrap();
|
||||||
|
|
@ -290,8 +290,8 @@ fn test_migrated_clone() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
let mut alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let mut alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
let acme = alice.project("acme", "");
|
let acme = alice.project("acme", "");
|
||||||
|
|
||||||
let mut alice = alice.spawn();
|
let mut alice = alice.spawn();
|
||||||
|
|
@ -340,8 +340,8 @@ fn test_dont_fetch_owned_refs() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
let mut alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let mut alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
let acme = alice.project("acme", "");
|
let acme = alice.project("acme", "");
|
||||||
|
|
||||||
let mut alice = alice.spawn();
|
let mut alice = alice.spawn();
|
||||||
|
|
@ -367,8 +367,8 @@ fn test_fetch_trusted_remotes() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
let mut alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let mut alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
let acme = alice.project("acme", "");
|
let acme = alice.project("acme", "");
|
||||||
let mut signers = Vec::with_capacity(5);
|
let mut signers = Vec::with_capacity(5);
|
||||||
{
|
{
|
||||||
|
|
@ -422,8 +422,8 @@ fn test_missing_remote() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
let mut alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let mut alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
let acme = alice.project("acme", "");
|
let acme = alice.project("acme", "");
|
||||||
|
|
||||||
let mut alice = alice.spawn();
|
let mut alice = alice.spawn();
|
||||||
|
|
@ -451,8 +451,8 @@ fn test_fetch_preserve_owned_refs() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
let mut alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let mut alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
let acme = alice.project("acme", "");
|
let acme = alice.project("acme", "");
|
||||||
let mut alice = alice.spawn();
|
let mut alice = alice.spawn();
|
||||||
let mut bob = bob.spawn();
|
let mut bob = bob.spawn();
|
||||||
|
|
@ -497,8 +497,8 @@ fn test_clone() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
let alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let mut bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let mut bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
let acme = bob.project("acme", "");
|
let acme = bob.project("acme", "");
|
||||||
|
|
||||||
let mut alice = alice.spawn();
|
let mut alice = alice.spawn();
|
||||||
|
|
@ -555,8 +555,8 @@ fn test_fetch_up_to_date() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
let alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let mut bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let mut bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
let acme = bob.project("acme", "");
|
let acme = bob.project("acme", "");
|
||||||
|
|
||||||
let mut alice = alice.spawn();
|
let mut alice = alice.spawn();
|
||||||
|
|
@ -585,8 +585,8 @@ fn test_large_fetch() {
|
||||||
|
|
||||||
let env = Environment::new();
|
let env = Environment::new();
|
||||||
let scale = env.scale();
|
let scale = env.scale();
|
||||||
let mut alice = Node::init(&env.tmp(), Config::new(Alias::new("alice")));
|
let mut alice = Node::init(&env.tmp(), Config::test(Alias::new("alice")));
|
||||||
let bob = Node::init(&env.tmp(), Config::new(Alias::new("bob")));
|
let bob = Node::init(&env.tmp(), Config::test(Alias::new("bob")));
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
let (repo, _) = fixtures::repository(tmp.path());
|
let (repo, _) = fixtures::repository(tmp.path());
|
||||||
|
|
@ -632,14 +632,14 @@ fn test_concurrent_fetches() {
|
||||||
&env.tmp(),
|
&env.tmp(),
|
||||||
service::Config {
|
service::Config {
|
||||||
limits: limits.clone(),
|
limits: limits.clone(),
|
||||||
..service::Config::new(Alias::new("alice"))
|
..service::Config::test(Alias::new("alice"))
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
let mut bob = Node::init(
|
let mut bob = Node::init(
|
||||||
&env.tmp(),
|
&env.tmp(),
|
||||||
service::Config {
|
service::Config {
|
||||||
limits,
|
limits,
|
||||||
..service::Config::new(Alias::new("bob"))
|
..service::Config::test(Alias::new("bob"))
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -728,8 +728,8 @@ fn test_connection_crossing() {
|
||||||
logger::init(log::Level::Debug);
|
logger::init(log::Level::Debug);
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
let alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
|
|
||||||
let mut alice = alice.spawn();
|
let mut alice = alice.spawn();
|
||||||
let mut bob = bob.spawn();
|
let mut bob = bob.spawn();
|
||||||
|
|
@ -768,9 +768,9 @@ fn test_non_fastforward_sigrefs() {
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
|
|
||||||
let alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let mut bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let mut bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
let eve = Node::init(tmp.path(), Config::new(Alias::new("eve")));
|
let eve = Node::init(tmp.path(), Config::test(Alias::new("eve")));
|
||||||
|
|
||||||
let rid = bob.project("acme", "");
|
let rid = bob.project("acme", "");
|
||||||
|
|
||||||
|
|
@ -820,9 +820,9 @@ fn test_outdated_sigrefs() {
|
||||||
|
|
||||||
let tmp = tempfile::tempdir().unwrap();
|
let tmp = tempfile::tempdir().unwrap();
|
||||||
|
|
||||||
let mut alice = Node::init(tmp.path(), Config::new(Alias::new("alice")));
|
let mut alice = Node::init(tmp.path(), Config::test(Alias::new("alice")));
|
||||||
let bob = Node::init(tmp.path(), Config::new(Alias::new("bob")));
|
let bob = Node::init(tmp.path(), Config::test(Alias::new("bob")));
|
||||||
let eve = Node::init(tmp.path(), Config::new(Alias::new("eve")));
|
let eve = Node::init(tmp.path(), Config::test(Alias::new("eve")));
|
||||||
|
|
||||||
let rid = alice.project("acme", "");
|
let rid = alice.project("acme", "");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,8 @@ mod types;
|
||||||
pub use store::*;
|
pub use store::*;
|
||||||
pub use types::*;
|
pub use types::*;
|
||||||
|
|
||||||
use std::net;
|
|
||||||
|
|
||||||
use cyphernet::addr::HostName;
|
use cyphernet::addr::HostName;
|
||||||
|
use std::net;
|
||||||
|
|
||||||
use crate::node::Address;
|
use crate::node::Address;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -310,7 +310,7 @@ impl TryFrom<&sql::Value> for Source {
|
||||||
};
|
};
|
||||||
match value {
|
match value {
|
||||||
sql::Value::String(s) => match s.as_str() {
|
sql::Value::String(s) => match s.as_str() {
|
||||||
"dns" => Ok(Source::Dns),
|
"bootstrap" => Ok(Source::Bootstrap),
|
||||||
"peer" => Ok(Source::Peer),
|
"peer" => Ok(Source::Peer),
|
||||||
"imported" => Ok(Source::Imported),
|
"imported" => Ok(Source::Imported),
|
||||||
_ => Err(err),
|
_ => Err(err),
|
||||||
|
|
@ -323,7 +323,7 @@ impl TryFrom<&sql::Value> for Source {
|
||||||
impl sql::BindableWithIndex for Source {
|
impl sql::BindableWithIndex for Source {
|
||||||
fn bind<I: sql::ParameterIndex>(self, stmt: &mut sql::Statement<'_>, i: I) -> sql::Result<()> {
|
fn bind<I: sql::ParameterIndex>(self, stmt: &mut sql::Statement<'_>, i: I) -> sql::Result<()> {
|
||||||
match self {
|
match self {
|
||||||
Self::Dns => "dns".bind(stmt, i),
|
Self::Bootstrap => "bootstrap".bind(stmt, i),
|
||||||
Self::Peer => "peer".bind(stmt, i),
|
Self::Peer => "peer".bind(stmt, i),
|
||||||
Self::Imported => "imported".bind(stmt, i),
|
Self::Imported => "imported".bind(stmt, i),
|
||||||
}
|
}
|
||||||
|
|
@ -342,7 +342,7 @@ impl TryFrom<&sql::Value> for AddressType {
|
||||||
sql::Value::String(s) => match s.as_str() {
|
sql::Value::String(s) => match s.as_str() {
|
||||||
"ipv4" => Ok(AddressType::Ipv4),
|
"ipv4" => Ok(AddressType::Ipv4),
|
||||||
"ipv6" => Ok(AddressType::Ipv6),
|
"ipv6" => Ok(AddressType::Ipv6),
|
||||||
"hostname" => Ok(AddressType::Dns),
|
"dns" => Ok(AddressType::Dns),
|
||||||
"onion" => Ok(AddressType::Onion),
|
"onion" => Ok(AddressType::Onion),
|
||||||
_ => Err(err),
|
_ => Err(err),
|
||||||
},
|
},
|
||||||
|
|
@ -592,7 +592,7 @@ mod test {
|
||||||
let addr = net::SocketAddr::from((net::Ipv4Addr::from(ip), rng.u16(..)));
|
let addr = net::SocketAddr::from((net::Ipv4Addr::from(ip), rng.u16(..)));
|
||||||
let ka = KnownAddress {
|
let ka = KnownAddress {
|
||||||
addr: addr.into(),
|
addr: addr.into(),
|
||||||
source: Source::Dns,
|
source: Source::Bootstrap,
|
||||||
// TODO: Test times as well.
|
// TODO: Test times as well.
|
||||||
last_success: None,
|
last_success: None,
|
||||||
last_attempt: None,
|
last_attempt: None,
|
||||||
|
|
|
||||||
|
|
@ -121,8 +121,8 @@ impl KnownAddress {
|
||||||
pub enum Source {
|
pub enum Source {
|
||||||
/// An address that was shared by another peer.
|
/// An address that was shared by another peer.
|
||||||
Peer,
|
Peer,
|
||||||
/// An address that came from a DNS seed.
|
/// An bootstrap node address.
|
||||||
Dns,
|
Bootstrap,
|
||||||
/// An address that came from some source external to the system, eg.
|
/// An address that came from some source external to the system, eg.
|
||||||
/// specified by the user or added directly to the address manager.
|
/// specified by the user or added directly to the address manager.
|
||||||
Imported,
|
Imported,
|
||||||
|
|
@ -132,7 +132,7 @@ impl std::fmt::Display for Source {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
match self {
|
match self {
|
||||||
Self::Peer => write!(f, "Peer"),
|
Self::Peer => write!(f, "Peer"),
|
||||||
Self::Dns => write!(f, "DNS"),
|
Self::Bootstrap => write!(f, "Bootstrap"),
|
||||||
Self::Imported => write!(f, "Imported"),
|
Self::Imported => write!(f, "Imported"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,32 @@ pub enum Network {
|
||||||
Test,
|
Test,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Network {
|
||||||
|
/// Bootstrap nodes for this network.
|
||||||
|
pub fn bootstrap(&self) -> Vec<(Alias, ConnectAddress)> {
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
match self {
|
||||||
|
Self::Main => [
|
||||||
|
(
|
||||||
|
"seed.radicle.garden",
|
||||||
|
"z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@seed.radicle.garden:8776",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"seed.radicle.xyz",
|
||||||
|
"z6MksmpU5b1dS7oaqF2bHXhQi1DWy2hB7Mh9CuN7y1DN6QSz@seed.radicle.xyz:8776",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
// SAFETY: These are valid addresses.
|
||||||
|
.map(|(a, s)| (Alias::new(a), PeerAddr::from_str(s).unwrap().into()))
|
||||||
|
.collect(),
|
||||||
|
|
||||||
|
Self::Test => vec![],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Configuration parameters defining attributes of minima and maxima.
|
/// Configuration parameters defining attributes of minima and maxima.
|
||||||
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
|
|
@ -63,6 +89,12 @@ impl From<(NodeId, Address)> for ConnectAddress {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<ConnectAddress> for Address {
|
||||||
|
fn from(value: ConnectAddress) -> Self {
|
||||||
|
value.0.addr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Deref for ConnectAddress {
|
impl Deref for ConnectAddress {
|
||||||
type Target = PeerAddr<NodeId, Address>;
|
type Target = PeerAddr<NodeId, Address>;
|
||||||
|
|
||||||
|
|
@ -95,6 +127,13 @@ pub struct Config {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
|
pub fn test(alias: Alias) -> Self {
|
||||||
|
Self {
|
||||||
|
network: Network::Test,
|
||||||
|
..Self::new(alias)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn new(alias: Alias) -> Self {
|
pub fn new(alias: Alias) -> Self {
|
||||||
Self {
|
Self {
|
||||||
alias,
|
alias,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue