cookbooks/fb_grub/spec/extraction_spec.rb (215 lines of code) (raw):
# vim: syntax=ruby:expandtab:shiftwidth=2:softtabstop=2:tabstop=2
# Copyright (c) 2016-present, Facebook, Inc.
# All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require './spec/spec_helper'
require_relative '../libraries/default'
grub1_contents = <<EOF
# grub.conf generated by anaconda
# Note that you do not have to rerun grub after making changes to this file.
# NOTICE: You have a /boot partition. This means that all kernel and
# initrd paths are relative to /boot, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda2
# initrd /initrd-[generic-]version.img
boot=/dev/sda1
device (hd0,1) HD(1,800,80000,a7d234b6-5131-4dbf-b1c3-b53aedf4c486)
default=0
timeout=5
serial --speed=57600
terminal --timeout=5 serial console
title CentOS (4.0.9-58_fbk9_3937_gaee7b6f)
root (hd0,1)
kernel /vmlinuz-4.0.9-58_fbk9_3937_gaee7b6f ro root=LABEL=/ crashkernel=128M rhgb quiet nopat memmap=64M$1G selinux=0 biosdevname=0 net.ifnames=0 console=ttyS0,57600 LANG=en_US.UTF-8
initrd /initramfs-4.0.9-58_fbk9_3937_gaee7b6f.img
EOF
grub2_search_statements = <<EOF
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
set pager=1
if [ -s $prefix/grubenv ]; then
load_env
fi
if [ "${next_entry}" ] ; then
set default="${next_entry}"
set next_entry=
save_env next_entry
set boot_once=true
else
set default="${saved_entry}"
fi
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
export menuentry_id_option
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z "${boot_once}" ]; then
saved_entry="${chosen}"
save_env saved_entry
fi
}
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
serial --unit=1 --speed=57600
terminal_input serial console
terminal_output serial console
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=5
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/01_users ###
if [ -f ${prefix}/user.cfg ]; then
source ${prefix}/user.cfg
if [ -n "${GRUB2_PASSWORD}" ]; then
set superusers="root"
export superusers
password_pbkdf2 root ${GRUB2_PASSWORD}
fi
fi
### END /etc/grub.d/01_users ###
### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (4.0.9-75_fbk14_4148_g37fe86f) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.18.2.el7.x86_64-advanced-e3beaa30-6664-49cf-b2eb-8a00aa6d7517' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 221f5b2b-8d33-4f1b-80b3-571cd36b89ce
else
search --no-floppy --fs-uuid --set=root 221f5b2b-8d33-4f1b-80b3-571cd36b89ce
fi
linuxefi /vmlinuz-4.0.9-75_fbk14_4148_g37fe86f root=LABEL=/ ro crashkernel=128M console=tty0 pcie_pme=nomsi selinux=0 biosdevname=0 net.ifnames=0 console=ttyS1,57600 LANG=en_US.UTF-8
initrdefi /initramfs-4.0.9-75_fbk14_4148_g37fe86f.img
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###
### BEGIN /etc/grub.d/20_ppc_terminfo ###
### END /etc/grub.d/20_ppc_terminfo ###
### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###
### BEGIN /etc/grub.d/41_custom ###
if [ -f ${config_directory}/custom.cfg ]; then
source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
EOF
grub2_contents = <<EOF
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
set pager=1
if [ -s $prefix/grubenv ]; then
load_env
fi
if [ "${next_entry}" ] ; then
set default="${next_entry}"
set next_entry=
save_env next_entry
set boot_once=true
else
set default="${saved_entry}"
fi
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
export menuentry_id_option
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z "${boot_once}" ]; then
saved_entry="${chosen}"
save_env saved_entry
fi
}
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
serial --unit=1 --speed=57600
terminal_input serial console
terminal_output serial console
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=5
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/01_users ###
if [ -f ${prefix}/user.cfg ]; then
source ${prefix}/user.cfg
if [ -n "${GRUB2_PASSWORD}" ]; then
set superusers="root"
export superusers
password_pbkdf2 root ${GRUB2_PASSWORD}
fi
fi
### END /etc/grub.d/01_users ###
### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (4.0.9-75_fbk14_4148_g37fe86f) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.18.2.el7.x86_64-advanced-4803ec21-c800-4828-96e9-36e43c3fd35c' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
set root='hd0,gpt2'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 4a7e68d7-1c84-4b3e-933b-7440e12e35da
else
search --no-floppy --fs-uuid --set=root 4a7e68d7-1c84-4b3e-933b-7440e12e35da
fi
linuxefi /vmlinuz-4.0.9-75_fbk14_4148_g37fe86f root=LABEL=/ ro crashkernel=128M console=tty0 pcie_pme=nomsi selinux=0 biosdevname=0 net.ifnames=0 console=ttyS1,57600 LANG=en_US.UTF-8
initrdefi /initramfs-4.0.9-75_fbk14_4148_g37fe86f.img
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###
### BEGIN /etc/grub.d/20_ppc_terminfo ###
### END /etc/grub.d/20_ppc_terminfo ###
### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###
### BEGIN /etc/grub.d/41_custom ###
if [ -f ${config_directory}/custom.cfg ]; then
source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
EOF
describe FB::Grub do
it 'should extract the root drive correctly from a grub 1 config' do
extracted = FB::Grub.extract_root_device(grub1_contents)
extracted.should eq('hd0,1')
end
it 'should not pay attention to root drive comments' do
grub1_with_comment = "# root(hd9,99)\n" + grub1_contents
extracted = FB::Grub.extract_root_device(grub1_with_comment)
extracted.should eq('hd0,1')
end
it 'should extract the root drive correctly from a grub 2 config' do
extracted = FB::Grub.extract_root_device(grub2_contents)
extracted.should eq('hd0,gpt2')
end
it 'should extract device hints correctly from a grub 1 config' do
extracted = FB::Grub.extract_device_hints(grub1_contents)
extracted.should eq(
['device (hd0,1) HD(1,800,80000,a7d234b6-5131-4dbf-b1c3-b53aedf4c486)'],
)
end
it 'should not pay attention to commented out device hints' do
grub1_with_comment = "# device (hd0,1) HD(123)\n" + grub1_contents
extracted = FB::Grub.extract_device_hints(grub1_with_comment)
extracted.should eq(
['device (hd0,1) HD(1,800,80000,a7d234b6-5131-4dbf-b1c3-b53aedf4c486)'],
)
end
it 'should extract device hints correctly from a grub 2 config' do
extracted = FB::Grub.extract_device_hints(grub2_contents)
extracted.should eq([])
end
it 'should not extract random stuff from search statements' do
extracted = FB::Grub.extract_device_hints(grub2_search_statements)
extracted.should eq([])
end
end