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 <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
This commit is contained in:
Fintan Halpenny 2023-03-06 11:19:08 +00:00
parent 5902236d0a
commit b82584617b
No known key found for this signature in database
GPG Key ID: 2552FB6F64066CB7
6 changed files with 27 additions and 13 deletions

View File

@ -11,7 +11,7 @@ use radicle::storage::{ReadRepository, ReadStorage};
use radicle::test::fixtures; use radicle::test::fixtures;
use radicle_cli_test::TestFormula; use radicle_cli_test::TestFormula;
use radicle_node::service::tracking::Policy; use radicle_node::service::tracking::{Policy, Scope};
use radicle_node::test::{ use radicle_node::test::{
environment::{Config, Environment}, environment::{Config, Environment},
logger, logger,
@ -444,6 +444,7 @@ fn test_replication_via_seed() {
let mut bob = bob.spawn(Config::default()); let mut bob = bob.spawn(Config::default());
let seed = seed.spawn(Config { let seed = seed.spawn(Config {
policy: Policy::Track, policy: Policy::Track,
scope: Scope::All,
..Config::default() ..Config::default()
}); });

View File

@ -116,7 +116,7 @@ impl<G: Signer + Ecdh + 'static> Runtime<G> {
log::info!(target: "node", "Opening tracking policy table {}..", tracking_db.display()); log::info!(target: "node", "Opening tracking policy table {}..", tracking_db.display());
let tracking = tracking::Store::open(tracking_db)?; 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", "Default tracking policy set to '{}'", &config.policy);
log::info!(target: "node", "Initializing service ({:?})..", network); log::info!(target: "node", "Initializing service ({:?})..", network);

View File

@ -2,7 +2,7 @@ use localtime::LocalDuration;
use radicle::node::Address; use radicle::node::Address;
use crate::service::tracking::Policy; use crate::service::tracking::{Policy, Scope};
use crate::service::NodeId; use crate::service::NodeId;
/// Peer-to-peer network. /// Peer-to-peer network.
@ -47,6 +47,8 @@ pub struct Config {
pub limits: Limits, pub limits: Limits,
/// Default tracking policy. /// Default tracking policy.
pub policy: Policy, pub policy: Policy,
/// Default tracking scope.
pub scope: Scope,
} }
impl Default for Config { impl Default for Config {
@ -58,6 +60,7 @@ impl Default for Config {
relay: true, relay: true,
limits: Limits::default(), limits: Limits::default(),
policy: Policy::default(), policy: Policy::default(),
scope: Scope::default(),
} }
} }
} }

View File

@ -14,25 +14,32 @@ pub use store::Error;
#[derive(Debug)] #[derive(Debug)]
pub struct Config { pub struct Config {
/// Default policy, if a policy for a specific node or repository was not found. /// 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. /// Underlying configuration store.
store: store::Config, store: store::Config,
} }
impl Config { impl Config {
/// Create a new tracking configuration. /// Create a new tracking configuration.
pub fn new(default: Policy, store: store::Config) -> Self { pub fn new(policy: Policy, scope: Scope, store: store::Config) -> Self {
Self { default, store } Self {
policy,
scope,
store,
}
} }
/// Check if a repository is tracked. /// Check if a repository is tracked.
pub fn is_repo_tracked(&self, id: &Id) -> Result<bool, Error> { pub fn is_repo_tracked(&self, id: &Id) -> Result<bool, Error> {
self.repo_policy(id).map(|policy| policy == Policy::Track) self.repo_policy(id).map(|entry| entry == Policy::Track)
} }
/// Check if a node is tracked. /// Check if a node is tracked.
pub fn is_node_tracked(&self, id: &NodeId) -> Result<bool, Error> { pub fn is_node_tracked(&self, id: &NodeId) -> Result<bool, Error> {
self.node_policy(id).map(|policy| policy == Policy::Track) self.node_policy(id).map(|entry| entry == Policy::Track)
} }
/// Get a node's tracking information. /// Get a node's tracking information.
@ -41,7 +48,7 @@ impl Config {
if let Some((_, policy)) = self.store.node_entry(id)? { if let Some((_, policy)) = self.store.node_entry(id)? {
return Ok(policy); return Ok(policy);
} }
Ok(self.default) Ok(self.policy)
} }
/// Get a repository's tracking information. /// Get a repository's tracking information.
@ -50,7 +57,7 @@ impl Config {
if let Some((_, policy)) = self.store.repo_entry(id)? { if let Some((_, policy)) = self.store.repo_entry(id)? {
return Ok(policy); return Ok(policy);
} }
Ok(self.default) Ok(self.policy)
} }
} }

View File

@ -16,7 +16,7 @@ use crate::prelude::*;
use crate::service; use crate::service;
use crate::service::message::*; use crate::service::message::*;
use crate::service::reactor::Io; use crate::service::reactor::Io;
use crate::service::tracking::Policy; use crate::service::tracking::{Policy, Scope};
use crate::service::*; use crate::service::*;
use crate::storage::git::transport::remote; use crate::storage::git::transport::remote;
use crate::storage::{RemoteId, WriteStorage}; use crate::storage::{RemoteId, WriteStorage};
@ -92,6 +92,7 @@ pub struct Config<G: Signer + 'static> {
pub addrs: address::Book, pub addrs: address::Book,
pub local_time: LocalTime, pub local_time: LocalTime,
pub policy: Policy, pub policy: Policy,
pub scope: Scope,
pub signer: G, pub signer: G,
pub rng: fastrand::Rng, pub rng: fastrand::Rng,
} }
@ -106,6 +107,7 @@ impl Default for Config<MockSigner> {
addrs: address::Book::memory().unwrap(), addrs: address::Book::memory().unwrap(),
local_time: LocalTime::now(), local_time: LocalTime::now(),
policy: Policy::Block, policy: Policy::Block,
scope: Scope::default(),
signer, signer,
rng, rng,
} }
@ -125,7 +127,7 @@ where
) -> Self { ) -> Self {
let routing = routing::Table::memory().unwrap(); let routing = routing::Table::memory().unwrap();
let tracking = tracking::Store::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 id = *config.signer.public_key();
let service = Service::new( let service = Service::new(
config.config, config.config,

View File

@ -90,9 +90,10 @@ impl TryFrom<&sqlite::Value> for Policy {
} }
/// Tracking scope of a repository tracking 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 { pub enum Scope {
/// Track remotes of nodes that are already tracked. /// Track remotes of nodes that are already tracked.
#[default]
Trusted, Trusted,
/// Track all remotes. /// Track all remotes.
All, All,