use serde::Deserialize;
use std::collections::HashMap;
const DEFAULT_CONFIG_PATH: &str = "/etc/pelagos/registries.toml";
const ENV_VAR: &str = "PELAGOS_REGISTRIES";
#[derive(Debug, Default, Deserialize)]
struct RegistriesConfig {
#[serde(default)]
mirrors: HashMap<String, Vec<String>>,
}
pub fn mirrors_for(registry: &str) -> Vec<String> {
let path = std::env::var(ENV_VAR).unwrap_or_else(|_| DEFAULT_CONFIG_PATH.to_string());
let text = match std::fs::read_to_string(&path) {
Ok(t) => t,
Err(_) => return vec![],
};
let config: RegistriesConfig = match toml::from_str(&text) {
Ok(c) => c,
Err(e) => {
log::warn!("registries config parse error ({}): {}", path, e);
return vec![];
}
};
let key = normalise_registry_key(registry);
config.mirrors.get(&key).cloned().unwrap_or_default()
}
pub fn rewrite_reference(reference: &str, mirror_endpoint: &str) -> String {
let mirror_host = mirror_endpoint
.trim_end_matches('/')
.trim_start_matches("https://")
.trim_start_matches("http://");
if let Some(slash) = reference.find('/') {
format!("{}/{}", mirror_host, &reference[slash + 1..])
} else {
format!("{}/{}", mirror_host, reference)
}
}
pub fn is_insecure_endpoint(endpoint: &str) -> bool {
endpoint.starts_with("http://")
}
fn normalise_registry_key(registry: &str) -> String {
let r = registry
.trim_end_matches('/')
.trim_start_matches("https://")
.trim_start_matches("http://");
if r == "index.docker.io" {
return "docker.io".to_string();
}
r.to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_rewrite_reference_docker() {
let out = rewrite_reference("docker.io/library/alpine:latest", "http://nazgul:5000");
assert_eq!(out, "nazgul:5000/library/alpine:latest");
}
#[test]
fn test_rewrite_reference_https_mirror() {
let out = rewrite_reference("registry.k8s.io/pause:3.9", "https://mirror.example.com");
assert_eq!(out, "mirror.example.com/pause:3.9");
}
#[test]
fn test_is_insecure_endpoint() {
assert!(is_insecure_endpoint("http://nazgul:5000"));
assert!(!is_insecure_endpoint("https://mirror.example.com"));
}
#[test]
fn test_normalise_registry_key_index_docker_io() {
assert_eq!(normalise_registry_key("index.docker.io"), "docker.io");
}
}