pub fn is_aws_ecr_uri(image: &str) -> bool {
let Some((registry, _path)) = image.split_once('/') else {
return false;
};
registry.contains(".dkr.ecr.") && registry.ends_with(".amazonaws.com")
}
pub fn translate_to_local(image: &str, server_port: u16) -> Option<String> {
translate_to_local_at(image, "127.0.0.1", server_port)
}
pub fn translate_to_local_at(image: &str, host: &str, server_port: u16) -> Option<String> {
if !is_aws_ecr_uri(image) {
return None;
}
let (_registry, path) = image.split_once('/')?;
if path.is_empty() {
return None;
}
Some(format!("{host}:{server_port}/{path}"))
}
pub fn is_digest_ref(image: &str) -> bool {
image.contains("@sha256:")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn detects_private_ecr_uri() {
assert!(is_aws_ecr_uri(
"123456789012.dkr.ecr.us-east-1.amazonaws.com/repo:tag"
));
assert!(is_aws_ecr_uri(
"123456789012.dkr.ecr.eu-west-2.amazonaws.com/team/svc:v1"
));
assert!(!is_aws_ecr_uri("public.ecr.aws/lambda/python:3.12"));
assert!(!is_aws_ecr_uri("docker.io/library/alpine:3.20"));
assert!(!is_aws_ecr_uri("alpine:3.20"));
assert!(!is_aws_ecr_uri(
"docker.io/team/evil.dkr.ecr.us-east-1.amazonaws.com/repo:tag"
));
}
#[test]
fn detects_digest_ref() {
assert!(is_digest_ref(
"123456789012.dkr.ecr.us-east-1.amazonaws.com/repo@sha256:abc"
));
assert!(!is_digest_ref(
"123456789012.dkr.ecr.us-east-1.amazonaws.com/repo:tag"
));
}
#[test]
fn translates_private_ecr_uri() {
assert_eq!(
translate_to_local(
"123456789012.dkr.ecr.us-east-1.amazonaws.com/repo:tag",
4566
),
Some("127.0.0.1:4566/repo:tag".to_string())
);
assert_eq!(
translate_to_local(
"123456789012.dkr.ecr.us-east-1.amazonaws.com/team/svc:v1",
8080
),
Some("127.0.0.1:8080/team/svc:v1".to_string())
);
assert_eq!(
translate_to_local(
"123456789012.dkr.ecr.us-east-1.amazonaws.com/repo@sha256:abc",
4566
),
Some("127.0.0.1:4566/repo@sha256:abc".to_string())
);
assert_eq!(translate_to_local("alpine:3.20", 4566), None);
assert_eq!(
translate_to_local("public.ecr.aws/lambda/python:3.12", 4566),
None
);
}
#[test]
fn rejects_empty_path() {
assert_eq!(
translate_to_local("123456789012.dkr.ecr.us-east-1.amazonaws.com/", 4566),
None
);
}
#[test]
fn translate_to_local_at_overrides_host() {
assert_eq!(
translate_to_local_at(
"123456789012.dkr.ecr.us-east-1.amazonaws.com/repo:tag",
"fakecloud.fakecloud.svc.cluster.local",
4566
),
Some("fakecloud.fakecloud.svc.cluster.local:4566/repo:tag".to_string())
);
}
#[test]
fn translate_to_local_at_returns_none_for_non_ecr() {
assert_eq!(translate_to_local_at("alpine:3.20", "anything", 4566), None);
}
}