diff --git a/lib/src/container/store.rs b/lib/src/container/store.rs index a731da35..46ccccd8 100644 --- a/lib/src/container/store.rs +++ b/lib/src/container/store.rs @@ -309,6 +309,11 @@ pub(crate) fn parse_manifest_layout<'a>( Vec<&'a Descriptor>, )> { let config_labels = config.config().as_ref().and_then(|c| c.labels().as_ref()); + let bootable_key = *ostree::METADATA_KEY_BOOTABLE; + let bootable = config_labels.map_or(false, |l| l.contains_key(bootable_key)); + if !bootable { + anyhow::bail!("Target image does not have {bootable_key} label"); + } let first_layer = manifest .layers() diff --git a/lib/src/fixture.rs b/lib/src/fixture.rs index 15aa2328..c9e86dcf 100644 --- a/lib/src/fixture.rs +++ b/lib/src/fixture.rs @@ -483,6 +483,7 @@ impl Fixture { ); metadata.insert("ostree.container-cmd", &vec!["/usr/bin/bash"]); metadata.insert("version", &"42.0"); + metadata.insert(*ostree::METADATA_KEY_BOOTABLE, &true); let metadata = metadata.to_variant(); let commit = self.srcrepo.write_commit_with_time( None, @@ -539,6 +540,7 @@ impl Fixture { // Load our base commit let rev = &self.srcrepo().require_rev(self.testref())?; let (commit, _) = self.srcrepo.load_commit(rev)?; + let metadata = commit.child_value(0); let root = ostree::MutableTree::from_commit(self.srcrepo(), rev)?; // Bump the commit timestamp by one day let ts = chrono::Utc.timestamp(ostree::commit_get_timestamp(&commit) as i64, 0); @@ -568,7 +570,15 @@ impl Fixture { let root = root.downcast_ref::().unwrap(); let commit = self .srcrepo - .write_commit_with_time(Some(rev), None, None, None, root, new_ts, cancellable) + .write_commit_with_time( + Some(rev), + None, + None, + Some(&metadata), + root, + new_ts, + cancellable, + ) .context("Writing commit")?; self.srcrepo .transaction_set_ref(None, self.testref(), Some(commit.as_str())); diff --git a/lib/tests/it/main.rs b/lib/tests/it/main.rs index f3f8cc33..0309be76 100644 --- a/lib/tests/it/main.rs +++ b/lib/tests/it/main.rs @@ -24,6 +24,7 @@ use ostree_ext::fixture::{FileDef, Fixture, CONTENTS_CHECKSUM_V0, CONTENTS_V0_LE const EXAMPLE_TAR_LAYER: &[u8] = include_bytes!("fixtures/hlinks.tar.gz"); const TEST_REGISTRY_DEFAULT: &str = "localhost:5000"; +#[track_caller] fn assert_err_contains(r: Result, s: impl AsRef) { let s = s.as_ref(); let msg = format!("{:#}", r.err().expect("Expecting an error"));