Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,226 changes: 790 additions & 436 deletions Cargo.lock

Large diffs are not rendered by default.

7 changes: 4 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
[package]
name = "cvmfs_server_scraper"
version = "0.0.6"
version = "0.0.7"
edition = "2021"
rust-version = "1.85"
authors = ["Terje Kvernes <terje@kvernes.no>"]
license = "MIT"
description = "A scraper for CVMFS servers"
Expand All @@ -13,7 +14,7 @@ keywords = ["cvmfs", "scraper", "monitoring", "eessi"]
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1"
reqwest = { version = "0", features = ["json"] }
reqwest = { version = "0.13", features = ["json"] }
tokio = { version = "1", features = ["full"] }
thiserror = "2"
semver = "1"
Expand All @@ -22,4 +23,4 @@ yare = "3"
futures = "0.3"
log = "0.4"
lazy_static = "1"
rand = "0"
rand = "0.10"
10 changes: 10 additions & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this will adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) once
we reach version 0.1.0, up until then, expect breaking changes.

## [0.0.7] - 2026-06-08

### Changed

- Updated dependencies, including moving to the current `reqwest` 0.13 and `rand` 0.10 lines.
- Set the minimum supported Rust version to 1.85.
- `ScrapedServer::Populated` now stores `PopulatedServer` behind a `Box` to reduce enum size. Consumers that directly pattern match on this variant may need to dereference or unbox the value.
- Added `ScrapedServer` helper methods: `is_populated`, `as_populated_server`, `as_failed_server`, `into_populated_server`, and `into_failed_server`.
- Removed the inherent `Hostname::to_string` method; use the standard `ToString` implementation from `Display` instead.

## [0.0.6] - 2025-10-20

### Added
Expand Down
9 changes: 3 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,13 @@ async fn main() -> Result<(), CVMFSScraperError> {
.with_servers(servers) // Transitions to a WithServer state.
.validate()? // Transitions to a ValidatedAndReady state, now immutable.
.scrape().await; // Perform the scrape, return servers.
for server in scraped_servers {
match server {
ScrapedServer::Populated(populated_server) => {
for server in &scraped_servers {
if let Some(populated_server) = server.as_populated_server() {
println!("{}", populated_server);
populated_server.output();
println!();
}
ScrapedServer::Failed(failed_server) => {
} else if let Some(failed_server) = server.as_failed_server() {
panic!("Error! {} failed scraping: {:?}", failed_server.hostname, failed_server.error);
}
}
}
Ok(())
Expand Down
7 changes: 3 additions & 4 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,6 @@ pub use scraper::{Scraper, ScraperCommon};
#[cfg(test)]
mod tests {
use super::*;
use tokio;

use futures::future::join_all;

Expand Down Expand Up @@ -205,8 +204,8 @@ mod tests {

let repoparams: Vec<String> = Vec::new();
let popserver = server.scrape(repoparams, vec![], false, None).await;
assert!(popserver.is_ok());
let popserver = popserver.get_populated_server().unwrap();
assert!(popserver.is_populated());
let popserver = popserver.as_populated_server().unwrap();
assert_eq!(popserver.backend_type, ServerBackendType::AutoDetect);
assert_eq!(popserver.backend_detected, ServerBackendType::CVMFS);
}
Expand Down Expand Up @@ -351,7 +350,7 @@ mod tests {
for result in results {
match result {
ScrapedServer::Populated(popserver) => {
for repo in vec!["software.eessi.io", "dev.eessi.io", "riscv.eessi.io"] {
for repo in ["software.eessi.io", "dev.eessi.io", "riscv.eessi.io"] {
assert!(popserver.has_repository(repo));
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/models/cvmfs_published.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ use crate::utilities::{parse_boolean_field, parse_hex_field, parse_number_field}
/// - y: Cryptographic hash of the reflog checksum
/// - l: currently unused (reserved for micro catalogs)
/// - signature: In order to provide authoritative information about a repository publisher, the
/// repository manifest is signed by an X.509 certificate together with its private key.
/// This field is not validated by this library.
/// repository manifest is signed by an X.509 certificate together with its private key.
/// This field is not validated by this library.
///
/// Note that the field names are lowercase, but the field names in the manifest itself are uppercase.
///
Expand Down
4 changes: 0 additions & 4 deletions src/models/generic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,6 @@ impl Hostname {
pub fn to_str(&self) -> &str {
&self.0
}

pub fn to_string(&self) -> String {
self.0.clone()
}
}

/// A hexadecimal string.
Expand Down
17 changes: 9 additions & 8 deletions src/models/geoapi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,14 +113,14 @@ mod tests {
}

#[parameterized(
failing_120 = { vec![1,2,0] },
failing_120 = { vec![1,2,0] },
failing_102 = { vec![1,0,2] },
failing_021 = { vec![0,2,1] },
failing_201 = { vec![2,0,1] },
failing_210 = { vec![2,1,0] },
failing_empty_response = { vec![] },
failing_not_enough_response = { vec![0,1] },
failing_too_many_responses = { vec![0,1,2,3] }
failing_too_many_responses = { vec![0,1,2,3] }
)]
fn test_check_against_expected_order_by_id_failure(res: Vec<u32>) {
let geoapi = create_geoapi_server_query();
Expand Down Expand Up @@ -170,11 +170,12 @@ mod tests {
"cvmfs-s1fnal.opensciencegrid.org".parse().unwrap(),
"cvmfs-stratum-one.cern.ch".parse().unwrap(),
"cvmfs-stratum-one.ihep.ac.cn".parse().unwrap(),
"cvmfs-stratum-one.ihep.ac.cn".parse().unwrap(),
"cvmfs-stratum-one.ihep.ac.cn".parse().unwrap(),
]})]
fn test_check_against_expected_order_by_hostname_failure(res: Vec<Hostname>) {
let geoapi = create_geoapi_server_query();
assert!(!geoapi.check_against_expected_order_by_hostname(res).unwrap());
}

fn test_check_against_expected_order_by_hostname_failure(res: Vec<Hostname>) {
let geoapi = create_geoapi_server_query();
assert!(!geoapi
.check_against_expected_order_by_hostname(res)
.unwrap());
}
}
Loading
Loading