Skip to content

Commit 8b8b8c3

Browse files
tests: introduce vars to create kernel comps for nested
Introduce NESTED_COMP_KERNEL_MODULE_NAME and NESTED_KERNEL_MODULES_COMP env vars. If present, a kernel-modules component containing the specified kernel module will be created and will be added when building the nested test image.
1 parent 874c60e commit 8b8b8c3

File tree

3 files changed

+70
-0
lines changed

3 files changed

+70
-0
lines changed

tests/lib/nested.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -921,6 +921,9 @@ nested_create_core_vm() {
921921
for mycomp in $(nested_get_extra_comps); do
922922
EXTRA_SNAPS="$EXTRA_SNAPS --comp $mycomp"
923923
done
924+
if [ -n "$NESTED_KERNEL_MODULES_COMP" ]; then
925+
EXTRA_SNAPS="$EXTRA_SNAPS --comp pc-kernel+${NESTED_KERNEL_MODULES_COMP}.comp"
926+
fi
924927

925928
# only set SNAPPY_FORCE_SAS_URL because we don't need it defined
926929
# anywhere else but here, where snap prepare-image as called by

tests/lib/prepare.sh

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,40 @@ uc20_build_initramfs_kernel_snap() {
922922
rm -rf repacked-kernel
923923
}
924924

925+
926+
# Modify kernel and create a component, kernel content expected in pc-kernel
927+
build_kernel_with_comp() {
928+
mod_name=$1
929+
comp_name=$2
930+
931+
kern_ver=$(find pc-kernel/modules/* -maxdepth 0 -printf "%f\n")
932+
comp_ko_dir=$comp_name/modules/"$kern_ver"/kmod/
933+
mkdir -p "$comp_ko_dir"
934+
mkdir -p "$comp_name"/meta/
935+
cat << EOF > "$comp_name"/meta/component.yaml
936+
component: pc-kernel+$comp_name
937+
type: kernel-modules
938+
version: 1.0
939+
summary: kernel component
940+
description: kernel component for testing purposes
941+
EOF
942+
# Replace _ or - with [_-], as it can be any of these
943+
glob_mod_name=$(printf '%s' "$mod_name" | sed -r 's/[-_]/[-_]/g')
944+
module_path=$(find pc-kernel -name "${glob_mod_name}.ko*")
945+
cp "$module_path" "$comp_ko_dir"
946+
snap pack --filename=pc-kernel+"$comp_name".comp "$comp_name"
947+
948+
# remove the kernel module from the kernel snap
949+
rm "$module_path"
950+
# depmod wants a lib subdir, fake it and remove after invocation
951+
mkdir pc-kernel/lib
952+
ln -s ../modules pc-kernel/lib/modules
953+
depmod -b pc-kernel/ "$kern_ver"
954+
rm -rf pc-kernel/lib
955+
# append component meta-information
956+
printf 'components:\n %s:\n type: kernel-modules\n' "$comp_name" >> pc-kernel/meta/snap.yaml
957+
}
958+
925959
uc24_build_initramfs_kernel_snap() {
926960
local ORIG_SNAP="$1"
927961
local TARGET="$2"
@@ -937,6 +971,11 @@ uc24_build_initramfs_kernel_snap() {
937971
unsquashfs -d pc-kernel "$ORIG_SNAP"
938972
objcopy -O binary -j .initrd pc-kernel/kernel.efi initrd.img
939973

974+
if [ -n "$NESTED_KERNEL_MODULES_COMP" ]; then
975+
# "split" kernel in kernel-modules component and kernel
976+
build_kernel_with_comp "$NESTED_COMP_KERNEL_MODULE_NAME" "$NESTED_KERNEL_MODULES_COMP"
977+
fi
978+
940979
unmkinitramfs initrd.img initrd
941980

942981
if [ -d ./extra-initrd ]; then

tests/nested/manual/uc20-install-in-initrd/task.yaml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ environment:
3636
NESTED_UBUNTU_IMAGE_SNAPPY_FORCE_SAS_URL: http://localhost:11028
3737
NESTED_SNAPD_DEBUG_TO_SERIAL: true
3838

39+
# create a kernel-modules component for efi-pstore
40+
NESTED_KERNEL_MODULES_COMP: efi-pstore
41+
NESTED_COMP_KERNEL_MODULE_NAME: efi-pstore
42+
3943
prepare: |
4044
"$TESTSTOOLS"/store-state setup-fake-store "$NESTED_FAKESTORE_BLOB_DIR"
4145
cp "$TESTSLIB"/assertions/developer1.account "$NESTED_FAKESTORE_BLOB_DIR"/asserts
@@ -75,6 +79,30 @@ execute: |
7579
7680
MATCH "mode=run" <modeenv
7781
82+
check_efi_pstore() {
83+
# Compare times to check that drivers tree was created on
84+
# installation, not on seeding
85+
# shellcheck disable=SC2016
86+
tree_birth=$(remote.exec 'date -d"$(stat --printf="%w\n" /var/lib/snapd/kernel/pc-kernel)" +%s')
87+
reboot_time=$(remote.exec 'last reboot --time-format full | sed -n "s/wtmp begins //p"')
88+
reboot_time=$(date -d"$reboot_time" +%s)
89+
test "$reboot_time" -gt "$tree_birth"
90+
91+
# check that the component is in place
92+
kern_ver=$(remote.exec uname -r)
93+
comp_install_dir=/var/lib/snapd/kernel/pc-kernel/x1/lib/modules/"$kern_ver"/updates/"$NESTED_KERNEL_MODULES_COMP"
94+
comp_dir=/snap/pc-kernel/components/mnt/"$NESTED_KERNEL_MODULES_COMP"/x1/modules/"$kern_ver"
95+
test "$(remote.exec readlink -f "$comp_install_dir")" = "$comp_dir"
96+
97+
# module comes from a component
98+
remote.exec modinfo -F filename efi_pstore | MATCH updates/"$NESTED_KERNEL_MODULES_COMP"/kmod/efi-pstore.ko
99+
# module should have been loaded (pulled by systemd-pstore.service)
100+
remote.exec lsmod | MATCH efi_pstore
101+
}
102+
103+
# check component from store has been early-installed
104+
check_efi_pstore
105+
78106
if [ "${INSTALL_MODE}" != none ]; then
79107
# TODO: in a normal run, ubuntu-data-<someid> is used instead of
80108
# just "ubuntu-data". We need to figure out if this is OK.

0 commit comments

Comments
 (0)