Skip to content

Commit

Permalink
install: Make stateroot configurable
Browse files Browse the repository at this point in the history
This commit makes it so that the `bootc install` stateroot will be
configurable (it defaults to `default`). For now this is a hidden CLI
option until we decide whether we want to commit to this API.

In the future we also want to make the stateroot of `bootc switch` be
configurable (containers#617) so that
users can install an image to a new stateroot while they already have an
existing stateroot

Also removed the constant `STATEROOT_DEFAULT`, we're now simply taking
it from the `ostree_ext` crate

Signed-off-by: Omer Tuchfeld <[email protected]>
  • Loading branch information
omertuc committed Sep 3, 2024
1 parent a2c47e5 commit 6edca4e
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 14 deletions.
24 changes: 18 additions & 6 deletions lib/src/install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,6 @@ use crate::store::Storage;
use crate::task::Task;
use crate::utils::sigpolicy_from_opts;

/// The default "stateroot" or "osname"; see https://github.com/ostreedev/ostree/issues/2794
const STATEROOT_DEFAULT: &str = "default";
/// The toplevel boot directory
const BOOT: &str = "boot";
/// Directory for transient runtime state
Expand Down Expand Up @@ -171,6 +169,10 @@ pub(crate) struct InstallConfigOpts {
#[clap(long, hide = true)]
#[serde(default)]
pub(crate) skip_bound_images: bool,

/// The stateroot name to use. Defaults to `default`.
#[clap(long)]
pub(crate) stateroot: Option<String>,
}

#[derive(Debug, Clone, clap::Parser, Serialize, Deserialize, PartialEq, Eq)]
Expand Down Expand Up @@ -567,8 +569,12 @@ async fn initialize_ostree_root(state: &State, root_setup: &RootSetup) -> Result
// Another implementation: https://github.com/coreos/coreos-assembler/blob/3cd3307904593b3a131b81567b13a4d0b6fe7c90/src/create_disk.sh#L295
crate::lsm::ensure_dir_labeled(rootfs_dir, "", Some("/".into()), 0o755.into(), sepolicy)?;

// TODO: make configurable?
let stateroot = STATEROOT_DEFAULT;
let stateroot = state
.config_opts
.stateroot
.as_deref()
.unwrap_or(ostree_ext::container::deploy::STATEROOT_DEFAULT);

Task::new_and_run(
"Initializing ostree layout",
"ostree",
Expand Down Expand Up @@ -638,7 +644,11 @@ async fn install_container(
) -> Result<(ostree::Deployment, InstallAleph)> {
let sepolicy = state.load_policy()?;
let sepolicy = sepolicy.as_ref();
let stateroot = STATEROOT_DEFAULT;
let stateroot = state
.config_opts
.stateroot
.as_deref()
.unwrap_or(ostree_ext::container::deploy::STATEROOT_DEFAULT);

let container_rootfs = &Dir::open_ambient_dir("/", cap_std::ambient_authority())?;

Expand Down Expand Up @@ -1099,7 +1109,9 @@ pub(crate) fn setup_sys_mount(fstype: &str, fspath: &str) -> Result<()> {
Task::new(format!("Mounting {fstype} {fspath}"), "mount")
.args(["-t", fstype, fstype, fspath])
.quiet()
.run()
.run()?;

Ok(())
}

/// Verify that we can load the manifest of the target image
Expand Down
38 changes: 30 additions & 8 deletions tests-integration/src/install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,32 @@ pub(crate) const BASE_ARGS: &[&str] = &[
"label=disable",
];

// ostree_ext::container::deploy::STATEROOT_DEFAULT
const DEFAULT_STATEROOT: &str = "default";

// arbitary
const NON_DEFAULT_STATEROOT: &str = "foo";

// Clear out and delete any ostree roots
fn reset_root(sh: &Shell) -> Result<()> {
// TODO fix https://github.com/containers/bootc/pull/137
if !Path::new("/ostree/deploy/default").exists() {
return Ok(());

for stateroot in [DEFAULT_STATEROOT, NON_DEFAULT_STATEROOT] {
if !Path::new(&format!("/ostree/deploy/{stateroot}")).exists() {
continue;
}

if Path::new(&format!("/ostree/deploy/{stateroot}/deploy")).exists() {
cmd!(
sh,
// env var hack needed because cmd! doesn't interpolate inside single quotes
"sudo STATEROOT={stateroot} /bin/sh -c 'chattr -i /ostree/deploy/$STATEROOT/deploy/*'"
)
.run()?;
}

cmd!(sh, "sudo rm /ostree/deploy/{stateroot} -rf").run()?;
}
cmd!(
sh,
"sudo /bin/sh -c 'chattr -i /ostree/deploy/default/deploy/*'"
)
.run()?;
cmd!(sh, "sudo rm /ostree/deploy/default -rf").run()?;
Ok(())
}

Expand Down Expand Up @@ -136,6 +150,14 @@ pub(crate) fn run_alongside(image: &str, mut testargs: libtest_mimic::Arguments)
crate::selinux::verify_selinux_recurse(root, &mut path, false)?;
Ok(())
}),
Trial::test("Install to non-default stateroot", move || {
let sh = &xshell::Shell::new()?;
reset_root(sh)?;
cmd!(sh, "sudo {BASE_ARGS...} {target_args...} {image} bootc install to-existing-root --stateroot {NON_DEFAULT_STATEROOT} --acknowledge-destructive {generic_inst_args...}").run()?;
generic_post_install_verification()?;
assert!(Utf8Path::new(&format!("/ostree/deploy/{NON_DEFAULT_STATEROOT}")).try_exists()?);
Ok(())
}),
Trial::test("without an install config", move || {
let sh = &xshell::Shell::new()?;
reset_root(sh)?;
Expand Down

0 comments on commit 6edca4e

Please sign in to comment.