Support UEFI mode for ironic
Add support uefi mode
Change-Id: If32afb9c89722d21dda340a0fc675c86cafdb80e
Related-prod: PROD-23407 (PROD:23407)
diff --git a/ironic/conductor.sls b/ironic/conductor.sls
index edfa3e4..e566200 100644
--- a/ironic/conductor.sls
+++ b/ironic/conductor.sls
@@ -41,6 +41,52 @@
- file: ironic_dirs
- pkg: ironic_conductor_packages
+{%- if conductor.uefi.enabled %}
+ironic_conductor_uefi_packages:
+ pkg.installed:
+ - names: {{ conductor.uefi_pkgs }}
+ - install_recommends: False
+ - require_in:
+ - sls: ironic._common
+
+{% for file, args in conductor.uefi_files.items() %}
+ironic_copy_uefi_{{ file }}:
+ file.managed:
+ - name: {{ conductor.tftp_root }}/{{ args['dst'] }}
+ - source: {{ args['src'] }}
+ - user: 'ironic'
+ - group: 'ironic'
+ - require:
+ - file: ironic_dirs
+ - file: ironic_uefi_grub_dir
+ - pkg: ironic_conductor_packages
+ - pkg: ironic_conductor_uefi_packages
+{%- endfor %}
+
+ironic_uefi_grub_dir:
+ file.directory:
+ - name: {{ conductor.tftp_root }}/{{ conductor.uefi.grub_dir_name }}
+ makedirs: True
+ user: 'ironic'
+ group: 'ironic'
+ - require_in:
+ - pkg: ironic_conductor_packages
+ - pkg: ironic_conductor_uefi_packages
+
+ironic_uefi_grub_cfg:
+ file.managed:
+ - name: {{ conductor.tftp_root }}/{{ conductor.uefi.grub_dir_name }}/grub.cfg
+ - contents: 'GRUB_DIR={{ conductor.tftp_root }}/{{ conductor.uefi.grub_dir_name }}'
+ - user: 'ironic'
+ - group: 'ironic'
+ - mode: 644
+ - require:
+ - file: ironic_dirs
+ - file: ironic_uefi_grub_dir
+ - pkg: ironic_conductor_packages
+ - pkg: ironic_conductor_uefi_packages
+{%- endif %}
+
{% for file in conductor.syslinux_files %}
ironic_copy_{{ file }}:
file.managed:
diff --git a/ironic/files/pike/ironic.conf b/ironic/files/pike/ironic.conf
index 40da36b..c69c81a 100644
--- a/ironic/files/pike/ironic.conf
+++ b/ironic/files/pike/ironic.conf
@@ -1612,7 +1612,11 @@
# Size of EFI system partition in MiB when configuring UEFI
# systems for local boot. (integer value)
+{%- if ironic.uefi.efi_system_partition_size is defined %}
+efi_system_partition_size = {{ ironic.uefi.efi_system_partition_size }}
+{%- else %}
#efi_system_partition_size = 200
+{%- endif %}
# Size of BIOS Boot partition in MiB when configuring GPT
# partitioned systems for local boot in BIOS. (integer value)
@@ -3781,7 +3785,11 @@
# On ironic-conductor node, template file for PXE
# configuration for UEFI boot loader. (string value)
+{%- if ironic.uefi.efi_pxe_config_template is defined %}
+uefi_pxe_config_template = {{ ironic.uefi.efi_pxe_config_template }}
+{%- else %}
#uefi_pxe_config_template = $pybasedir/drivers/modules/pxe_grub_common.template
+{%- endif %}
# On ironic-conductor node, template file for PXE
# configuration per node architecture. For example:
@@ -3817,7 +3825,13 @@
{%- endif %}
# Bootfile DHCP parameter for UEFI boot mode. (string value)
+{%- if ironic.uefi.enabled %}
+{%- if ironic.uefi.pxe_bootfile_name is defined %}
+uefi_pxe_bootfile_name={{ ironic.uefi.pxe_bootfile_name }}
+{%- else %}
#uefi_pxe_bootfile_name = bootx64.efi
+{%- endif %}
+{%- endif %}
# Bootfile DHCP parameter per node architecture. For example:
# aarch64:grubaa64.efi (dict value)
diff --git a/ironic/files/queens/ironic.conf b/ironic/files/queens/ironic.conf
index 15dbf2c..76b6fe5 100644
--- a/ironic/files/queens/ironic.conf
+++ b/ironic/files/queens/ironic.conf
@@ -1389,7 +1389,11 @@
# Size of EFI system partition in MiB when configuring UEFI
# systems for local boot. (integer value)
+{%- if ironic.uefi.efi_system_partition_size is defined %}
+efi_system_partition_size = {{ ironic.uefi.efi_system_partition_size }}
+{%- else %}
#efi_system_partition_size = 200
+{%- endif %}
# Size of BIOS Boot partition in MiB when configuring GPT
# partitioned systems for local boot in BIOS. (integer value)
@@ -2307,7 +2311,11 @@
# On ironic-conductor node, template file for PXE
# configuration for UEFI boot loader. (string value)
+{%- if ironic.uefi.efi_pxe_config_template is defined %}
+uefi_pxe_config_template = {{ ironic.uefi.efi_pxe_config_template }}
+{%- else %}
#uefi_pxe_config_template = $pybasedir/drivers/modules/pxe_grub_common.template
+{%- endif %}
# On ironic-conductor node, template file for PXE
# configuration per node architecture. For example:
@@ -2355,7 +2363,13 @@
{%- endif %}
# Bootfile DHCP parameter for UEFI boot mode. (string value)
+{%- if ironic.uefi.enabled %}
+{%- if ironic.uefi.pxe_bootfile_name is defined %}
+uefi_pxe_bootfile_name={{ ironic.uefi.pxe_bootfile_name }}
+{%- else %}
#uefi_pxe_bootfile_name = bootx64.efi
+{%- endif %}
+{%- endif %}
# Bootfile DHCP parameter per node architecture. For example:
# aarch64:grubaa64.efi (dict value)
diff --git a/ironic/map.jinja b/ironic/map.jinja
index 907f73d..ff55015 100644
--- a/ironic/map.jinja
+++ b/ironic/map.jinja
@@ -10,7 +10,11 @@
'service': 'ironic-api',
'api_type': 'mixed',
'cacert_file': cacert_file,
- 'notification': {}
+ 'notification': {},
+ 'uefi': {
+ 'grub_dir_name': 'grub',
+ 'enabled': false
+ },
}
}, base='Common', merge=pillar.ironic.get('api', {})) %}
@@ -23,17 +27,47 @@
},
'Debian': {
'pkgs': ['ipmitool', 'ironic-conductor', 'tftpd-hpa', 'syslinux-common', 'pxelinux', 'ipxe'],
+ 'uefi_pkgs': ['grub-efi-amd64-signed', 'shim-signed'],
'pxelinux_path': '/usr/lib/PXELINUX',
'syslinux_files': ['chain.c32', 'libcom32.c32', 'libutil.c32', 'ldlinux.c32'],
'syslinux_path': '/usr/lib/syslinux/modules/bios',
'ipxe_rom_path': '/usr/lib/ipxe',
+ 'uefi': {
+ 'grub_dir_name': 'grub',
+ 'enabled': false
+ },
+ 'uefi_files': {
+ 'shim': {
+ 'src': '/usr/lib/shim/shimx64.efi.signed',
+ 'dst': 'bootx64.efi'
+ },
+ 'grub2': {
+ 'src': '/usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed',
+ 'dst': 'grubx64.efi'
+ },
+ },
},
'RedHat': {
'pkgs': ['ipmitool', 'ironic-conductor', 'tftp-server', 'syslinux-extlinux', 'ipxe-bootimgs'],
+ 'uefi_pkgs': ['grub2-efi', 'shim'],
'pxelinux_path': '/usr/share/syslinux',
'syslinux_files': ['chain.c32'],
'syslinux_path': '/usr/share/syslinux',
'ipxe_rom_path': '/usr/share/ipxe',
+ 'uefi': {
+ 'grub_dir_name': 'EFI/centos',
+ 'enabled': false
+ },
+ 'uefi_files': {
+ 'shim': {
+ 'src': '/boot/efi/EFI/centos/shim.efi',
+ 'dst': 'bootx64.efi'
+ },
+ 'grub2': {
+ 'src': '/boot/efi/EFI/centos/grubx64.efi',
+ 'dst': 'grubx64.efi'
+ },
+ },
},
}, base='Common', merge=pillar.ironic.get('conductor', {})) %}
diff --git a/metadata/service/conductor/cluster.yml b/metadata/service/conductor/cluster.yml
index a65eb07..20652a6 100644
--- a/metadata/service/conductor/cluster.yml
+++ b/metadata/service/conductor/cluster.yml
@@ -6,6 +6,8 @@
ironic:
conductor:
enabled: true
+ uefi:
+ enabled: false
version: ${_param:ironic_version}
my_ip: ${_param:cluster_baremetal_local_address}
message_queue:
diff --git a/metadata/service/conductor/single.yml b/metadata/service/conductor/single.yml
index 1806b85..e50a070 100644
--- a/metadata/service/conductor/single.yml
+++ b/metadata/service/conductor/single.yml
@@ -4,6 +4,8 @@
ironic:
conductor:
enabled: true
+ uefi:
+ enabled: false
version: ${_param:ironic_version}
message_queue:
engine: rabbitmq