Skip to content

Commit

Permalink
grub2: generate config from pending deployment
Browse files Browse the repository at this point in the history
Generates a grub2 config using the pending deployment, if a grub2
bootloader is detected in the sysroot.

Fixes: ostreedev#1774
  • Loading branch information
Robert Fairley committed Mar 14, 2019
1 parent f116afc commit 4405b20
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 15 deletions.
8 changes: 5 additions & 3 deletions src/libostree/ostree-bootloader-grub2.c
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,7 @@ grub2_child_setup (gpointer user_data)
static gboolean
_ostree_bootloader_grub2_write_config (OstreeBootloader *bootloader,
int bootversion,
GPtrArray *new_deployments,
GCancellable *cancellable,
GError **error)
{
Expand Down Expand Up @@ -363,9 +364,8 @@ _ostree_bootloader_grub2_write_config (OstreeBootloader *bootloader,

deployments = ostree_sysroot_get_deployments (self->sysroot);

g_assert_cmpint (deployments->len, >, 0);

tool_deployment = deployments->pdata[0];
g_assert_cmpint (new_deployments->len, > , 0);
tool_deployment = new_deployments->pdata[0];

/* Sadly we have to execute code to generate the bootloader configuration.
* If we're in a booted deployment, we just don't chroot.
Expand All @@ -380,6 +380,8 @@ _ostree_bootloader_grub2_write_config (OstreeBootloader *bootloader,
grub2_mkconfig_chroot = g_file_get_path (tool_deployment_root);
}

g_debug ("Using grub2-mkconfig chroot: %s\n", grub2_mkconfig_chroot);

g_autoptr(GFile) new_config_path = NULL;
g_autoptr(GFile) config_path_efi_dir = NULL;
if (self->is_efi)
Expand Down
9 changes: 5 additions & 4 deletions src/libostree/ostree-bootloader-syslinux.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,11 @@ append_config_from_loader_entries (OstreeBootloaderSyslinux *self,
}

static gboolean
_ostree_bootloader_syslinux_write_config (OstreeBootloader *bootloader,
int bootversion,
GCancellable *cancellable,
GError **error)
_ostree_bootloader_syslinux_write_config (OstreeBootloader *bootloader,
int bootversion,
GPtrArray *new_deployments,
GCancellable *cancellable,
GError **error)
{
OstreeBootloaderSyslinux *self = OSTREE_BOOTLOADER_SYSLINUX (bootloader);

Expand Down
9 changes: 5 additions & 4 deletions src/libostree/ostree-bootloader-uboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,10 +158,11 @@ create_config_from_boot_loader_entries (OstreeBootloaderUboot *self,
}

static gboolean
_ostree_bootloader_uboot_write_config (OstreeBootloader *bootloader,
int bootversion,
GCancellable *cancellable,
GError **error)
_ostree_bootloader_uboot_write_config (OstreeBootloader *bootloader,
int bootversion,
GPtrArray *new_deployments,
GCancellable *cancellable,
GError **error)
{
OstreeBootloaderUboot *self = OSTREE_BOOTLOADER_UBOOT (bootloader);

Expand Down
6 changes: 4 additions & 2 deletions src/libostree/ostree-bootloader.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,15 @@ _ostree_bootloader_get_name (OstreeBootloader *self)
gboolean
_ostree_bootloader_write_config (OstreeBootloader *self,
int bootversion,
GPtrArray *new_deployments,
GCancellable *cancellable,
GError **error)
{
g_return_val_if_fail (OSTREE_IS_BOOTLOADER (self), FALSE);

return OSTREE_BOOTLOADER_GET_IFACE (self)->write_config (self, bootversion,
cancellable, error);
return OSTREE_BOOTLOADER_GET_IFACE (self)->write_config (self, bootversion,
new_deployments,
cancellable, error);
}

gboolean
Expand Down
2 changes: 2 additions & 0 deletions src/libostree/ostree-bootloader.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ struct _OstreeBootloaderInterface
const char * (* get_name) (OstreeBootloader *self);
gboolean (* write_config) (OstreeBootloader *self,
int bootversion,
GPtrArray *new_deployments,
GCancellable *cancellable,
GError **error);
gboolean (* is_atomic) (OstreeBootloader *self);
Expand All @@ -61,6 +62,7 @@ const char *_ostree_bootloader_get_name (OstreeBootloader *self);

gboolean _ostree_bootloader_write_config (OstreeBootloader *self,
int bootversion,
GPtrArray *new_deployments,
GCancellable *cancellable,
GError **error);

Expand Down
3 changes: 2 additions & 1 deletion src/libostree/ostree-sysroot-deploy.c
Original file line number Diff line number Diff line change
Expand Up @@ -2122,7 +2122,8 @@ write_deployments_bootswap (OstreeSysroot *self,
if (bootloader)
{
if (!_ostree_bootloader_write_config (bootloader, new_bootversion,
cancellable, error))
new_deployments, cancellable,
error))
return glnx_prefix_error (error, "Bootloader write config");
}

Expand Down
17 changes: 16 additions & 1 deletion tests/test-admin-deploy-grub2.sh
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,21 @@ set -euo pipefail
# Exports OSTREE_SYSROOT so --sysroot not needed.
setup_os_repository "archive" "grub2 ostree-grub-generator"

extra_admin_tests=0
xtra_admin_tests=1

. $(dirname $0)/admin-test.sh

# Check that deploying a new tree with zero previous deployments works.
# (see https://github.com/ostreedev/ostree/issues/1774).
cd ${test_tmpdir}
rm httpd osdata testos-repo sysroot -rf
setup_os_repository "archive" "grub2 ostree-grub-generator"
${CMD_PREFIX} ostree pull-local --repo=sysroot/ostree/repo --remote testos testos-repo testos/buildmaster/x86_64-runtime
# Make OSTree detect the grub2 bootloader.
mkdir -p sysroot/boot/grub2 && touch sysroot/boot/grub2/grub.cfg
${CMD_PREFIX} ostree admin deploy --karg=root=LABEL=MOO --karg=quiet --os testos testos/buildmaster/x86_64-runtime > out.txt
assert_file_has_content out.txt "Bootloader updated.*"
assert_file_has_content sysroot/boot/loader/entries/ostree-1-testos.conf 'options.* root=LABEL=MOO'
assert_file_has_content sysroot/boot/ostree/testos-${bootcsum}/vmlinuz-3.6.0 'a kernel'
assert_file_has_content sysroot/boot/ostree/testos-${bootcsum}/initramfs-3.6.0.img 'an initramfs'
echo "ok run grub2 bootloader on first deployment"

0 comments on commit 4405b20

Please sign in to comment.