fix: Add logic for inspecting multi-manifest images

This commit is contained in:
Gerald Pinder 2024-11-25 23:40:51 -05:00
parent 816a6a5ddd
commit 2b7305c5d0
6 changed files with 105 additions and 39 deletions

View file

@ -1,5 +1,4 @@
use std::{
collections::HashMap,
env,
io::Write,
path::Path,
@ -21,6 +20,8 @@ use semver::Version;
use serde::Deserialize;
use tempfile::TempDir;
mod metadata;
use crate::{
drivers::{
opts::{
@ -35,37 +36,6 @@ use crate::{
signal_handler::{add_cid, remove_cid, ContainerId, ContainerRuntime},
};
#[derive(Deserialize, Debug, Clone)]
struct DockerImageMetadata {
manifest: DockerImageMetadataManifest,
image: DockerImageMetadataImage,
}
#[derive(Deserialize, Debug, Clone)]
struct DockerImageMetadataManifest {
digest: String,
}
#[derive(Deserialize, Debug, Clone)]
struct DockerImageMetadataImage {
config: DockerImageConfig,
}
#[derive(Deserialize, Debug, Clone)]
#[serde(rename_all = "PascalCase")]
struct DockerImageConfig {
labels: HashMap<String, serde_json::Value>,
}
impl From<DockerImageMetadata> for ImageMetadata {
fn from(value: DockerImageMetadata) -> Self {
Self {
labels: value.image.config.labels,
digest: value.manifest.digest,
}
}
}
#[derive(Debug, Deserialize)]
struct DockerVerisonJsonClient {
#[serde(alias = "Version")]
@ -396,10 +366,10 @@ fn get_metadata_cache(opts: &GetMetadataOpts) -> Result<ImageMetadata> {
bail!("Failed to inspect image {url}")
}
serde_json::from_slice::<DockerImageMetadata>(&output.stdout)
serde_json::from_slice::<metadata::Metadata>(&output.stdout)
.into_diagnostic()
.inspect(|metadata| trace!("{metadata:#?}"))
.map(ImageMetadata::from)
.and_then(|metadata| ImageMetadata::try_from((metadata, opts.platform)))
.inspect(|metadata| trace!("{metadata:#?}"))
}