Query metadata for a pulled image via an OSTree commit digest. The digest must refer to a pulled container image's merge commit.
(repo: &ostree::Repo, commit: &str)
| 1737 | /// Query metadata for a pulled image via an OSTree commit digest. |
| 1738 | /// The digest must refer to a pulled container image's merge commit. |
| 1739 | pub fn query_image_commit(repo: &ostree::Repo, commit: &str) -> Result<Box<LayeredImageState>> { |
| 1740 | let merge_commit = commit.to_string(); |
| 1741 | let merge_commit_obj = repo.load_commit(commit)?.0; |
| 1742 | let commit_meta = &merge_commit_obj.child_value(0); |
| 1743 | let commit_meta = &ostree::glib::VariantDict::new(Some(commit_meta)); |
| 1744 | let (manifest, manifest_digest) = manifest_data_from_commitmeta(commit_meta)?; |
| 1745 | let configuration = image_config_from_commitmeta(commit_meta)?; |
| 1746 | let mut layers = manifest.layers().iter().cloned(); |
| 1747 | // We require a base layer. |
| 1748 | let base_layer = layers.next().ok_or_else(|| anyhow!("No layers found"))?; |
| 1749 | let base_layer = query_layer(repo, base_layer)?; |
| 1750 | let ostree_ref = base_layer.ostree_ref.as_str(); |
| 1751 | let base_commit = base_layer |
| 1752 | .commit |
| 1753 | .ok_or_else(|| anyhow!("Missing base image ref {ostree_ref}"))?; |
| 1754 | |
| 1755 | let detached_commitmeta = |
| 1756 | repo.read_commit_detached_metadata(&merge_commit, gio::Cancellable::NONE)?; |
| 1757 | let detached_commitmeta = detached_commitmeta |
| 1758 | .as_ref() |
| 1759 | .map(|v| glib::VariantDict::new(Some(v))); |
| 1760 | let cached_update = detached_commitmeta |
| 1761 | .as_ref() |
| 1762 | .map(parse_cached_update) |
| 1763 | .transpose()? |
| 1764 | .flatten(); |
| 1765 | let state = Box::new(LayeredImageState { |
| 1766 | base_commit, |
| 1767 | merge_commit, |
| 1768 | manifest_digest, |
| 1769 | manifest, |
| 1770 | configuration, |
| 1771 | cached_update, |
| 1772 | // we can't cross-reference with a remote here |
| 1773 | verify_text: None, |
| 1774 | filtered_files: None, |
| 1775 | }); |
| 1776 | tracing::debug!("Wrote merge commit {}", state.merge_commit); |
| 1777 | Ok(state) |
| 1778 | } |
| 1779 | |
| 1780 | fn manifest_for_image(repo: &ostree::Repo, imgref: &ImageReference) -> Result<ImageManifest> { |
| 1781 | let ostree_ref = ref_for_image(imgref)?; |
no test coverage detected