Skip to content

Commit 08836d0

Browse files
committed
worker/jobs/downloads: Extract CdnLogQueueConfig enum
1 parent c6f7e32 commit 08836d0

File tree

5 files changed

+67
-12
lines changed

5 files changed

+67
-12
lines changed

src/config.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
mod balance_capacity;
22
mod base;
3+
mod cdn_log_queue;
34
mod cdn_log_storage;
45
mod database_pools;
56
mod sentry;
67
mod server;
78

89
pub use self::balance_capacity::BalanceCapacityConfig;
910
pub use self::base::Base;
11+
pub use self::cdn_log_queue::CdnLogQueueConfig;
1012
pub use self::cdn_log_storage::CdnLogStorageConfig;
1113
pub use self::database_pools::{DatabasePools, DbPoolConfig};
1214
pub use self::sentry::SentryConfig;

src/config/cdn_log_queue.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
use crates_io_env_vars::{required_var, var};
2+
use secrecy::SecretString;
3+
4+
#[derive(Debug, Clone)]
5+
pub enum CdnLogQueueConfig {
6+
SQS {
7+
access_key: String,
8+
secret_key: SecretString,
9+
queue_url: String,
10+
region: String,
11+
},
12+
Mock,
13+
}
14+
15+
impl CdnLogQueueConfig {
16+
pub fn from_env() -> anyhow::Result<Self> {
17+
if let Some(queue_url) = var("CDN_LOG_QUEUE_URL")? {
18+
let access_key = required_var("CDN_LOG_QUEUE_ACCESS_KEY")?;
19+
let secret_key = required_var("CDN_LOG_QUEUE_SECRET_KEY")?.into();
20+
let region = required_var("CDN_LOG_QUEUE_REGION")?;
21+
22+
return Ok(Self::SQS {
23+
access_key,
24+
secret_key,
25+
queue_url,
26+
region,
27+
});
28+
}
29+
30+
warn!("Falling back to mocked CDN log queue");
31+
Ok(Self::Mock)
32+
}
33+
}

src/config/server.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use super::base::Base;
99
use super::database_pools::DatabasePools;
1010
use crate::config::balance_capacity::BalanceCapacityConfig;
1111
use crate::config::cdn_log_storage::CdnLogStorageConfig;
12+
use crate::config::CdnLogQueueConfig;
1213
use crate::middleware::cargo_compat::StatusCodeConfig;
1314
use crate::storage::StorageConfig;
1415
use crates_io_env_vars::{list, list_parsed, required_var, var, var_parsed};
@@ -36,6 +37,7 @@ pub struct Server {
3637
pub db: DatabasePools,
3738
pub storage: StorageConfig,
3839
pub cdn_log_storage: CdnLogStorageConfig,
40+
pub cdn_log_queue: CdnLogQueueConfig,
3941
pub session_key: cookie::Key,
4042
pub gh_client_id: ClientId,
4143
pub gh_client_secret: ClientSecret,
@@ -175,6 +177,7 @@ impl Server {
175177
db: DatabasePools::full_from_environment(&base)?,
176178
storage,
177179
cdn_log_storage: CdnLogStorageConfig::from_env()?,
180+
cdn_log_queue: CdnLogQueueConfig::from_env()?,
178181
base,
179182
ip,
180183
port,

src/tests/util/test_app.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ use crate::util::chaosproxy::ChaosProxy;
33
use crate::util::github::{MockGitHubClient, MOCK_GITHUB_DATA};
44
use anyhow::Context;
55
use crates_io::config::{
6-
self, BalanceCapacityConfig, Base, CdnLogStorageConfig, DatabasePools, DbPoolConfig,
6+
self, BalanceCapacityConfig, Base, CdnLogQueueConfig, CdnLogStorageConfig, DatabasePools,
7+
DbPoolConfig,
78
};
89
use crates_io::middleware::cargo_compat::StatusCodeConfig;
910
use crates_io::models::token::{CrateScope, EndpointScope};
@@ -424,6 +425,7 @@ fn simple_config() -> config::Server {
424425
max_blocking_threads: None,
425426
db,
426427
storage,
428+
cdn_log_queue: CdnLogQueueConfig::Mock,
427429
cdn_log_storage: CdnLogStorageConfig::memory(),
428430
session_key: cookie::Key::derive_from("test this has to be over 32 bytes long".as_bytes()),
429431
gh_client_id: ClientId::new(dotenvy::var("GH_CLIENT_ID").unwrap_or_default()),

src/worker/jobs/downloads.rs

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
mod message;
22

3-
use crate::config::CdnLogStorageConfig;
4-
use crate::sqs::{SqsQueue, SqsQueueImpl};
3+
use crate::config::{CdnLogQueueConfig, CdnLogStorageConfig};
4+
use crate::sqs::{MockSqsQueue, SqsQueue, SqsQueueImpl};
55
use crate::tasks::spawn_blocking;
66
use crate::worker::Environment;
77
use anyhow::Context;
88
use aws_credential_types::Credentials;
99
use aws_sdk_sqs::config::Region;
1010
use crates_io_cdn_logs::{count_downloads, Decompressor};
11-
use crates_io_env_vars::required_var;
1211
use crates_io_worker::BackgroundJob;
1312
use object_store::aws::AmazonS3Builder;
1413
use object_store::local::LocalFileSystem;
@@ -152,14 +151,7 @@ impl BackgroundJob for ProcessCdnLogQueue {
152151
async fn run(&self, ctx: Self::Context) -> anyhow::Result<()> {
153152
const MAX_BATCH_SIZE: usize = 10;
154153

155-
let access_key = required_var("CDN_LOG_QUEUE_ACCESS_KEY")?;
156-
let secret_key = required_var("CDN_LOG_QUEUE_SECRET_KEY")?;
157-
let queue_url = required_var("CDN_LOG_QUEUE_URL")?;
158-
let region = required_var("CDN_LOG_QUEUE_REGION")?;
159-
160-
let credentials = Credentials::from_keys(access_key, secret_key, None);
161-
162-
let queue = SqsQueueImpl::new(queue_url, Region::new(region), credentials);
154+
let queue = Self::build_queue(&ctx.config.cdn_log_queue);
163155

164156
info!("Receiving messages from the CDN log queue…");
165157
let mut num_remaining = self.max_messages;
@@ -259,6 +251,29 @@ impl BackgroundJob for ProcessCdnLogQueue {
259251
}
260252
}
261253

254+
impl ProcessCdnLogQueue {
255+
fn build_queue(config: &CdnLogQueueConfig) -> Box<dyn SqsQueue + Send + Sync> {
256+
match config {
257+
CdnLogQueueConfig::Mock => Box::new(MockSqsQueue::new()),
258+
CdnLogQueueConfig::SQS {
259+
access_key,
260+
secret_key,
261+
region,
262+
queue_url,
263+
} => {
264+
use secrecy::ExposeSecret;
265+
266+
let secret_key = secret_key.expose_secret();
267+
let credentials = Credentials::from_keys(access_key, secret_key, None);
268+
269+
let region = Region::new(region.to_owned());
270+
271+
Box::new(SqsQueueImpl::new(queue_url, region, credentials))
272+
}
273+
}
274+
}
275+
}
276+
262277
#[cfg(test)]
263278
mod tests {
264279
use super::*;

0 commit comments

Comments
 (0)