summaryrefslogtreecommitdiffstats
path: root/test/parser
diff options
context:
space:
mode:
authorJavier Martinez Canillas <javierm@redhat.com>2018-03-22 09:41:23 +0100
committerSamuel Mendoza-Jonas <sam@mendozajonas.com>2018-03-23 11:39:35 +1100
commit91ce1a8f8863d8f740188236f138421d17292d6c (patch)
treef39fa6f339e8c8f3e3ec20052acc33b806aa040b /test/parser
parent3dfa4123bdf987aaa0e4bfd73d436c6bab0184ce (diff)
downloadtalos-petitboot-91ce1a8f8863d8f740188236f138421d17292d6c.tar.gz
talos-petitboot-91ce1a8f8863d8f740188236f138421d17292d6c.zip
discover/grub: Add blscfg command support to parse BootLoaderSpec files
The BootLoaderSpec (BLS) defines a file format for boot configurations, so bootloaders can parse these files and create their boot menu entries by using the information provided by them [0]. This allow to configure the boot items as drop-in files in a directory instead of having to parse and modify a bootloader configuration file. The GRUB 2 bootloader provides a blscfg command that parses these files and creates menu entries using this information. Add support for it. [0]: https://www.freedesktop.org/wiki/Specifications/BootLoaderSpec/ Signed-off-by: Javier Martinez Canillas <javierm@redhat.com> Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
Diffstat (limited to 'test/parser')
-rw-r--r--test/parser/Makefile.am5
-rw-r--r--test/parser/test-grub2-blscfg-default-filename.c29
-rw-r--r--test/parser/test-grub2-blscfg-default-title.c36
-rw-r--r--test/parser/test-grub2-blscfg-multiple-bls.c44
-rw-r--r--test/parser/test-grub2-blscfg-opts-config.c29
-rw-r--r--test/parser/test-grub2-blscfg-opts-grubenv.c34
-rw-r--r--test/parser/utils.c59
7 files changed, 236 insertions, 0 deletions
diff --git a/test/parser/Makefile.am b/test/parser/Makefile.am
index a0795db..3479d88 100644
--- a/test/parser/Makefile.am
+++ b/test/parser/Makefile.am
@@ -40,6 +40,11 @@ parser_TESTS = \
test/parser/test-grub2-parser-error \
test/parser/test-grub2-test-file-ops \
test/parser/test-grub2-single-yocto \
+ test/parser/test-grub2-blscfg-default-filename \
+ test/parser/test-grub2-blscfg-default-title \
+ test/parser/test-grub2-blscfg-multiple-bls \
+ test/parser/test-grub2-blscfg-opts-config \
+ test/parser/test-grub2-blscfg-opts-grubenv \
test/parser/test-kboot-single \
test/parser/test-yaboot-empty \
test/parser/test-yaboot-single \
diff --git a/test/parser/test-grub2-blscfg-default-filename.c b/test/parser/test-grub2-blscfg-default-filename.c
new file mode 100644
index 0000000..fb74059
--- /dev/null
+++ b/test/parser/test-grub2-blscfg-default-filename.c
@@ -0,0 +1,29 @@
+#include "parser-test.h"
+
+#if 0 /* PARSER_EMBEDDED_CONFIG */
+set default=6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64
+blscfg
+#endif
+
+void run_test(struct parser_test *test)
+{
+ struct discover_boot_option *opt;
+ struct discover_context *ctx;
+
+ test_add_file_string(test, test->ctx->device,
+ "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf",
+ "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n"
+ "linux /vmlinuz-4.15.2-302.fc28.x86_64\n"
+ "initrd /initramfs-4.15.2-302.fc28.x86_64.img\n"
+ "options root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n");
+
+ test_read_conf_embedded(test, "/boot/grub2/grub.cfg");
+
+ test_run_parser(test, "grub2");
+
+ ctx = test->ctx;
+
+ opt = get_boot_option(ctx, 0);
+
+ check_is_default(opt);
+}
diff --git a/test/parser/test-grub2-blscfg-default-title.c b/test/parser/test-grub2-blscfg-default-title.c
new file mode 100644
index 0000000..94acf80
--- /dev/null
+++ b/test/parser/test-grub2-blscfg-default-title.c
@@ -0,0 +1,36 @@
+#include "parser-test.h"
+
+#if 0 /* PARSER_EMBEDDED_CONFIG */
+load_env
+set default=${saved_entry}
+blscfg
+#endif
+
+void run_test(struct parser_test *test)
+{
+ struct discover_boot_option *opt;
+ struct discover_context *ctx;
+
+ test_add_file_string(test, test->ctx->device,
+ "/boot/grub2/grubenv",
+ "# GRUB Environment Block\n"
+ "saved_entry=Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n"
+ "kernelopts=root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n");
+
+ test_add_file_string(test, test->ctx->device,
+ "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf",
+ "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n"
+ "linux /vmlinuz-4.15.2-302.fc28.x86_64\n"
+ "initrd /initramfs-4.15.2-302.fc28.x86_64.img\n"
+ "options $kernelopts\n");
+
+ test_read_conf_embedded(test, "/boot/grub2/grub.cfg");
+
+ test_run_parser(test, "grub2");
+
+ ctx = test->ctx;
+
+ opt = get_boot_option(ctx, 0);
+
+ check_is_default(opt);
+}
diff --git a/test/parser/test-grub2-blscfg-multiple-bls.c b/test/parser/test-grub2-blscfg-multiple-bls.c
new file mode 100644
index 0000000..8fd218c
--- /dev/null
+++ b/test/parser/test-grub2-blscfg-multiple-bls.c
@@ -0,0 +1,44 @@
+#include "parser-test.h"
+
+#if 0 /* PARSER_EMBEDDED_CONFIG */
+blscfg
+#endif
+
+void run_test(struct parser_test *test)
+{
+ struct discover_boot_option *opt;
+ struct discover_context *ctx;
+
+ test_add_file_string(test, test->ctx->device,
+ "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf",
+ "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n"
+ "linux /vmlinuz-4.15.2-302.fc28.x86_64\n"
+ "initrd /initramfs-4.15.2-302.fc28.x86_64.img\n"
+ "options root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n\n");
+
+ test_add_file_string(test, test->ctx->device,
+ "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.14.18-300.fc28.x86_64.conf",
+ "title Fedora (4.14.18-300.fc28.x86_64) 28 (Twenty Eight)\n"
+ "linux /vmlinuz-4.14.18-300.fc28.x86_64\n"
+ "initrd /initramfs-4.14.18-300.fc28.x86_64.img\n"
+ "options root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n");
+
+ test_read_conf_embedded(test, "/boot/grub2/grub.cfg");
+
+ test_run_parser(test, "grub2");
+
+ ctx = test->ctx;
+
+ check_boot_option_count(ctx, 2);
+ opt = get_boot_option(ctx, 0);
+
+ check_name(opt, "Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)");
+ check_resolved_local_resource(opt->boot_image, ctx->device,
+ "/vmlinuz-4.15.2-302.fc28.x86_64");
+
+ opt = get_boot_option(ctx, 1);
+
+ check_name(opt, "Fedora (4.14.18-300.fc28.x86_64) 28 (Twenty Eight)");
+ check_resolved_local_resource(opt->initrd, ctx->device,
+ "/initramfs-4.14.18-300.fc28.x86_64.img");
+}
diff --git a/test/parser/test-grub2-blscfg-opts-config.c b/test/parser/test-grub2-blscfg-opts-config.c
new file mode 100644
index 0000000..856aae2
--- /dev/null
+++ b/test/parser/test-grub2-blscfg-opts-config.c
@@ -0,0 +1,29 @@
+#include "parser-test.h"
+
+#if 0 /* PARSER_EMBEDDED_CONFIG */
+set kernelopts=root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root
+blscfg
+#endif
+
+void run_test(struct parser_test *test)
+{
+ struct discover_boot_option *opt;
+ struct discover_context *ctx;
+
+ test_add_file_string(test, test->ctx->device,
+ "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf",
+ "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n"
+ "linux /vmlinuz-4.15.2-302.fc28.x86_64\n"
+ "initrd /initramfs-4.15.2-302.fc28.x86_64.img\n"
+ "options $kernelopts\n");
+
+ test_read_conf_embedded(test, "/boot/grub2/grub.cfg");
+
+ test_run_parser(test, "grub2");
+
+ ctx = test->ctx;
+
+ opt = get_boot_option(ctx, 0);
+
+ check_args(opt, "root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root");
+}
diff --git a/test/parser/test-grub2-blscfg-opts-grubenv.c b/test/parser/test-grub2-blscfg-opts-grubenv.c
new file mode 100644
index 0000000..c77c589
--- /dev/null
+++ b/test/parser/test-grub2-blscfg-opts-grubenv.c
@@ -0,0 +1,34 @@
+#include "parser-test.h"
+
+#if 0 /* PARSER_EMBEDDED_CONFIG */
+load_env
+blscfg
+#endif
+
+void run_test(struct parser_test *test)
+{
+ struct discover_boot_option *opt;
+ struct discover_context *ctx;
+
+ test_add_file_string(test, test->ctx->device,
+ "/boot/grub2/grubenv",
+ "# GRUB Environment Block\n"
+ "kernelopts=root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n");
+
+ test_add_file_string(test, test->ctx->device,
+ "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf",
+ "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n"
+ "linux /vmlinuz-4.15.2-302.fc28.x86_64\n"
+ "initrd /initramfs-4.15.2-302.fc28.x86_64.img\n"
+ "options $kernelopts\n");
+
+ test_read_conf_embedded(test, "/boot/grub2/grub.cfg");
+
+ test_run_parser(test, "grub2");
+
+ ctx = test->ctx;
+
+ opt = get_boot_option(ctx, 0);
+
+ check_args(opt, "root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root");
+}
diff --git a/test/parser/utils.c b/test/parser/utils.c
index 47779c8..394efb3 100644
--- a/test/parser/utils.c
+++ b/test/parser/utils.c
@@ -309,6 +309,65 @@ int parser_replace_file(struct discover_context *ctx,
return 0;
}
+int parser_scandir(struct discover_context *ctx, const char *dirname,
+ struct dirent ***files, int (*filter)(const struct dirent *)
+ __attribute__((unused)),
+ int (*comp)(const struct dirent **, const struct dirent **)
+ __attribute__((unused)))
+{
+ struct parser_test *test = ctx->test_data;
+ struct test_file *f;
+ char *filename;
+ struct dirent **dirents = NULL, **new_dirents;
+ int n = 0, namelen;
+
+ list_for_each_entry(&test->files, f, list) {
+ if (f->dev != ctx->device)
+ continue;
+
+ filename = strrchr(f->name, '/');
+ if (!filename)
+ continue;
+
+ namelen = strlen(filename);
+
+ if (strncmp(f->name, dirname, strlen(f->name) - namelen))
+ continue;
+
+ if (!dirents) {
+ dirents = malloc(sizeof(struct dirent *));
+ } else {
+ new_dirents = realloc(dirents, sizeof(struct dirent *)
+ * (n + 1));
+ if (!new_dirents)
+ goto err_cleanup;
+
+ dirents = new_dirents;
+ }
+
+ dirents[n] = malloc(sizeof(struct dirent) + namelen + 1);
+
+ if (!dirents[n])
+ goto err_cleanup;
+
+ strcpy(dirents[n]->d_name, filename + 1);
+ n++;
+ }
+
+ *files = dirents;
+
+ return n;
+
+err_cleanup:
+ do {
+ free(dirents[n]);
+ } while (n-- > 0);
+
+ free(dirents);
+
+ return -1;
+}
+
struct load_url_result *load_url_async(void *ctx, struct pb_url *url,
load_url_complete async_cb, void *async_data,
waiter_cb stdout_cb, void *stdout_data)
OpenPOWER on IntegriCloud