Skip to content

Commit

Permalink
sysroot: Add API to clean up transient keys in origin files
Browse files Browse the repository at this point in the history
The `origin/unlocked` and `origin/override-commit` keys are examples of state
that's really transient; we don't want to maintain them across upgrades. Right
now there are bits for this in both `ostree admin upgrade` as well as in
rpm-ostree.

This new API will slightly clean up both cases, but it's really prep for adding
a concept of deployment "pinning" that will live in the new
`libostree-transient` group.
  • Loading branch information
cgwalters committed Feb 26, 2018
1 parent 8a87b1d commit 6e54bfe
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 19 deletions.
1 change: 1 addition & 0 deletions apidoc/ostree-sections.txt
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,7 @@ ostree_deployment_set_index
ostree_deployment_set_bootserial
ostree_deployment_set_bootconfig
ostree_deployment_set_origin
ostree_deployment_origin_remove_transient_state
ostree_deployment_clone
ostree_deployment_unlocked_state_to_string
<SUBSECTION Standard>
Expand Down
1 change: 1 addition & 0 deletions src/libostree/libostree-devel.sym
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

/* Add new symbols here. Release commits should copy this section into -released.sym. */
LIBOSTREE_2018.3 {
ostree_deployment_origin_remove_transient_state;
} LIBOSTREE_2018.2;

/* Stub section for the stable release *after* this development one; don't
Expand Down
29 changes: 29 additions & 0 deletions src/libostree/ostree-deployment.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,35 @@ ostree_deployment_set_origin (OstreeDeployment *self, GKeyFile *origin)
self->origin = g_key_file_ref (origin);
}

/**
* ostree_deployment_origin_remove_transient_state:
* @origin: An origin
*
* The intention of an origin file is primarily describe the "inputs" that
* resulted in a deployment, and it's commonly used to derive the new state. For
* example, a key value (in pure libostree mode) is the "refspec". However,
* libostree (or other applications) may want to store "transient" state that
* should not be carried across upgrades.
*
* This function just removes all members of the `libostree-transient` group.
* The name of that group is available to all libostree users; best practice
* would be to prefix values underneath there with a short identifier for your
* software.
*
* Additionally, this function will remove the `origin/unlocked` and
* `origin/override-commit` members; these should be considered transient state
* that should have been under an explicit group.
*
* Since: 2018.3
*/
void
ostree_deployment_origin_remove_transient_state (GKeyFile *origin)
{
g_key_file_remove_group (origin, OSTREE_ORIGIN_TRANSIENT_GROUP, NULL);
g_key_file_remove_key (origin, "origin", "override-commit", NULL);
g_key_file_remove_key (origin, "origin", "unlocked", NULL);
}

void
_ostree_deployment_set_bootcsum (OstreeDeployment *self,
const char *bootcsum)
Expand Down
15 changes: 15 additions & 0 deletions src/libostree/ostree-deployment.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,17 @@ G_BEGIN_DECLS
#define OSTREE_DEPLOYMENT(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), OSTREE_TYPE_DEPLOYMENT, OstreeDeployment))
#define OSTREE_IS_DEPLOYMENT(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), OSTREE_TYPE_DEPLOYMENT))

/**
* OSTREE_ORIGIN_TRANSIENT_GROUP:
*
* The name of a `GKeyFile` group for data that should not
* be carried across upgrades. For more information,
* see ostree_deployment_origin_remove_transient_state().
*
* Since: 2018.3
*/
#define OSTREE_ORIGIN_TRANSIENT_GROUP "libostree-transient"

typedef struct _OstreeDeployment OstreeDeployment;

_OSTREE_PUBLIC
Expand Down Expand Up @@ -62,6 +73,7 @@ OstreeBootconfigParser *ostree_deployment_get_bootconfig (OstreeDeployment *self
_OSTREE_PUBLIC
GKeyFile *ostree_deployment_get_origin (OstreeDeployment *self);


_OSTREE_PUBLIC
void ostree_deployment_set_index (OstreeDeployment *self, int index);
_OSTREE_PUBLIC
Expand All @@ -71,6 +83,9 @@ void ostree_deployment_set_bootconfig (OstreeDeployment *self, OstreeBootconfigP
_OSTREE_PUBLIC
void ostree_deployment_set_origin (OstreeDeployment *self, GKeyFile *origin);

_OSTREE_PUBLIC
void ostree_deployment_origin_remove_transient_state (GKeyFile *origin);

_OSTREE_PUBLIC
OstreeDeployment *ostree_deployment_clone (OstreeDeployment *self);

Expand Down
23 changes: 4 additions & 19 deletions src/ostree/ot-admin-builtin-upgrade.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,33 +88,18 @@ ot_admin_builtin_upgrade (int argc, char **argv, OstreeCommandInvocation *invoca
g_autoptr(GKeyFile) origin = ostree_sysroot_upgrader_dup_origin (upgrader);
if (origin != NULL)
{
gboolean origin_changed = FALSE;

/* Should we consider requiring --discard-hotfix here? */
ostree_deployment_origin_remove_transient_state (origin);
if (opt_override_commit != NULL)
{
/* Override the commit to pull and deploy. */
g_key_file_set_string (origin, "origin",
"override-commit",
opt_override_commit);
origin_changed = TRUE;
}
else
{
/* Strip any override-commit from the origin file so
* we always upgrade to the latest available commit. */
origin_changed = g_key_file_remove_key (origin, "origin",
"override-commit", NULL);
}

/* Should we consider requiring --discard-hotfix here? */
origin_changed |= g_key_file_remove_key (origin, "origin", "unlocked", NULL);

if (origin_changed)
{
/* XXX GCancellable parameter is not used. */
if (!ostree_sysroot_upgrader_set_origin (upgrader, origin, NULL, error))
return FALSE;
}
if (!ostree_sysroot_upgrader_set_origin (upgrader, origin, NULL, error))
return FALSE;
}

gboolean changed;
Expand Down

0 comments on commit 6e54bfe

Please sign in to comment.