From b82584617b4b6595d958e678502a99f405e70a11 Mon Sep 17 00:00:00 2001 From: Fintan Halpenny Date: Mon, 6 Mar 2023 11:19:08 +0000 Subject: [PATCH] node: store Scope in tracking config The tracking configuration has no way of consulting for a configured scope. This change allows the storing of this scope inside the tracking `Config` -- currently unused. The default Scope is chosen as Trusted, so that nodes do not implicitly track any other node. If this behaviour is desired -- for example, for seed nodes -- then All should be chosen. Signed-off-by: Fintan Halpenny X-Clacks-Overhead: GNU Terry Pratchett --- radicle-cli/tests/commands.rs | 3 ++- radicle-node/src/runtime.rs | 2 +- radicle-node/src/service/config.rs | 5 ++++- radicle-node/src/service/tracking.rs | 21 ++++++++++++++------- radicle-node/src/test/peer.rs | 6 ++++-- radicle/src/node/tracking.rs | 3 ++- 6 files changed, 27 insertions(+), 13 deletions(-) diff --git a/radicle-cli/tests/commands.rs b/radicle-cli/tests/commands.rs index 44afaedd..66a71e68 100644 --- a/radicle-cli/tests/commands.rs +++ b/radicle-cli/tests/commands.rs @@ -11,7 +11,7 @@ use radicle::storage::{ReadRepository, ReadStorage}; use radicle::test::fixtures; use radicle_cli_test::TestFormula; -use radicle_node::service::tracking::Policy; +use radicle_node::service::tracking::{Policy, Scope}; use radicle_node::test::{ environment::{Config, Environment}, logger, @@ -444,6 +444,7 @@ fn test_replication_via_seed() { let mut bob = bob.spawn(Config::default()); let seed = seed.spawn(Config { policy: Policy::Track, + scope: Scope::All, ..Config::default() }); diff --git a/radicle-node/src/runtime.rs b/radicle-node/src/runtime.rs index 45b9e4fb..40533e1c 100644 --- a/radicle-node/src/runtime.rs +++ b/radicle-node/src/runtime.rs @@ -116,7 +116,7 @@ impl Runtime { log::info!(target: "node", "Opening tracking policy table {}..", tracking_db.display()); let tracking = tracking::Store::open(tracking_db)?; - let tracking = tracking::Config::new(config.policy, tracking); + let tracking = tracking::Config::new(config.policy, config.scope, tracking); log::info!(target: "node", "Default tracking policy set to '{}'", &config.policy); log::info!(target: "node", "Initializing service ({:?})..", network); diff --git a/radicle-node/src/service/config.rs b/radicle-node/src/service/config.rs index ad9c4ca7..33747697 100644 --- a/radicle-node/src/service/config.rs +++ b/radicle-node/src/service/config.rs @@ -2,7 +2,7 @@ use localtime::LocalDuration; use radicle::node::Address; -use crate::service::tracking::Policy; +use crate::service::tracking::{Policy, Scope}; use crate::service::NodeId; /// Peer-to-peer network. @@ -47,6 +47,8 @@ pub struct Config { pub limits: Limits, /// Default tracking policy. pub policy: Policy, + /// Default tracking scope. + pub scope: Scope, } impl Default for Config { @@ -58,6 +60,7 @@ impl Default for Config { relay: true, limits: Limits::default(), policy: Policy::default(), + scope: Scope::default(), } } } diff --git a/radicle-node/src/service/tracking.rs b/radicle-node/src/service/tracking.rs index 363e577a..6ec57116 100644 --- a/radicle-node/src/service/tracking.rs +++ b/radicle-node/src/service/tracking.rs @@ -14,25 +14,32 @@ pub use store::Error; #[derive(Debug)] pub struct Config { /// Default policy, if a policy for a specific node or repository was not found. - default: Policy, + policy: Policy, + #[allow(dead_code)] + /// Default scope, if a scope for a specific repository was not found. + scope: Scope, /// Underlying configuration store. store: store::Config, } impl Config { /// Create a new tracking configuration. - pub fn new(default: Policy, store: store::Config) -> Self { - Self { default, store } + pub fn new(policy: Policy, scope: Scope, store: store::Config) -> Self { + Self { + policy, + scope, + store, + } } /// Check if a repository is tracked. pub fn is_repo_tracked(&self, id: &Id) -> Result { - self.repo_policy(id).map(|policy| policy == Policy::Track) + self.repo_policy(id).map(|entry| entry == Policy::Track) } /// Check if a node is tracked. pub fn is_node_tracked(&self, id: &NodeId) -> Result { - self.node_policy(id).map(|policy| policy == Policy::Track) + self.node_policy(id).map(|entry| entry == Policy::Track) } /// Get a node's tracking information. @@ -41,7 +48,7 @@ impl Config { if let Some((_, policy)) = self.store.node_entry(id)? { return Ok(policy); } - Ok(self.default) + Ok(self.policy) } /// Get a repository's tracking information. @@ -50,7 +57,7 @@ impl Config { if let Some((_, policy)) = self.store.repo_entry(id)? { return Ok(policy); } - Ok(self.default) + Ok(self.policy) } } diff --git a/radicle-node/src/test/peer.rs b/radicle-node/src/test/peer.rs index 6b48fc87..dbbc390b 100644 --- a/radicle-node/src/test/peer.rs +++ b/radicle-node/src/test/peer.rs @@ -16,7 +16,7 @@ use crate::prelude::*; use crate::service; use crate::service::message::*; use crate::service::reactor::Io; -use crate::service::tracking::Policy; +use crate::service::tracking::{Policy, Scope}; use crate::service::*; use crate::storage::git::transport::remote; use crate::storage::{RemoteId, WriteStorage}; @@ -92,6 +92,7 @@ pub struct Config { pub addrs: address::Book, pub local_time: LocalTime, pub policy: Policy, + pub scope: Scope, pub signer: G, pub rng: fastrand::Rng, } @@ -106,6 +107,7 @@ impl Default for Config { addrs: address::Book::memory().unwrap(), local_time: LocalTime::now(), policy: Policy::Block, + scope: Scope::default(), signer, rng, } @@ -125,7 +127,7 @@ where ) -> Self { let routing = routing::Table::memory().unwrap(); let tracking = tracking::Store::memory().unwrap(); - let tracking = tracking::Config::new(config.policy, tracking); + let tracking = tracking::Config::new(config.policy, config.scope, tracking); let id = *config.signer.public_key(); let service = Service::new( config.config, diff --git a/radicle/src/node/tracking.rs b/radicle/src/node/tracking.rs index df568107..554da290 100644 --- a/radicle/src/node/tracking.rs +++ b/radicle/src/node/tracking.rs @@ -90,9 +90,10 @@ impl TryFrom<&sqlite::Value> for Policy { } /// Tracking scope of a repository tracking policy. -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] pub enum Scope { /// Track remotes of nodes that are already tracked. + #[default] Trusted, /// Track all remotes. All,