Skip to content

Commit 02d5cd3

Browse files
authored
Merge pull request #1071 from cgwalters/uncache-pending
ostree-ext: Add `image clear-cached-update`
2 parents 63f49d3 + 71f8346 commit 02d5cd3

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

ostree-ext/src/cli.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,17 @@ pub(crate) enum ContainerImageOpts {
277277
config: bool,
278278
},
279279

280+
/// Remove metadata for a cached update.
281+
ClearCachedUpdate {
282+
/// Path to the repository
283+
#[clap(long, value_parser)]
284+
repo: Utf8PathBuf,
285+
286+
/// Container image reference, e.g. registry:quay.io/exampleos/exampleos:latest
287+
#[clap(value_parser = parse_base_imgref)]
288+
imgref: ImageReference,
289+
},
290+
280291
/// Copy a pulled container image from one repo to another.
281292
Copy {
282293
/// Path to the source repository
@@ -1132,6 +1143,11 @@ async fn run_from_opt(opt: Opt) -> Result<()> {
11321143
stdout.flush()?;
11331144
Ok(())
11341145
}
1146+
ContainerImageOpts::ClearCachedUpdate { repo, imgref } => {
1147+
let repo = parse_repo(&repo)?;
1148+
crate::container::store::clear_cached_update(&repo, &imgref)?;
1149+
Ok(())
1150+
}
11351151
ContainerImageOpts::Remove {
11361152
repo,
11371153
imgrefs,

ostree-ext/src/container/store.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ use futures_util::TryFutureExt;
2323
use oci_spec::image::{
2424
self as oci_image, Arch, Descriptor, Digest, History, ImageConfiguration, ImageManifest,
2525
};
26+
use ostree::glib::FromVariant;
2627
use ostree::prelude::{Cast, FileEnumeratorExt, FileExt, ToVariant};
2728
use ostree::{gio, glib};
28-
use std::collections::{BTreeSet, HashMap};
29+
use std::collections::{BTreeMap, BTreeSet, HashMap};
2930
use std::iter::FromIterator;
3031
use tokio::sync::mpsc::{Receiver, Sender};
3132

@@ -1196,6 +1197,37 @@ fn parse_cached_update(meta: &glib::VariantDict) -> Result<Option<CachedImageUpd
11961197
}))
11971198
}
11981199

1200+
/// Remove any cached
1201+
#[context("Clearing cached update {imgref}")]
1202+
pub fn clear_cached_update(repo: &ostree::Repo, imgref: &ImageReference) -> Result<()> {
1203+
let cancellable = gio::Cancellable::NONE;
1204+
let ostree_ref = ref_for_image(imgref)?;
1205+
let rev = repo.require_rev(&ostree_ref)?;
1206+
let Some(commitmeta) = repo.read_commit_detached_metadata(&rev, cancellable)? else {
1207+
return Ok(());
1208+
};
1209+
1210+
// SAFETY: We know this is an a{sv}
1211+
let mut commitmeta: BTreeMap<String, glib::Variant> =
1212+
BTreeMap::from_variant(&commitmeta).unwrap();
1213+
let mut changed = false;
1214+
for key in [
1215+
ImageImporter::CACHED_KEY_CONFIG,
1216+
ImageImporter::CACHED_KEY_MANIFEST,
1217+
ImageImporter::CACHED_KEY_MANIFEST_DIGEST,
1218+
] {
1219+
if commitmeta.remove(key).is_some() {
1220+
changed = true;
1221+
}
1222+
}
1223+
if !changed {
1224+
return Ok(());
1225+
}
1226+
let commitmeta = glib::Variant::from(commitmeta);
1227+
repo.write_commit_detached_metadata(&rev, Some(&commitmeta), cancellable)?;
1228+
Ok(())
1229+
}
1230+
11991231
/// Query metadata for a pulled image via an OSTree commit digest.
12001232
/// The digest must refer to a pulled container image's merge commit.
12011233
pub fn query_image_commit(repo: &ostree::Repo, commit: &str) -> Result<Box<LayeredImageState>> {

0 commit comments

Comments
 (0)