openat = "0.1.19"
openat-ext = "0.1.4"
nix = "0.17.0"
+# See discussion in https://github.com/coreos/rpm-ostree/pull/2569#issuecomment-780569188
+# Currently pinned to a hash, but after the next stable release let's switch to tags
+rpmostree-client = { git = "https://github.com/coreos/rpm-ostree", rev = "170095bd60ec8802afeea42d120fb2e88298648f" }
# This one I might publish to crates.io, not sure yet
with-procspawn-tempdir = { git = "https://github.com/cgwalters/with-procspawn-tempdir" }
use strum::IntoEnumIterator;
use strum_macros::EnumIter;
-use crate::rpmostree;
use crate::test::*;
const ORIGREF: &'static str = "orig-booted";
let mut mark: RebootMark = serde_json::from_str(markstr)
.with_context(|| format!("Failed to parse reboot mark {:?}", markstr))?;
// The first failed reboot may be into the original booted commit
- let status = rpmostree::query_status()?;
+ let status = rpmostree_client::query_status().map_err(anyhow::Error::msg)?;
let firstdeploy = &status.deployments[0];
// The first deployment should not be staged
assert!(!firstdeploy.staged.unwrap_or(false));
/// In the case where we did a kill -9 of rpm-ostree, check the state
fn validate_live_interrupted_upgrade(commitstates: &CommitStates) -> Result<UpdateResult> {
- let status = rpmostree::query_status()?;
+ let status = rpmostree_client::query_status().map_err(anyhow::Error::msg)?;
let firstdeploy = &status.deployments[0];
let pending_commit = firstdeploy.checksum.as_str();
let res = if firstdeploy.staged.unwrap_or(false) {
} else {
live_strategy = Some(strategy);
}
- let status = rpmostree::query_status()?;
+ let status = rpmostree_client::query_status().map_err(anyhow::Error::msg)?;
let firstdeploy = &status.deployments[0];
let pending_commit = firstdeploy.checksum.as_str();
validate_pending_commit(pending_commit, &commitstates)
+++ /dev/null
-use anyhow::{Context, Result};
-use serde_derive::Deserialize;
-use std::process::Command;
-
-#[derive(Deserialize)]
-#[serde(rename_all = "kebab-case")]
-#[allow(unused)]
-pub(crate) struct Status {
- pub(crate) deployments: Vec<Deployment>,
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "kebab-case")]
-#[allow(unused)]
-pub(crate) struct Deployment {
- pub(crate) unlocked: Option<String>,
- pub(crate) osname: String,
- pub(crate) pinned: bool,
- pub(crate) checksum: String,
- pub(crate) staged: Option<bool>,
- pub(crate) booted: bool,
- pub(crate) serial: u32,
- pub(crate) origin: String,
-}
-
-pub(crate) fn query_status() -> Result<Status> {
- // Retry on temporary activation failures, see
- // https://github.com/coreos/rpm-ostree/issues/2531
- let pause = std::time::Duration::from_secs(1);
- let mut retries = 0;
- let cmd_res = loop {
- retries += 1;
- let res = Command::new("rpm-ostree")
- .args(&["status", "--json"])
- .output()
- .context("failed to spawn 'rpm-ostree status'")?;
-
- if res.status.success() || retries >= 10 {
- break res;
- }
- std::thread::sleep(pause);
- };
-
- if !cmd_res.status.success() {
- anyhow::bail!(
- "running 'rpm-ostree status' failed: {}",
- String::from_utf8_lossy(&cmd_res.stderr)
- );
- }
-
- serde_json::from_slice(&cmd_res.stdout).context("failed to parse 'rpm-ostree status' output")
-}