sysroot: Add _require_booted_deployment() API

This is a common pattern that is replicated both in our code
and in rpm-ostree a lot.  Let's add a canonical API.
This commit is contained in:
Colin Walters 2021-03-17 14:03:49 +00:00
parent d522f261db
commit 1b28e6041c
8 changed files with 33 additions and 15 deletions

View File

@ -533,6 +533,7 @@ ostree_sysroot_get_bootversion
ostree_sysroot_get_subbootversion
ostree_sysroot_get_deployments
ostree_sysroot_get_booted_deployment
ostree_sysroot_require_booted_deployment
ostree_sysroot_get_deployment_directory
ostree_sysroot_get_deployment_dirpath
ostree_sysroot_get_deployment_origin_path

View File

@ -25,6 +25,7 @@
LIBOSTREE_2021.1 {
global:
ostree_commit_metadata_for_bootable;
ostree_sysroot_require_booted_deployment;
} LIBOSTREE_2020.8;
/* Stub section for the stable release *after* this development one; don't

View File

@ -3066,9 +3066,9 @@ ostree_sysroot_stage_tree_with_options (OstreeSysroot *self,
if (!_ostree_sysroot_ensure_writable (self, error))
return FALSE;
OstreeDeployment *booted_deployment = ostree_sysroot_get_booted_deployment (self);
OstreeDeployment *booted_deployment = ostree_sysroot_require_booted_deployment (self, error);
if (booted_deployment == NULL)
return glnx_throw (error, "Cannot stage a deployment when not currently booted into an OSTree system");
return glnx_prefix_error (error, "Cannot stage deployment");
/* This is used by the testsuite to exercise the path unit, until it becomes the default
* (which is pending on the preset making it everywhere). */

View File

@ -1246,6 +1246,27 @@ ostree_sysroot_get_booted_deployment (OstreeSysroot *self)
return self->booted_deployment;
}
/**
* ostree_sysroot_require_booted_deployment:
* @self: Sysroot
*
* Find the booted deployment, or return an error if not booted via OSTree.
*
* Returns: (transfer none) (not nullable): The currently booted deployment, or an error
* Since: 2021.1
*/
OstreeDeployment *
ostree_sysroot_require_booted_deployment (OstreeSysroot *self, GError **error)
{
g_return_val_if_fail (self->loadstate == OSTREE_SYSROOT_LOAD_STATE_LOADED, NULL);
if (!self->booted_deployment)
return glnx_null_throw (error, "Not currently booted into an OSTree system");
return self->booted_deployment;
}
/**
* ostree_sysroot_get_staged_deployment:
* @self: Sysroot

View File

@ -85,6 +85,9 @@ GPtrArray *ostree_sysroot_get_deployments (OstreeSysroot *self);
_OSTREE_PUBLIC
OstreeDeployment *ostree_sysroot_get_booted_deployment (OstreeSysroot *self);
_OSTREE_PUBLIC
OstreeDeployment *
ostree_sysroot_require_booted_deployment (OstreeSysroot *self, GError **error);
_OSTREE_PUBLIC
OstreeDeployment *ostree_sysroot_get_staged_deployment (OstreeSysroot *self);
_OSTREE_PUBLIC

View File

@ -75,13 +75,9 @@ ot_admin_builtin_set_origin (int argc, char **argv, OstreeCommandInvocation *inv
if (opt_index == -1)
{
target_deployment = ostree_sysroot_get_booted_deployment (sysroot);
target_deployment = ostree_sysroot_require_booted_deployment (sysroot, error);
if (target_deployment == NULL)
{
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Not currently booted into an OSTree system");
goto out;
}
goto out;
/* To match the below */
target_deployment = g_object_ref (target_deployment);
}

View File

@ -61,13 +61,9 @@ ot_admin_builtin_unlock (int argc, char **argv, OstreeCommandInvocation *invocat
goto out;
}
booted_deployment = ostree_sysroot_get_booted_deployment (sysroot);
booted_deployment = ostree_sysroot_require_booted_deployment (sysroot, error);
if (!booted_deployment)
{
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Not currently booted into an OSTree system");
goto out;
}
goto out;
if (opt_hotfix && opt_transient)
{

View File

@ -95,7 +95,7 @@ echo "ok layout"
if ${CMD_PREFIX} ostree admin deploy --stage --os=testos testos:testos/buildmaster/x86_64-runtime 2>err.txt; then
fatal "staged when not booted"
fi
assert_file_has_content_literal err.txt "Cannot stage a deployment when not currently booted into an OSTree system"
assert_file_has_content_literal err.txt "Cannot stage deployment: Not currently booted into an OSTree system"
echo "ok staging does not work when not booted"
orig_mtime=$(stat -c '%.Y' sysroot/ostree/deploy)