Skip to content

Commit 46e9d25

Browse files
committed
Merge #1218: Overhaul core Tracker: create dependency containers for UDP tracker, HTTP tracker and Tracker API
b38e4af chore: add DevSkim ignore DS173237 (Jose Celano) 66b2b56 refactor: [#1217] extract HttpApiContainer (Jose Celano) a2bf1cd refactor: [#1217] extract HttpTrackerContainer (Jose Celano) 5342a5d refactor: [#1217] extract UdpTrackerContainer (Jose Celano) Pull request description: Overhaul core Tracker: create dependency containers for UDP tracker, HTTP tracker and Tracker API. ### Subtasks - [x] Extract `UdpTrackerContainer` - [x] Extract `HttpTrackerContainer` - [x] Extract `HttpApiContainer` ACKs for top commit: josecelano: ACK b38e4af Tree-SHA512: da14cb884920eaf7f7c249dace05596a61ee0532efb77cb4bd5c381e6c5d2b119d86f8f22764080b84c7f165c4fc524dce2eb4e311521728fdb81d172bda6164
2 parents b8e0803 + b38e4af commit 46e9d25

File tree

39 files changed

+485
-932
lines changed

39 files changed

+485
-932
lines changed

console/tracker-client/src/console/clients/checker/checks/http.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ pub async fn run(http_trackers: Vec<Url>, timeout: Duration) -> Vec<Result<Check
6161
}
6262

6363
async fn check_http_announce(url: &Url, timeout: Duration) -> Result<Announce, Error> {
64-
let info_hash_str = "9c38422213e30bff212b30c360d26f9a02136422".to_string(); // # DevSkim: ignore DS173237
64+
let info_hash_str = "9c38422213e30bff212b30c360d26f9a02136422".to_string(); // DevSkim: ignore DS173237
6565
let info_hash = InfoHash::from_str(&info_hash_str).expect("a valid info-hash is required");
6666

6767
let client = Client::new(url.clone(), timeout).map_err(|err| Error::HttpClientError { err })?;
@@ -86,7 +86,7 @@ async fn check_http_announce(url: &Url, timeout: Duration) -> Result<Announce, E
8686
}
8787

8888
async fn check_http_scrape(url: &Url, timeout: Duration) -> Result<scrape::Response, Error> {
89-
let info_hashes: Vec<String> = vec!["9c38422213e30bff212b30c360d26f9a02136422".to_string()]; // # DevSkim: ignore DS173237
89+
let info_hashes: Vec<String> = vec!["9c38422213e30bff212b30c360d26f9a02136422".to_string()]; // DevSkim: ignore DS173237
9090
let query = requests::scrape::Query::try_from(info_hashes).expect("a valid array of info-hashes is required");
9191

9292
let client = Client::new(url.clone(), timeout).map_err(|err| Error::HttpClientError { err })?;

console/tracker-client/src/console/clients/checker/checks/udp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ pub async fn run(udp_trackers: Vec<Url>, timeout: Duration) -> Vec<Result<Checks
2929

3030
tracing::debug!("UDP trackers ...");
3131

32-
let info_hash = aquatic_udp_protocol::InfoHash(hex!("9c38422213e30bff212b30c360d26f9a02136422")); // # DevSkim: ignore DS173237
32+
let info_hash = aquatic_udp_protocol::InfoHash(hex!("9c38422213e30bff212b30c360d26f9a02136422")); // DevSkim: ignore DS173237
3333

3434
for remote_url in udp_trackers {
3535
let remote_addr = resolve_socket_addr(&remote_url);

packages/tracker-client/src/http/client/requests/announce.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ impl QueryBuilder {
9595
#[must_use]
9696
pub fn with_default_values() -> QueryBuilder {
9797
let default_announce_query = Query {
98-
info_hash: InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap().0, // # DevSkim: ignore DS173237
98+
info_hash: InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap().0, // DevSkim: ignore DS173237
9999
peer_addr: IpAddr::V4(Ipv4Addr::new(192, 168, 1, 88)),
100100
downloaded: 0,
101101
uploaded: 0,

packages/tracker-client/src/http/client/requests/scrape.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ pub struct QueryBuilder {
9090
impl Default for QueryBuilder {
9191
fn default() -> Self {
9292
let default_scrape_query = Query {
93-
info_hash: [InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap().0].to_vec(), // # DevSkim: ignore DS173237
93+
info_hash: [InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap().0].to_vec(), // DevSkim: ignore DS173237
9494
};
9595
Self {
9696
scrape_query: default_scrape_query,

src/app.rs

Lines changed: 15 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use torrust_tracker_configuration::Configuration;
2828
use tracing::instrument;
2929

3030
use crate::bootstrap::jobs::{health_check_api, http_tracker, torrent_cleanup, tracker_apis, udp_tracker};
31-
use crate::container::AppContainer;
31+
use crate::container::{AppContainer, HttpApiContainer, HttpTrackerContainer, UdpTrackerContainer};
3232
use crate::servers;
3333
use crate::servers::registar::Registar;
3434

@@ -39,7 +39,7 @@ use crate::servers::registar::Registar;
3939
/// - Can't retrieve tracker keys from database.
4040
/// - Can't load whitelist from database.
4141
#[instrument(skip(config, app_container))]
42-
pub async fn start(config: &Configuration, app_container: &AppContainer) -> Vec<JoinHandle<()>> {
42+
pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) -> Vec<JoinHandle<()>> {
4343
if config.http_api.is_none()
4444
&& (config.udp_trackers.is_none() || config.udp_trackers.as_ref().map_or(true, std::vec::Vec::is_empty))
4545
&& (config.http_trackers.is_none() || config.http_trackers.as_ref().map_or(true, std::vec::Vec::is_empty))
@@ -78,19 +78,10 @@ pub async fn start(config: &Configuration, app_container: &AppContainer) -> Vec<
7878
udp_tracker_config.bind_address
7979
);
8080
} else {
81-
jobs.push(
82-
udp_tracker::start_job(
83-
Arc::new(config.core.clone()),
84-
udp_tracker_config,
85-
app_container.announce_handler.clone(),
86-
app_container.scrape_handler.clone(),
87-
app_container.whitelist_authorization.clone(),
88-
app_container.stats_event_sender.clone(),
89-
app_container.ban_service.clone(),
90-
registar.give_form(),
91-
)
92-
.await,
93-
);
81+
let udp_tracker_config = Arc::new(udp_tracker_config.clone());
82+
let udp_tracker_container = Arc::new(UdpTrackerContainer::from_app_container(&udp_tracker_config, app_container));
83+
84+
jobs.push(udp_tracker::start_job(udp_tracker_container, registar.give_form()).await);
9485
}
9586
}
9687
} else {
@@ -100,18 +91,11 @@ pub async fn start(config: &Configuration, app_container: &AppContainer) -> Vec<
10091
// Start the HTTP blocks
10192
if let Some(http_trackers) = &config.http_trackers {
10293
for http_tracker_config in http_trackers {
103-
if let Some(job) = http_tracker::start_job(
104-
http_tracker_config,
105-
Arc::new(config.core.clone()),
106-
app_container.announce_handler.clone(),
107-
app_container.scrape_handler.clone(),
108-
app_container.authentication_service.clone(),
109-
app_container.whitelist_authorization.clone(),
110-
app_container.stats_event_sender.clone(),
111-
registar.give_form(),
112-
servers::http::Version::V1,
113-
)
114-
.await
94+
let http_tracker_config = Arc::new(http_tracker_config.clone());
95+
let http_tracker_container = Arc::new(HttpTrackerContainer::from_app_container(&http_tracker_config, app_container));
96+
97+
if let Some(job) =
98+
http_tracker::start_job(http_tracker_container, registar.give_form(), servers::http::Version::V1).await
11599
{
116100
jobs.push(job);
117101
};
@@ -122,19 +106,10 @@ pub async fn start(config: &Configuration, app_container: &AppContainer) -> Vec<
122106

123107
// Start HTTP API
124108
if let Some(http_api_config) = &config.http_api {
125-
if let Some(job) = tracker_apis::start_job(
126-
http_api_config,
127-
app_container.in_memory_torrent_repository.clone(),
128-
app_container.keys_handler.clone(),
129-
app_container.whitelist_manager.clone(),
130-
app_container.ban_service.clone(),
131-
app_container.stats_event_sender.clone(),
132-
app_container.stats_repository.clone(),
133-
registar.give_form(),
134-
servers::apis::Version::V1,
135-
)
136-
.await
137-
{
109+
let http_api_config = Arc::new(http_api_config.clone());
110+
let http_api_container = Arc::new(HttpApiContainer::from_app_container(&http_api_config, app_container));
111+
112+
if let Some(job) = tracker_apis::start_job(http_api_container, registar.give_form(), servers::apis::Version::V1).await {
138113
jobs.push(job);
139114
};
140115
} else {

src/bootstrap/app.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use crate::core::services::{initialize_database, initialize_whitelist_manager, s
3232
use crate::core::torrent::manager::TorrentsManager;
3333
use crate::core::torrent::repository::in_memory::InMemoryTorrentRepository;
3434
use crate::core::torrent::repository::persisted::DatabasePersistentTorrentRepository;
35-
use crate::core::whitelist;
35+
use crate::core::whitelist::authorization::WhitelistAuthorization;
3636
use crate::core::whitelist::repository::in_memory::InMemoryWhitelist;
3737
use crate::servers::udp::server::banning::BanService;
3838
use crate::servers::udp::server::launcher::MAX_CONNECTION_ID_ERRORS_PER_IP;
@@ -87,16 +87,14 @@ pub fn initialize_global_services(configuration: &Configuration) {
8787
/// It initializes the IoC Container.
8888
#[instrument(skip())]
8989
pub fn initialize_app_container(configuration: &Configuration) -> AppContainer {
90+
let core_config = Arc::new(configuration.core.clone());
9091
let (stats_event_sender, stats_repository) = statistics::setup::factory(configuration.core.tracker_usage_statistics);
9192
let stats_event_sender = Arc::new(stats_event_sender);
9293
let stats_repository = Arc::new(stats_repository);
9394
let ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
9495
let database = initialize_database(configuration);
9596
let in_memory_whitelist = Arc::new(InMemoryWhitelist::default());
96-
let whitelist_authorization = Arc::new(whitelist::authorization::WhitelistAuthorization::new(
97-
&configuration.core,
98-
&in_memory_whitelist.clone(),
99-
));
97+
let whitelist_authorization = Arc::new(WhitelistAuthorization::new(&configuration.core, &in_memory_whitelist.clone()));
10098
let whitelist_manager = initialize_whitelist_manager(database.clone(), in_memory_whitelist.clone());
10199
let db_key_repository = Arc::new(DatabaseKeyRepository::new(&database));
102100
let in_memory_key_repository = Arc::new(InMemoryKeyRepository::default());
@@ -125,6 +123,7 @@ pub fn initialize_app_container(configuration: &Configuration) -> AppContainer {
125123
let scrape_handler = Arc::new(ScrapeHandler::new(&whitelist_authorization, &in_memory_torrent_repository));
126124

127125
AppContainer {
126+
core_config,
128127
database,
129128
announce_handler,
130129
scrape_handler,

src/bootstrap/jobs/http_tracker.rs

Lines changed: 17 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,10 @@ use std::sync::Arc;
1515

1616
use axum_server::tls_rustls::RustlsConfig;
1717
use tokio::task::JoinHandle;
18-
use torrust_tracker_configuration::{Core, HttpTracker};
1918
use tracing::instrument;
2019

2120
use super::make_rust_tls;
22-
use crate::core::announce_handler::AnnounceHandler;
23-
use crate::core::authentication::service::AuthenticationService;
24-
use crate::core::scrape_handler::ScrapeHandler;
25-
use crate::core::statistics::event::sender::Sender;
26-
use crate::core::{statistics, whitelist};
21+
use crate::container::HttpTrackerContainer;
2722
use crate::servers::http::server::{HttpServer, Launcher};
2823
use crate::servers::http::Version;
2924
use crate::servers::registar::ServiceRegistrationForm;
@@ -36,83 +31,33 @@ use crate::servers::registar::ServiceRegistrationForm;
3631
/// # Panics
3732
///
3833
/// It would panic if the `config::HttpTracker` struct would contain inappropriate values.
39-
#[allow(clippy::too_many_arguments)]
40-
#[instrument(skip(
41-
config,
42-
announce_handler,
43-
scrape_handler,
44-
authentication_service,
45-
whitelist_authorization,
46-
stats_event_sender,
47-
form
48-
))]
34+
#[instrument(skip(http_tracker_container, form))]
4935
pub async fn start_job(
50-
config: &HttpTracker,
51-
core_config: Arc<Core>,
52-
announce_handler: Arc<AnnounceHandler>,
53-
scrape_handler: Arc<ScrapeHandler>,
54-
authentication_service: Arc<AuthenticationService>,
55-
whitelist_authorization: Arc<whitelist::authorization::WhitelistAuthorization>,
56-
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
36+
http_tracker_container: Arc<HttpTrackerContainer>,
5737
form: ServiceRegistrationForm,
5838
version: Version,
5939
) -> Option<JoinHandle<()>> {
60-
let socket = config.bind_address;
40+
let socket = http_tracker_container.http_tracker_config.bind_address;
6141

62-
let tls = make_rust_tls(&config.tsl_config)
42+
let tls = make_rust_tls(&http_tracker_container.http_tracker_config.tsl_config)
6343
.await
6444
.map(|tls| tls.expect("it should have a valid http tracker tls configuration"));
6545

6646
match version {
67-
Version::V1 => Some(
68-
start_v1(
69-
socket,
70-
tls,
71-
core_config.clone(),
72-
announce_handler.clone(),
73-
scrape_handler.clone(),
74-
authentication_service.clone(),
75-
whitelist_authorization.clone(),
76-
stats_event_sender.clone(),
77-
form,
78-
)
79-
.await,
80-
),
47+
Version::V1 => Some(start_v1(socket, tls, http_tracker_container, form).await),
8148
}
8249
}
8350

84-
#[allow(clippy::too_many_arguments)]
8551
#[allow(clippy::async_yields_async)]
86-
#[instrument(skip(
87-
socket,
88-
tls,
89-
announce_handler,
90-
scrape_handler,
91-
whitelist_authorization,
92-
stats_event_sender,
93-
form
94-
))]
52+
#[instrument(skip(socket, tls, http_tracker_container, form))]
9553
async fn start_v1(
9654
socket: SocketAddr,
9755
tls: Option<RustlsConfig>,
98-
config: Arc<Core>,
99-
announce_handler: Arc<AnnounceHandler>,
100-
scrape_handler: Arc<ScrapeHandler>,
101-
authentication_service: Arc<AuthenticationService>,
102-
whitelist_authorization: Arc<whitelist::authorization::WhitelistAuthorization>,
103-
stats_event_sender: Arc<Option<Box<dyn statistics::event::sender::Sender>>>,
56+
http_tracker_container: Arc<HttpTrackerContainer>,
10457
form: ServiceRegistrationForm,
10558
) -> JoinHandle<()> {
10659
let server = HttpServer::new(Launcher::new(socket, tls))
107-
.start(
108-
config,
109-
announce_handler,
110-
scrape_handler,
111-
authentication_service,
112-
whitelist_authorization,
113-
stats_event_sender,
114-
form,
115-
)
60+
.start(http_tracker_container, form)
11661
.await
11762
.expect("it should be able to start to the http tracker");
11863

@@ -137,33 +82,26 @@ mod tests {
13782

13883
use crate::bootstrap::app::{initialize_app_container, initialize_global_services};
13984
use crate::bootstrap::jobs::http_tracker::start_job;
85+
use crate::container::HttpTrackerContainer;
14086
use crate::servers::http::Version;
14187
use crate::servers::registar::Registar;
14288

14389
#[tokio::test]
14490
async fn it_should_start_http_tracker() {
14591
let cfg = Arc::new(ephemeral_public());
14692
let http_tracker = cfg.http_trackers.clone().expect("missing HTTP tracker configuration");
147-
let config = &http_tracker[0];
93+
let http_tracker_config = Arc::new(http_tracker[0].clone());
14894

14995
initialize_global_services(&cfg);
15096

151-
let app_container = initialize_app_container(&cfg);
97+
let app_container = Arc::new(initialize_app_container(&cfg));
98+
99+
let http_tracker_container = Arc::new(HttpTrackerContainer::from_app_container(&http_tracker_config, &app_container));
152100

153101
let version = Version::V1;
154102

155-
start_job(
156-
config,
157-
Arc::new(cfg.core.clone()),
158-
app_container.announce_handler,
159-
app_container.scrape_handler,
160-
app_container.authentication_service,
161-
app_container.whitelist_authorization,
162-
app_container.stats_event_sender,
163-
Registar::default().give_form(),
164-
version,
165-
)
166-
.await
167-
.expect("it should be able to join to the http tracker start-job");
103+
start_job(http_tracker_container, Registar::default().give_form(), version)
104+
.await
105+
.expect("it should be able to join to the http tracker start-job");
168106
}
169107
}

0 commit comments

Comments
 (0)