feature(oci): use local index as resolution cache when appropriate, fixes #289 (#294)

This commit is contained in:
Alex Zenla
2024-07-31 16:05:15 -07:00
committed by GitHub
parent 902fffe207
commit 8216ab3602
9 changed files with 72 additions and 5 deletions

View File

@ -4,6 +4,7 @@ use crate::{
schema::OciSchema,
};
use crate::fetch::OciResolvedImage;
use anyhow::Result;
use log::{debug, error};
use oci_spec::image::{
@ -50,6 +51,51 @@ impl OciPackerCache {
Ok(index.manifests().clone())
}
pub async fn resolve(
&self,
name: ImageName,
format: OciPackedFormat,
) -> Result<Option<OciResolvedImage>> {
if name.reference.as_deref() == Some("latest") {
return Ok(None);
}
let name_str = name.to_string();
let index = self.index.read().await;
let mut descriptor: Option<Descriptor> = None;
for manifest in index.manifests() {
let Some(name) = manifest
.annotations()
.clone()
.unwrap_or_default()
.get(ANNOTATION_IMAGE_NAME)
.cloned()
else {
continue;
};
if name == name_str {
descriptor = Some(manifest.clone());
}
}
let Some(descriptor) = descriptor else {
return Ok(None);
};
debug!("resolve hit name={} digest={}", name, descriptor.digest());
self.recall(name, descriptor.digest().as_ref(), format)
.await
.map(|image| {
image.map(|i| OciResolvedImage {
name: i.name,
digest: i.digest,
descriptor: i.descriptor,
manifest: i.manifest,
})
})
}
pub async fn recall(
&self,
name: ImageName,