From be958cc538bd32f77d0a19795c7c3bb096a4da0f Mon Sep 17 00:00:00 2001 From: Takashi Kajinami Date: Wed, 1 Nov 2023 18:51:15 +0900 Subject: [PATCH] pxe: Support _by_arch options This introduces support for the following parameters which defines files used for specific architecture such as aarch64. - [pxe] uefi_pxe_bootfile_name - [pxe] uefi_ipxe_bootfile_name - [pxe] pxe_config_template_by_arch Change-Id: I85a3c71b3dd00dff9538c248d4b1ea7e7ef800cb --- manifests/drivers/pxe.pp | 79 ++++++++++++++----- .../notes/pxe_by_arch-551ebe3bf9b5e7d4.yaml | 9 +++ spec/classes/ironic_drivers_pxe_spec.rb | 71 ++++++++++++----- 3 files changed, 118 insertions(+), 41 deletions(-) create mode 100644 releasenotes/notes/pxe_by_arch-551ebe3bf9b5e7d4.yaml diff --git a/manifests/drivers/pxe.pp b/manifests/drivers/pxe.pp index 24d16a1a..e2fc662d 100644 --- a/manifests/drivers/pxe.pp +++ b/manifests/drivers/pxe.pp @@ -119,6 +119,18 @@ # PXE/iXPE boot folders values from the host operating system. # Defaults to $facts['os_service_default']. # +# [*pxe_bootfile_name_by_arch*] +# (optional) Bootfile DHCP parameter per node architecture. +# Defaults to $facts['os_service_default']. +# +# [*ipxe_bootfile_name_by_arch*] +# (optional) Bootfile DHCP parameter per node architecture. +# Defaults to $facts['os_service_default']. +# +# [*pxe_config_template_by_arch*] +# (optional) Template file for PXE configuration per node architecture. +# Defaults to $facts['os_service_default']. +# # DEPRECATED PARAMETERS # # [*ip_version*] @@ -129,28 +141,31 @@ # Defaults to $facts['os_service_default']. # class ironic::drivers::pxe ( - $kernel_append_params = $facts['os_service_default'], - $pxe_bootfile_name = $facts['os_service_default'], - $pxe_config_template = $facts['os_service_default'], - $ipxe_bootfile_name = $facts['os_service_default'], - $ipxe_config_template = $facts['os_service_default'], - $tftp_server = $facts['os_service_default'], - $tftp_root = '/tftpboot', - $images_path = $facts['os_service_default'], - $tftp_master_path = $facts['os_service_default'], - $instance_master_path = $facts['os_service_default'], - $uefi_pxe_bootfile_name = $::ironic::params::uefi_pxe_bootfile_name, - $uefi_pxe_config_template = $facts['os_service_default'], - $uefi_ipxe_bootfile_name = $::ironic::params::uefi_ipxe_bootfile_name, - $ipxe_timeout = $facts['os_service_default'], - Boolean $enable_ppc64le = false, - $boot_retry_timeout = $facts['os_service_default'], - $boot_retry_check_interval = $facts['os_service_default'], - $dir_permission = $facts['os_service_default'], - $file_permission = $facts['os_service_default'], - $loader_file_paths = $facts['os_service_default'], + $kernel_append_params = $facts['os_service_default'], + $pxe_bootfile_name = $facts['os_service_default'], + $pxe_config_template = $facts['os_service_default'], + $ipxe_bootfile_name = $facts['os_service_default'], + $ipxe_config_template = $facts['os_service_default'], + $tftp_server = $facts['os_service_default'], + $tftp_root = '/tftpboot', + $images_path = $facts['os_service_default'], + $tftp_master_path = $facts['os_service_default'], + $instance_master_path = $facts['os_service_default'], + $uefi_pxe_bootfile_name = $::ironic::params::uefi_pxe_bootfile_name, + $uefi_pxe_config_template = $facts['os_service_default'], + $uefi_ipxe_bootfile_name = $::ironic::params::uefi_ipxe_bootfile_name, + $ipxe_timeout = $facts['os_service_default'], + Boolean $enable_ppc64le = false, + $boot_retry_timeout = $facts['os_service_default'], + $boot_retry_check_interval = $facts['os_service_default'], + $dir_permission = $facts['os_service_default'], + $file_permission = $facts['os_service_default'], + $loader_file_paths = $facts['os_service_default'], + $pxe_bootfile_name_by_arch = $facts['os_service_default'], + $ipxe_bootfile_name_by_arch = $facts['os_service_default'], + $pxe_config_template_by_arch = $facts['os_service_default'], # DEPRECATED PARAMETERS - $ip_version = undef, + $ip_version = undef, ) inherits ironic::params { include ironic::deps @@ -196,6 +211,19 @@ class ironic::drivers::pxe ( 'pxe/ip_version': value => $ip_version_real; } + $pxe_bootfile_name_by_arch_real = $pxe_bootfile_name_by_arch ? { + Hash => join(join_keys_to_values($pxe_bootfile_name_by_arch, ':'), ','), + default => join(any2array($pxe_bootfile_name_by_arch), ',') + } + $ipxe_bootfile_name_by_arch_real = $ipxe_bootfile_name_by_arch ? { + Hash => join(join_keys_to_values($ipxe_bootfile_name_by_arch, ':'), ','), + default => join(any2array($ipxe_bootfile_name_by_arch), ',') + } + $pxe_config_template_by_arch_real = $pxe_config_template_by_arch ? { + Hash => join(join_keys_to_values($pxe_config_template_by_arch, ':'), ','), + default => join(any2array($pxe_config_template_by_arch), ',') + } + if $enable_ppc64le { # FXIME(tonyb): As these are really hash values it would be better to model # them that way. We can do that later, probably when we add another @@ -210,6 +238,15 @@ class ironic::drivers::pxe ( 'pxe/pxe_config_template_by_arch': value => 'ppc64le:$pybasedir/drivers/modules/pxe_config.template'; 'pxe/pxe_bootfile_name_by_arch': value => 'ppc64le:config'; } + } else { + ironic_config { + 'pxe/pxe_config_template_by_arch': value => $pxe_config_template_by_arch_real; + 'pxe/pxe_bootfile_name_by_arch': value => $pxe_bootfile_name_by_arch_real; + } + } + + ironic_config { + 'pxe/ipxe_bootfile_name_by_arch': value => $ipxe_bootfile_name_by_arch_real; } } diff --git a/releasenotes/notes/pxe_by_arch-551ebe3bf9b5e7d4.yaml b/releasenotes/notes/pxe_by_arch-551ebe3bf9b5e7d4.yaml new file mode 100644 index 00000000..251d28a5 --- /dev/null +++ b/releasenotes/notes/pxe_by_arch-551ebe3bf9b5e7d4.yaml @@ -0,0 +1,9 @@ +--- +features: + - | + The following parameters have been added to the ``ironic::drive::pxe`` + class. + + - ``pxe_bootfile_name_by_arch`` + - ``ipxe_bootfile_name_by_arch`` + - ``pxe_config_template_by_arch`` diff --git a/spec/classes/ironic_drivers_pxe_spec.rb b/spec/classes/ironic_drivers_pxe_spec.rb index 27bf51ec..3164d406 100644 --- a/spec/classes/ironic_drivers_pxe_spec.rb +++ b/spec/classes/ironic_drivers_pxe_spec.rb @@ -45,6 +45,9 @@ describe 'ironic::drivers::pxe' do is_expected.to contain_ironic_config('pxe/file_permission').with_value('') is_expected.to contain_ironic_config('pxe/loader_file_paths').with_value('') is_expected.to contain_ironic_config('pxe/ipxe_enabled').with_ensure('absent') + is_expected.to contain_ironic_config('pxe/pxe_bootfile_name_by_arch').with_value('') + is_expected.to contain_ironic_config('pxe/ipxe_bootfile_name_by_arch').with_value('') + is_expected.to contain_ironic_config('pxe/pxe_config_template_by_arch').with_value('') end context 'when overriding only enable_ppc64le' do @@ -63,25 +66,36 @@ describe 'ironic::drivers::pxe' do context 'when overriding parameters' do before do params.merge!( - :kernel_append_params => 'foo', - :pxe_config_template => 'bar', - :tftp_server => '192.168.0.1', - :tftp_root => '/mnt/ftp', - :images_path => '/mnt/images', - :tftp_master_path => '/mnt/master_images', - :instance_master_path => '/mnt/ironic/master_images', - :uefi_ipxe_bootfile_name => 'ipxe.efi', - :uefi_pxe_bootfile_name => 'shim-x64.efi', - :uefi_pxe_config_template => 'foo-uefi', - :ipxe_timeout => '60', - :pxe_bootfile_name => 'bootx64', - :boot_retry_timeout => 600, - :boot_retry_check_interval => 120, - :dir_permission => '0o755', - :file_permission => '0o644', - :loader_file_paths => ['ipxe.efi:/usr/share/ipxe/ipxe-snponly-x86_64.efi', - 'undionly.kpxe:/usr/share/ipxe/undionly.kpxe'], - :ip_version => 6, + :kernel_append_params => 'foo', + :pxe_config_template => 'bar', + :tftp_server => '192.168.0.1', + :tftp_root => '/mnt/ftp', + :images_path => '/mnt/images', + :tftp_master_path => '/mnt/master_images', + :instance_master_path => '/mnt/ironic/master_images', + :uefi_ipxe_bootfile_name => 'ipxe.efi', + :uefi_pxe_bootfile_name => 'shim-x64.efi', + :uefi_pxe_config_template => 'foo-uefi', + :ipxe_timeout => '60', + :pxe_bootfile_name => 'bootx64', + :boot_retry_timeout => 600, + :boot_retry_check_interval => 120, + :dir_permission => '0o755', + :file_permission => '0o644', + :loader_file_paths => [ + 'ipxe.efi:/usr/share/ipxe/ipxe-snponly-x86_64.efi', + 'undionly.kpxe:/usr/share/ipxe/undionly.kpxe' + ], + :ip_version => 6, + :pxe_bootfile_name_by_arch => [ + 'aarch64:grubaa64.efi' + ], + :ipxe_bootfile_name_by_arch => [ + 'aarch64:ipxe_aa64.efi' + ], + :pxe_config_template_by_arch => [ + 'aarch64:/opt/share/grubaa64_pxe_config.template' + ] ) end @@ -105,22 +119,39 @@ describe 'ironic::drivers::pxe' do is_expected.to contain_ironic_config('pxe/loader_file_paths') .with_value('ipxe.efi:/usr/share/ipxe/ipxe-snponly-x86_64.efi,undionly.kpxe:/usr/share/ipxe/undionly.kpxe') is_expected.to contain_ironic_config('pxe/ip_version').with_value(params[:ip_version]) + is_expected.to contain_ironic_config('pxe/pxe_bootfile_name_by_arch').with_value('aarch64:grubaa64.efi') + is_expected.to contain_ironic_config('pxe/ipxe_bootfile_name_by_arch').with_value('aarch64:ipxe_aa64.efi') + is_expected.to contain_ironic_config('pxe/pxe_config_template_by_arch') + .with_value('aarch64:/opt/share/grubaa64_pxe_config.template') end end context 'when overriding parameters (hash values)' do before do params.merge!( - :loader_file_paths => { + :loader_file_paths => { 'ipxe.efi' => '/usr/share/ipxe/ipxe-snponly-x86_64.efi', 'undionly.kpxe' => '/usr/share/ipxe/undionly.kpxe' }, + :pxe_bootfile_name_by_arch => { + 'aarch64' => 'grubaa64.efi' + }, + :ipxe_bootfile_name_by_arch => { + 'aarch64' => 'ipxe_aa64.efi' + }, + :pxe_config_template_by_arch => { + 'aarch64' => '/opt/share/grubaa64_pxe_config.template' + } ) end it 'should replace default parameter with new value' do is_expected.to contain_ironic_config('pxe/loader_file_paths') .with_value('ipxe.efi:/usr/share/ipxe/ipxe-snponly-x86_64.efi,undionly.kpxe:/usr/share/ipxe/undionly.kpxe') + is_expected.to contain_ironic_config('pxe/pxe_bootfile_name_by_arch').with_value('aarch64:grubaa64.efi') + is_expected.to contain_ironic_config('pxe/ipxe_bootfile_name_by_arch').with_value('aarch64:ipxe_aa64.efi') + is_expected.to contain_ironic_config('pxe/pxe_config_template_by_arch') + .with_value('aarch64:/opt/share/grubaa64_pxe_config.template') end end