diff options
| -rw-r--r-- | src/db.rs | 3 | ||||
| -rw-r--r-- | src/registry.rs | 98 | ||||
| -rw-r--r-- | src/updater.rs | 131 |
3 files changed, 102 insertions, 130 deletions
@@ -11,8 +11,9 @@ pub struct Image { } pub trait Db { - fn get_image(&self, registry: &str, image: &str) -> Option<Image>; fn insert_image(&self, image: &mut Image); + + fn get_image(&self, registry: &str, image: &str) -> Option<Image>; fn get_expired_images(&self, now: &DateTime<Utc>) -> Vec<Image>; fn get_tags_sorted(&self, image_id: i64) -> Vec<String>; fn delete_tag(&self, image_id: i64, tag: &str); diff --git a/src/registry.rs b/src/registry.rs index 173f8a7..c1ab4b7 100644 --- a/src/registry.rs +++ b/src/registry.rs @@ -324,11 +324,11 @@ impl Registries for HttpRegistry { } #[cfg(test)] -struct StubTag { - registry: String, - image: String, - tag: String, - digest: String, +pub struct StubTag { + pub registry: String, + pub image: String, + pub tag: String, + pub digest: String, } #[cfg(test)] @@ -338,25 +338,13 @@ pub struct StubRegistry { } #[cfg(test)] -impl Default for StubRegistry { - fn default() -> Self { +impl StubRegistry { + pub fn new(tags: Vec<StubTag>) -> Self { return StubRegistry { - entries: RefCell::new(vec![]), + entries: RefCell::new(tags), tags_calls: RefCell::new(HashMap::new()), }; } -} - -#[cfg(test)] -impl StubRegistry { - pub fn add_tag(&self, registry: &str, image: &str, tag: &str, digest: &str) { - self.entries.borrow_mut().push(StubTag { - registry: registry.to_string(), - image: image.to_string(), - tag: tag.to_string(), - digest: digest.to_string(), - }); - } pub fn set_digest(&self, registry: &str, image: &str, tag: &str, digest: &str) { for entry in self.entries.borrow_mut().iter_mut() { @@ -410,65 +398,47 @@ impl Registries for StubRegistry { mod tests { use super::*; - fn test_get_tags_returns_none_for_unknown(reg: &dyn Registries) { - assert_eq!(reg.get_tags("docker.io", "unknown"), None); + #[test] + fn get_tags_returns_none_for_unknown() { + let stub = StubRegistry::new(vec![]); + assert_eq!(stub.get_tags("docker.io", "unknown"), None); } - fn test_get_tags_returns_all(reg: &dyn Registries, stub: &StubRegistry) { - stub.add_tag("docker.io", "nginx", "1.21", "sha256:abc"); - stub.add_tag("docker.io", "nginx", "1.20", "sha256:def"); - stub.add_tag("docker.io", "nginx", "latest", "sha256:ghi"); - let mut tags = reg.get_tags("docker.io", "nginx").unwrap(); + #[test] + fn get_tags_returns_all() { + let stub = StubRegistry::new(vec![ + StubTag { registry: "docker.io".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:abc".into() }, + StubTag { registry: "docker.io".into(), image: "nginx".into(), tag: "1.20".into(), digest: "sha256:def".into() }, + StubTag { registry: "docker.io".into(), image: "nginx".into(), tag: "latest".into(), digest: "sha256:ghi".into() }, + ]); + let mut tags = stub.get_tags("docker.io", "nginx").unwrap(); tags.sort(); assert_eq!(tags, vec!["1.20", "1.21", "latest"]); } - fn test_get_digest_returns_none_for_unknown(reg: &dyn Registries) { - assert_eq!(reg.get_digest("docker.io", "nginx", "1.21"), None); - } - - fn test_get_digest_returns_digest(reg: &dyn Registries, stub: &StubRegistry) { - stub.add_tag("docker.io", "nginx", "1.21", "sha256:abc123"); - - assert_eq!(reg.get_digest("docker.io", "nginx", "1.21"), Some("sha256:abc123".to_string())); - } - - fn test_set_digest_updates_existing(reg: &dyn Registries, stub: &StubRegistry) { - stub.add_tag("docker.io", "nginx", "1.21", "sha256:old"); - stub.set_digest("docker.io", "nginx", "1.21", "sha256:new"); - - assert_eq!(reg.get_digest("docker.io", "nginx", "1.21"), Some("sha256:new".to_string())); - } - #[test] - fn conformance_stub_get_tags_unknown() { - let stub = StubRegistry::default(); - test_get_tags_returns_none_for_unknown(&stub); + fn get_digest_returns_none_for_unknown() { + let stub = StubRegistry::new(vec![]); + assert_eq!(stub.get_digest("docker.io", "nginx", "1.21"), None); } #[test] - fn conformance_stub_get_tags_all() { - let stub = StubRegistry::default(); - test_get_tags_returns_all(&stub, &stub); + fn get_digest_returns_digest() { + let stub = StubRegistry::new(vec![ + StubTag { registry: "docker.io".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:abc123".into() }, + ]); + assert_eq!(stub.get_digest("docker.io", "nginx", "1.21"), Some("sha256:abc123".to_string())); } #[test] - fn conformance_stub_get_digest_unknown() { - let stub = StubRegistry::default(); - test_get_digest_returns_none_for_unknown(&stub); - } - - #[test] - fn conformance_stub_get_digest() { - let stub = StubRegistry::default(); - test_get_digest_returns_digest(&stub, &stub); - } + fn set_digest_updates_existing() { + let stub = StubRegistry::new(vec![ + StubTag { registry: "docker.io".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:old".into() }, + ]); + stub.set_digest("docker.io", "nginx", "1.21", "sha256:new"); - #[test] - fn conformance_stub_set_digest() { - let stub = StubRegistry::default(); - test_set_digest_updates_existing(&stub, &stub); + assert_eq!(stub.get_digest("docker.io", "nginx", "1.21"), Some("sha256:new".to_string())); } #[cfg(feature = "integration")] diff --git a/src/updater.rs b/src/updater.rs index 1aba08f..a828e57 100644 --- a/src/updater.rs +++ b/src/updater.rs @@ -205,7 +205,7 @@ pub fn update_images(now: &DateTime<Utc>, db: &dyn Db, reg: &dyn Registries, fil mod tests { use super::*; use crate::db::StubDb; - use crate::registry::StubRegistry; + use crate::registry::{StubRegistry, StubTag}; use chrono::TimeZone; #[test] @@ -213,15 +213,16 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000001".into() }, + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.22".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000002".into() }, + ]); let past_expiry = now - chrono::Duration::days(1); let mut img = Image { id: 0, registry: "registry.hub.docker.com".into(), image: "nginx".into(), expires_at: past_expiry }; db.insert_image(&mut img); db.insert_tag(img.id, "1.20", &past_expiry); db.insert_tag(img.id, "1.21", &past_expiry); - reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000001"); - reg.add_tag("registry.hub.docker.com", "nginx", "1.22", "sha256:0000000000000000000000000000000000000000000000000000000000000002"); let files = vec![FileInput { path: "/test".into(), @@ -241,7 +242,7 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); + let reg = StubRegistry::new(vec![]); let future_expiry = now + chrono::Duration::minutes(30); let mut img = Image { id: 0, registry: "registry.hub.docker.com".into(), image: "nginx".into(), expires_at: future_expiry }; @@ -264,9 +265,9 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); - - reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000001"); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000001".into() }, + ]); let files = vec![FileInput { path: "/test".into(), @@ -284,10 +285,10 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); - - reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000001"); - reg.add_tag("registry.hub.docker.com", "nginx", "1.22", "sha256:0000000000000000000000000000000000000000000000000000000000000002"); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000001".into() }, + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.22".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000002".into() }, + ]); let files = vec![FileInput { path: "/test".into(), @@ -305,11 +306,11 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); - - reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000001"); - reg.add_tag("registry.hub.docker.com", "nginx", "1.22", "sha256:0000000000000000000000000000000000000000000000000000000000000002"); - reg.add_tag("registry.hub.docker.com", "nginx", "1.25", "sha256:0000000000000000000000000000000000000000000000000000000000000003"); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000001".into() }, + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.22".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000002".into() }, + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.25".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000003".into() }, + ]); let files = vec![FileInput { path: "/test".into(), @@ -327,9 +328,9 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); - - reg.add_tag("registry.hub.docker.com", "nginx", "latest", "sha256:0000000000000000000000000000000000000000000000000000000000000001"); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "latest".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000001".into() }, + ]); let files = vec![FileInput { path: "/test".into(), @@ -349,7 +350,7 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); + let reg = StubRegistry::new(vec![]); let future_expiry = now + chrono::Duration::minutes(30); let mut img = Image { id: 0, registry: "registry.hub.docker.com".into(), image: "nginx".into(), expires_at: future_expiry }; @@ -375,9 +376,9 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); - - reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000004"); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000004".into() }, + ]); let files = vec![FileInput { path: "/test".into(), @@ -397,9 +398,9 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); - - reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000002"); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000002".into() }, + ]); let files = vec![FileInput { path: "/test".into(), @@ -417,9 +418,9 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); - - reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000002"); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000002".into() }, + ]); let files = vec![FileInput { path: "/test".into(), @@ -439,10 +440,10 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); - - reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000001"); - reg.add_tag("registry.hub.docker.com", "nginx", "1.22", "sha256:0000000000000000000000000000000000000000000000000000000000000002"); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000001".into() }, + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.22".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000002".into() }, + ]); let files = vec![FileInput { path: "/test".into(), @@ -463,7 +464,7 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); + let reg = StubRegistry::new(vec![]); let files = vec![FileInput { path: "/test".into(), @@ -484,9 +485,9 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); - - reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000001"); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000001".into() }, + ]); let files = vec![FileInput { path: "/test".into(), @@ -504,12 +505,12 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); - - reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000001"); - reg.add_tag("registry.hub.docker.com", "nginx", "1.22", "sha256:0000000000000000000000000000000000000000000000000000000000000002"); - reg.add_tag("registry.hub.docker.com", "redis", "6.0", "sha256:0000000000000000000000000000000000000000000000000000000000000003"); - reg.add_tag("registry.hub.docker.com", "redis", "6.2", "sha256:0000000000000000000000000000000000000000000000000000000000000004"); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000001".into() }, + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.22".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000002".into() }, + StubTag { registry: "registry.hub.docker.com".into(), image: "redis".into(), tag: "6.0".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000003".into() }, + StubTag { registry: "registry.hub.docker.com".into(), image: "redis".into(), tag: "6.2".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000004".into() }, + ]); let files = vec![FileInput { path: "/test".into(), @@ -528,12 +529,12 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); - - reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000001"); - reg.add_tag("registry.hub.docker.com", "nginx", "1.22", "sha256:0000000000000000000000000000000000000000000000000000000000000002"); - reg.add_tag("registry.hub.docker.com", "redis", "6.0", "sha256:0000000000000000000000000000000000000000000000000000000000000003"); - reg.add_tag("registry.hub.docker.com", "redis", "6.2", "sha256:0000000000000000000000000000000000000000000000000000000000000004"); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000001".into() }, + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.22".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000002".into() }, + StubTag { registry: "registry.hub.docker.com".into(), image: "redis".into(), tag: "6.0".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000003".into() }, + StubTag { registry: "registry.hub.docker.com".into(), image: "redis".into(), tag: "6.2".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000004".into() }, + ]); let files = vec![FileInput { path: "/test".into(), @@ -552,10 +553,10 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); - - reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000001"); - reg.add_tag("registry.hub.docker.com", "nginx", "1.22", "sha256:0000000000000000000000000000000000000000000000000000000000000002"); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000001".into() }, + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.22".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000002".into() }, + ]); let files = vec![ FileInput { @@ -582,7 +583,9 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000005".into() }, + ]); let past_expiry = now - chrono::Duration::days(1); let mut img = Image { id: 0, registry: "registry.hub.docker.com".into(), image: "nginx".into(), expires_at: past_expiry }; @@ -590,8 +593,6 @@ mod tests { db.insert_tag(img.id, "1.21", &past_expiry); db.update_tag_digest(img.id, "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000003", &past_expiry); - reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000005"); - let files = vec![FileInput { path: "/test".into(), content: "image: nginx:1.21@sha256:0000000000000000000000000000000000000000000000000000000000000001".into(), @@ -609,10 +610,10 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); - - reg.add_tag("registry.hub.docker.com", "redis", "6.0", "sha256:0000000000000000000000000000000000000000000000000000000000000001"); - reg.add_tag("registry.hub.docker.com", "redis", "6.2", "sha256:0000000000000000000000000000000000000000000000000000000000000002"); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "redis".into(), tag: "6.0".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000001".into() }, + StubTag { registry: "registry.hub.docker.com".into(), image: "redis".into(), tag: "6.2".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000002".into() }, + ]); let files = vec![FileInput { path: "/test".into(), @@ -633,10 +634,10 @@ mod tests { crate::metrics::init(); let now = Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap(); let db = StubDb::default(); - let reg = StubRegistry::default(); - - reg.add_tag("registry.hub.docker.com", "nginx", "1.21", "sha256:0000000000000000000000000000000000000000000000000000000000000001"); - reg.add_tag("registry.hub.docker.com", "nginx", "1.22", "sha256:0000000000000000000000000000000000000000000000000000000000000002"); + let reg = StubRegistry::new(vec![ + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.21".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000001".into() }, + StubTag { registry: "registry.hub.docker.com".into(), image: "nginx".into(), tag: "1.22".into(), digest: "sha256:0000000000000000000000000000000000000000000000000000000000000002".into() }, + ]); let files = vec![ FileInput { path: "/a".into(), content: "image: nginx:1.21".into(), images: vec![7..17] }, |
