Merge "Provision ARM (aarch64) fake-bare-metal-vms"

This commit is contained in:
Zuul 2024-06-19 16:59:05 +00:00 committed by Gerrit Code Review
commit 19c8efd9d7
9 changed files with 350 additions and 62 deletions

View File

@ -35,8 +35,13 @@ function add_image_link {
# Do not restrict downloading image only for specific case. Download both disk and uec images. # Do not restrict downloading image only for specific case. Download both disk and uec images.
# NOTE (vdrok): Here the images are actually pre-cached by devstack, in # NOTE (vdrok): Here the images are actually pre-cached by devstack, in
# the files folder, so they won't be downloaded again. # the files folder, so they won't be downloaded again.
add_image_link http://download.cirros-cloud.net/${CIRROS_VERSION}/cirros-${CIRROS_VERSION}-x86_64-uec.tar.gz if [[ $IRONIC_HW_ARCH == "aarch64" ]]; then
add_image_link http://download.cirros-cloud.net/${CIRROS_VERSION}/cirros-${CIRROS_VERSION}-x86_64-disk.img add_image_link http://download.cirros-cloud.net/${CIRROS_VERSION}/cirros-${CIRROS_VERSION}-aarch64-uec.tar.gz
add_image_link http://download.cirros-cloud.net/${CIRROS_VERSION}/cirros-${CIRROS_VERSION}-aarch64-disk.img
else
add_image_link http://download.cirros-cloud.net/${CIRROS_VERSION}/cirros-${CIRROS_VERSION}-x86_64-uec.tar.gz
add_image_link http://download.cirros-cloud.net/${CIRROS_VERSION}/cirros-${CIRROS_VERSION}-x86_64-disk.img
fi
export IRONIC_WHOLEDISK_IMAGE_NAME=${IRONIC_WHOLEDISK_IMAGE_NAME:-${IRONIC_IMAGE_NAME/-uec/-disk}} export IRONIC_WHOLEDISK_IMAGE_NAME=${IRONIC_WHOLEDISK_IMAGE_NAME:-${IRONIC_IMAGE_NAME/-uec/-disk}}
export IRONIC_PARTITIONED_IMAGE_NAME=${IRONIC_PARTITIONED_IMAGE_NAME:-${IRONIC_IMAGE_NAME/-disk/-uec}} export IRONIC_PARTITIONED_IMAGE_NAME=${IRONIC_PARTITIONED_IMAGE_NAME:-${IRONIC_IMAGE_NAME/-disk/-uec}}

View File

@ -74,6 +74,7 @@ IRONIC_STATE_PATH=/var/lib/ironic
IRONIC_AUTH_CACHE_DIR=${IRONIC_AUTH_CACHE_DIR:-/var/cache/ironic} IRONIC_AUTH_CACHE_DIR=${IRONIC_AUTH_CACHE_DIR:-/var/cache/ironic}
IRONIC_CONF_DIR=${IRONIC_CONF_DIR:-/etc/ironic} IRONIC_CONF_DIR=${IRONIC_CONF_DIR:-/etc/ironic}
IRONIC_CONF_FILE=$IRONIC_CONF_DIR/ironic.conf IRONIC_CONF_FILE=$IRONIC_CONF_DIR/ironic.conf
IRONIC_MACHINE_TYPE=${IRONIC_MACHINE_TYPE:-q35}
# Deploy Ironic API under uwsgi (NOT mod_wsgi) server. # Deploy Ironic API under uwsgi (NOT mod_wsgi) server.
# Devstack aims to remove mod_wsgi support, so ironic shouldn't use it too. # Devstack aims to remove mod_wsgi support, so ironic shouldn't use it too.
# If set to False that will fall back to use the eventlet server that # If set to False that will fall back to use the eventlet server that
@ -109,8 +110,22 @@ IRONIC_HW_NODE_CPU=${IRONIC_HW_NODE_CPU:-1}
IRONIC_HW_NODE_RAM=${IRONIC_HW_NODE_RAM:-512} IRONIC_HW_NODE_RAM=${IRONIC_HW_NODE_RAM:-512}
IRONIC_HW_NODE_DISK=${IRONIC_HW_NODE_DISK:-10} IRONIC_HW_NODE_DISK=${IRONIC_HW_NODE_DISK:-10}
IRONIC_HW_EPHEMERAL_DISK=${IRONIC_HW_EPHEMERAL_DISK:-0} IRONIC_HW_EPHEMERAL_DISK=${IRONIC_HW_EPHEMERAL_DISK:-0}
# Ironic hardware architecture type, supported types are:
IRONIC_SUPPORTED_HW_ARCH_TYPES_RE="^(x86_64|aarch64)$"
IRONIC_HW_ARCH=${IRONIC_HW_ARCH:-x86_64} IRONIC_HW_ARCH=${IRONIC_HW_ARCH:-x86_64}
if [[ ! "$IRONIC_HW_ARCH" =~ $IRONIC_SUPPORTED_HW_ARCH_TYPES_RE ]]; then
die $LINENO "Unsupported IRONIC_HW_ARCH: $IRONIC_HW_ARCH. Expected either of 'x86_64' or 'aarch64'."
fi
IRONIC_VM_EMULATOR="/usr/bin/qemu-system-${IRONIC_HW_ARCH}"
GRUB_ARCH=x64
if [[ $IRONIC_HW_ARCH == "aarch64" ]]; then
GRUB_ARCH=aa64
fi
# Deploy Ironic Nodes & configure n-cpu for sharding # Deploy Ironic Nodes & configure n-cpu for sharding
# Currently only supports 0 (old behavior) or 1 (adds all nodes # Currently only supports 0 (old behavior) or 1 (adds all nodes
# to the same shard). You can still use this with multinode to # to the same shard). You can still use this with multinode to
@ -151,11 +166,9 @@ IRONIC_TFTP_BLOCKSIZE=${IRONIC_TFTP_BLOCKSIZE:-$((PUBLIC_BRIDGE_MTU-50))}
IRONIC_VM_COUNT=${IRONIC_VM_COUNT:-1} IRONIC_VM_COUNT=${IRONIC_VM_COUNT:-1}
IRONIC_VM_SPECS_CPU=${IRONIC_VM_SPECS_CPU:-1} IRONIC_VM_SPECS_CPU=${IRONIC_VM_SPECS_CPU:-1}
IRONIC_VM_SPECS_RAM=${IRONIC_VM_SPECS_RAM:-3072} IRONIC_VM_SPECS_RAM=${IRONIC_VM_SPECS_RAM:-3072}
IRONIC_VM_SPECS_CPU_ARCH=${IRONIC_VM_SPECS_CPU_ARCH:-'x86_64'}
IRONIC_VM_SPECS_DISK=${IRONIC_VM_SPECS_DISK:-10} IRONIC_VM_SPECS_DISK=${IRONIC_VM_SPECS_DISK:-10}
IRONIC_VM_SPECS_DISK_FORMAT=${IRONIC_VM_SPECS_DISK_FORMAT:-qcow2} IRONIC_VM_SPECS_DISK_FORMAT=${IRONIC_VM_SPECS_DISK_FORMAT:-qcow2}
IRONIC_VM_EPHEMERAL_DISK=${IRONIC_VM_EPHEMERAL_DISK:-0} IRONIC_VM_EPHEMERAL_DISK=${IRONIC_VM_EPHEMERAL_DISK:-0}
IRONIC_VM_EMULATOR=${IRONIC_VM_EMULATOR:-'/usr/bin/qemu-system-x86_64'}
IRONIC_VM_ENGINE=${IRONIC_VM_ENGINE:-qemu} IRONIC_VM_ENGINE=${IRONIC_VM_ENGINE:-qemu}
IRONIC_VM_NETWORK_BRIDGE=${IRONIC_VM_NETWORK_BRIDGE:-brbm} IRONIC_VM_NETWORK_BRIDGE=${IRONIC_VM_NETWORK_BRIDGE:-brbm}
IRONIC_VM_INTERFACE_COUNT=${IRONIC_VM_INTERFACE_COUNT:-2} IRONIC_VM_INTERFACE_COUNT=${IRONIC_VM_INTERFACE_COUNT:-2}
@ -259,9 +272,6 @@ if [[ "$IRONIC_VM_ENGINE" == "auto" ]]; then
if [ ! -e /dev/kvm ]; then if [ ! -e /dev/kvm ]; then
echo "WARNING: Switching to QEMU" echo "WARNING: Switching to QEMU"
IRONIC_VM_ENGINE=qemu IRONIC_VM_ENGINE=qemu
if [[ -z "$IRONIC_VM_EMULATOR" ]]; then
IRONIC_VM_EMULATOR='/usr/bin/qemu-system-x86_64'
fi
else else
IRONIC_VM_ENGINE=kvm IRONIC_VM_ENGINE=kvm
fi fi
@ -299,10 +309,12 @@ fi
# NOTE(TheJulia): If we ever run any arm64, we will need to consider doing # NOTE(TheJulia): If we ever run any arm64, we will need to consider doing
# the same. Nested virt is not a thing there. # the same. Nested virt is not a thing there.
# Prevent a case that will likely result in a failure. # Prevent a case that will likely result in a failure.
if [[ "$hostdomain" =~ "rax" ]] || [[ "$hostdomain" =~ "iweb" ]] || ! $(grep -q vmx /proc/cpuinfo) ; then if [[ $IRONIC_HW_ARCH != "aarch64" ]]; then
if [[ "$IRONIC_RAMDISK_TYPE" == "dib" ]]; then if [[ "$hostdomain" =~ "rax" ]] || [[ "$hostdomain" =~ "iweb" ]] || ! $(grep -q vmx /proc/cpuinfo) ; then
echo "** WARNING ** - DIB based IPA images have been defined, however we are running devstack on an environment which does not support nested VMs. Due to virtualization constraints, we are automatically falling back to TinyIPA to ensure CI job passage." if [[ "$IRONIC_RAMDISK_TYPE" == "dib" ]]; then
IRONIC_RAMDISK_TYPE="tinyipa" echo "** WARNING ** - DIB based IPA images have been defined, however we are running devstack on an environment which does not support nested VMs. Due to virtualization constraints, we are automatically falling back to TinyIPA to ensure CI job passage."
IRONIC_RAMDISK_TYPE="tinyipa"
fi
fi fi
fi fi
@ -327,6 +339,11 @@ IRONIC_EFIBOOT=${IRONIC_EFIBOOT:-$TOP_DIR/files/ir-deploy-$IRONIC_DEPLOY_DRIVER.
IPA_DOWNLOAD_BRANCH=${IPA_DOWNLOAD_BRANCH:-${TARGET_BRANCH:-master}} IPA_DOWNLOAD_BRANCH=${IPA_DOWNLOAD_BRANCH:-${TARGET_BRANCH:-master}}
IPA_DOWNLOAD_BRANCH=$(echo $IPA_DOWNLOAD_BRANCH | tr / -) IPA_DOWNLOAD_BRANCH=$(echo $IPA_DOWNLOAD_BRANCH | tr / -)
IPA_DOWNLOAD_SOURCE=ironic-python-agent
if [[ $IRONIC_HW_ARCH == "aarch64" ]]; then
IPA_DOWNLOAD_SOURCE=ironic-python-agent-builder
fi
# OS for using with DIB images # OS for using with DIB images
IRONIC_DIB_RAMDISK_OS=${IRONIC_DIB_RAMDISK_OS:-centos9} IRONIC_DIB_RAMDISK_OS=${IRONIC_DIB_RAMDISK_OS:-centos9}
IRONIC_DIB_RAMDISK_RELEASE=${IRONIC_DIB_RAMDISK_RELEASE:-} IRONIC_DIB_RAMDISK_RELEASE=${IRONIC_DIB_RAMDISK_RELEASE:-}
@ -347,8 +364,8 @@ if [[ "$IRONIC_BUILD_DEPLOY_RAMDISK" == "False" && \
IRONIC_AGENT_RAMDISK_FILE=ipa-${IRONIC_DIB_RAMDISK_OS}-${IPA_DOWNLOAD_BRANCH}.initramfs IRONIC_AGENT_RAMDISK_FILE=ipa-${IRONIC_DIB_RAMDISK_OS}-${IPA_DOWNLOAD_BRANCH}.initramfs
;; ;;
esac esac
IRONIC_AGENT_KERNEL_URL=https://tarballs.openstack.org/ironic-python-agent/${IRONIC_RAMDISK_TYPE}/files/${IRONIC_AGENT_KERNEL_FILE} IRONIC_AGENT_KERNEL_URL=https://tarballs.openstack.org/${IPA_DOWNLOAD_SOURCE}/${IRONIC_RAMDISK_TYPE}/files/${IRONIC_AGENT_KERNEL_FILE}
IRONIC_AGENT_RAMDISK_URL=https://tarballs.openstack.org/ironic-python-agent/${IRONIC_RAMDISK_TYPE}/files/${IRONIC_AGENT_RAMDISK_FILE} IRONIC_AGENT_RAMDISK_URL=https://tarballs.openstack.org/${IPA_DOWNLOAD_SOURCE}/${IRONIC_RAMDISK_TYPE}/files/${IRONIC_AGENT_RAMDISK_FILE}
fi fi
# This refers the options for disk-image-create and the platform on which # This refers the options for disk-image-create and the platform on which
@ -661,14 +678,25 @@ IRONIC_UEFI_FILES_DIR=${IRONIC_UEFI_FILES_DIR:-/var/lib/libvirt/images}
UEFI_LOADER_PATH=$IRONIC_UEFI_FILES_DIR/OVMF_CODE.fd UEFI_LOADER_PATH=$IRONIC_UEFI_FILES_DIR/OVMF_CODE.fd
UEFI_NVRAM_PATH=$IRONIC_UEFI_FILES_DIR/OVMF_VARS.fd UEFI_NVRAM_PATH=$IRONIC_UEFI_FILES_DIR/OVMF_VARS.fd
if [[ $IRONIC_HW_ARCH == "aarch64" ]]; then
UEFI_LOADER_PATH=$IRONIC_UEFI_FILES_DIR/AAVMF_CODE.fd
UEFI_NVRAM_PATH=$IRONIC_UEFI_FILES_DIR/AAVMF_VARS.fd
fi
# Handle architecture specific package installs # Handle architecture specific package installs
install_package shim shim-signed
if [[ $IRONIC_HW_ARCH == "x86_64" ]]; then if [[ $IRONIC_HW_ARCH == "x86_64" ]]; then
install_package shim
if is_ubuntu; then if is_ubuntu; then
install_package grub-efi-amd64-signed shim-signed install_package grub-efi-amd64-signed
elif is_fedora; then elif is_fedora; then
install_package grub2 grub2-efi install_package grub2 grub2-efi
fi fi
elif [[ $IRONIC_HW_ARCH == "aarch64" ]]; then
if is_ubuntu; then
install_package qemu-system-arm qemu-efi qemu-efi-aarch64
elif is_fedora; then
install_package grub2-arm64-efi
fi
fi fi
# Sanity checks # Sanity checks
@ -681,14 +709,34 @@ if [[ "$IRONIC_BOOT_MODE" == "uefi" ]]; then
die $LINENO "Boot mode UEFI only works in Ubuntu or Fedora for now." die $LINENO "Boot mode UEFI only works in Ubuntu or Fedora for now."
fi fi
if is_ubuntu && [[ -z $IRONIC_GRUB2_FILE ]]; then if is_ubuntu; then
IRONIC_GRUB2_SHIM_FILE=/usr/lib/shim/shimx64.efi.signed if [[ $IRONIC_HW_ARCH == "x86_64" ]]; then
IRONIC_GRUB2_FILE=/usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed if [[ -z $IRONIC_GRUB2_FILE ]]; then
IRONIC_GRUB2_NETWORK_FILE=/usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed IRONIC_GRUB2_SHIM_FILE=/usr/lib/shim/shimx64.efi.signed
elif is_fedora && [[ -z $IRONIC_GRUB2_FILE ]]; then IRONIC_GRUB2_FILE=/usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed
IRONIC_GRUB2_SHIM_FILE=/boot/efi/EFI/fedora/shimx64.efi IRONIC_GRUB2_NETWORK_FILE=/usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed
IRONIC_GRUB2_FILE=/boot/efi/EFI/fedora/grubx64.efi fi
IRONIC_GRUB2_NETWORK_FILE=/boot/efi/EFI/fedora/grubx64.efi elif [[ $IRONIC_HW_ARCH == "aarch64" ]]; then
if [[ -z $IRONIC_GRUB2_FILE ]]; then
IRONIC_GRUB2_SHIM_FILE=/usr/lib/shim/shimaa64.efi.signed
IRONIC_GRUB2_FILE=/usr/lib/grub/arm64-efi-signed/grubaa64.efi.signed
IRONIC_GRUB2_NETWORK_FILE=/usr/lib/grub/arm64-efi-signed/grubnetaa64.efi.signed
fi
fi
elif is_fedora; then
if [[ $IRONIC_HW_ARCH == "x86_64" ]]; then
if [[ -z $IRONIC_GRUB2_FILE ]]; then
IRONIC_GRUB2_SHIM_FILE=/boot/efi/EFI/fedora/shimx64.efi
IRONIC_GRUB2_FILE=/boot/efi/EFI/fedora/grubx64.efi
IRONIC_GRUB2_NETWORK_FILE=/boot/efi/EFI/fedora/grubx64.efi
fi
elif [[ $IRONIC_HW_ARCH == "aarch64" ]]; then
if [[ -z $IRONIC_GRUB2_FILE ]]; then
IRONIC_GRUB2_SHIM_FILE=/boot/efi/EFI/fedora/shimaa64.efi
IRONIC_GRUB2_FILE=/boot/efi/EFI/fedora/grubaa64.efi
IRONIC_GRUB2_NETWORK_FILE=/boot/efi/EFI/fedora/grubaa64.efi
fi
fi
fi fi
if [[ "$IRONIC_IPXE_ENABLED" == "False" ]]; then if [[ "$IRONIC_IPXE_ENABLED" == "False" ]]; then
@ -774,18 +822,34 @@ IRONIC_AGENT_IMAGE_DOWNLOAD_SOURCE=${IRONIC_AGENT_IMAGE_DOWNLOAD_SOURCE:-$IRONIC
# UEFI related functions # UEFI related functions
function get_uefi_loader { function get_uefi_loader {
if is_ubuntu; then if [[ $IRONIC_HW_ARCH == "aarch64" ]]; then
echo /usr/share/OVMF/OVMF_CODE.fd if is_ubuntu; then
elif is_fedora; then echo /usr/share/AAVMF/AAVMF_CODE.fd
echo /usr/share/edk2/ovmf/OVMF_CODE.fd elif is_fedora; then
echo /usr/share/edk2/aarch64/QEMU_EFI.fd
fi
else
if is_ubuntu; then
echo /usr/share/OVMF/OVMF_CODE.fd
elif is_fedora; then
echo /usr/share/edk2/ovmf/OVMF_CODE.fd
fi
fi fi
} }
function get_uefi_nvram { function get_uefi_nvram {
if is_ubuntu; then if [[ $IRONIC_HW_ARCH == "aarch64" ]]; then
echo /usr/share/OVMF/OVMF_VARS.fd if is_ubuntu; then
elif is_fedora; then echo /usr/share/AAVMF/AAVMF_VARS.fd
echo /usr/share/edk2/ovmf/OVMF_VARS.fd elif is_fedora; then
echo /usr/share/edk2/aarch64/QEMU_VARS.fd
fi
else
if is_ubuntu; then
echo /usr/share/OVMF/OVMF_VARS.fd
elif is_fedora; then
echo /usr/share/edk2/ovmf/OVMF_VARS.fd
fi
fi fi
} }
@ -1097,13 +1161,15 @@ function configure_redfish {
mkdir -p $(dirname $IRONIC_REDFISH_EMULATOR_CONFIG) mkdir -p $(dirname $IRONIC_REDFISH_EMULATOR_CONFIG)
fi fi
local ironic_node_arch=$IRONIC_HW_ARCH
cat - <<EOF > $IRONIC_REDFISH_EMULATOR_CONFIG cat - <<EOF > $IRONIC_REDFISH_EMULATOR_CONFIG
SUSHY_EMULATOR_BOOT_LOADER_MAP = { SUSHY_EMULATOR_BOOT_LOADER_MAP = {
'UEFI': { 'UEFI': {
'x86_64': '$UEFI_LOADER_PATH' '$ironic_node_arch': '$UEFI_LOADER_PATH'
}, },
'Legacy': { 'Legacy': {
'x86_64': None '$ironic_node_arch': None
} }
} }
SUSHY_EMULATOR_FEATURE_SET = "$IRONIC_REDFISH_EMULATOR_FEATURE_SET" SUSHY_EMULATOR_FEATURE_SET = "$IRONIC_REDFISH_EMULATOR_FEATURE_SET"
@ -1271,26 +1337,54 @@ function configure_ironic_dirs {
# pre-package such loader files. # pre-package such loader files.
if [[ "$IRONIC_BOOT_MODE" == "uefi" ]]; then if [[ "$IRONIC_BOOT_MODE" == "uefi" ]]; then
if is_ubuntu; then if is_ubuntu; then
# NOTE(TheJulia): This is done separately here as this allows if [[ $IRONIC_HW_ARCH == "x86_64" ]]; then
# the script to have hirtuse/bionic compatibility. # NOTE(TheJulia): This is done separately here as this allows
if [[ -f /usr/lib/ipxe/snponly.efi ]]; then # the script to have hirtuse/bionic compatibility.
update_loader_copy_paths snponly.efi:/usr/lib/ipxe/snponly.efi if [[ -f /usr/lib/ipxe/snponly.efi ]]; then
elif [[ -f /usr/lib/ipxe/ipxe.efi ]]; then update_loader_copy_paths snponly.efi:/usr/lib/ipxe/snponly.efi
update_loader_copy_paths snponly.efi:/usr/lib/ipxe/ipxe.efi elif [[ -f /usr/lib/ipxe/ipxe.efi ]]; then
update_loader_copy_paths snponly.efi:/usr/lib/ipxe/ipxe.efi
fi
elif [[ $IRONIC_HW_ARCH == "aarch64" ]]; then
# NOTE(cid): Ensure ARM-specific binaries are prepared if they don't already exist
if [[ ! -f /usr/lib/ipxe/arm/snponly.efi ]]; then
sudo mkdir -p /usr/lib/ipxe/arm
sudo wget -O /usr/lib/ipxe/arm/snponly.efi http://boot.ipxe.org/arm64-efi/snponly.efi
fi
if [[ -f /usr/lib/ipxe/arm/snponly.efi ]]; then
update_loader_copy_paths snponly.efi:/usr/lib/ipxe/arm/snponly.efi
elif [[ -f /usr/lib/ipxe/arm/ipxe.efi ]]; then
update_loader_copy_paths snponly.efi:/usr/lib/ipxe/arm/ipxe.efi
fi
fi fi
fi fi
if is_fedora; then if is_fedora; then
if [ -f /usr/share/ipxe/ipxe-snponly-x86_64.efi ]; then if [[ $IRONIC_HW_ARCH == "x86_64" ]]; then
# NOTE(TheJulia): I think this file got renamed at some if [[ -f /usr/share/ipxe/ipxe-snponly-x86_64.efi ]]; then
# point during it's centos8 run, but this is current. # NOTE(TheJulia): I think this file got renamed at some
update_loader_copy_paths snponly.efi:/usr/share/ipxe/ipxe-snponly-x86_64.efi # point during its centos8 run, but this is current.
update_loader_copy_paths snponly.efi:/usr/share/ipxe/ipxe-snponly-x86_64.efi
fi
elif [[ $IRONIC_HW_ARCH == "aarch64" ]]; then
if [[ -f /usr/share/ipxe/arm/ipxe-snponly-aarch64.efi ]]; then
update_loader_copy_paths snponly.efi:/usr/share/ipxe/arm/ipxe-snponly-aarch64.efi
fi
fi fi
fi fi
if [ -f $IRONIC_GRUB2_SHIM_FILE ]; then
update_loader_copy_paths "bootx64.efi:$IRONIC_GRUB2_SHIM_FILE" if [[ "$IRONIC_HW_ARCH" == "aarch64" ]]; then
fi if [ -f $IRONIC_GRUB2_SHIM_FILE ]; then
if [ -f $IRONIC_GRUB2_SHIM_FILE ]; then update_loader_copy_paths "bootaa64.efi:$IRONIC_GRUB2_SHIM_FILE"
update_loader_copy_paths "grubx64.efi:$IRONIC_GRUB2_NETWORK_FILE" update_loader_copy_paths "grubaa64.efi:$IRONIC_GRUB2_FILE"
fi
else
if [ -f $IRONIC_GRUB2_SHIM_FILE ]; then
update_loader_copy_paths "bootx64.efi:$IRONIC_GRUB2_SHIM_FILE"
fi
if [ -f $IRONIC_GRUB2_SHIM_FILE ]; then
update_loader_copy_paths "grubx64.efi:$IRONIC_GRUB2_NETWORK_FILE"
fi
fi fi
else else
if [[ -f /usr/lib/ipxe/undionly.kpxe ]]; then if [[ -f /usr/lib/ipxe/undionly.kpxe ]]; then
@ -2176,9 +2270,10 @@ function create_bridge_and_vms {
newgrp $LIBVIRT_GROUP <<SUBSHELL newgrp $LIBVIRT_GROUP <<SUBSHELL
$IRONIC_SCRIPTS_DIR/create-node.sh -n $vm_name \ $IRONIC_SCRIPTS_DIR/create-node.sh -n $vm_name \
-c $IRONIC_VM_SPECS_CPU -m $IRONIC_VM_SPECS_RAM -d $IRONIC_VM_SPECS_DISK \ -c $IRONIC_VM_SPECS_CPU -m $IRONIC_VM_SPECS_RAM -d $IRONIC_VM_SPECS_DISK \
-a $IRONIC_VM_SPECS_CPU_ARCH -b $IRONIC_VM_NETWORK_BRIDGE $vm_opts -p $vbmc_port -o $pdu_outlet \ -a $IRONIC_HW_ARCH -b $IRONIC_VM_NETWORK_BRIDGE $vm_opts -p $vbmc_port -o $pdu_outlet \
-i $IRONIC_VM_INTERFACE_COUNT -f $IRONIC_VM_SPECS_DISK_FORMAT -M $PUBLIC_BRIDGE_MTU $log_arg \ -i $IRONIC_VM_INTERFACE_COUNT -f $IRONIC_VM_SPECS_DISK_FORMAT -M $PUBLIC_BRIDGE_MTU $log_arg \
-v $IRONIC_VM_VOLUME_COUNT -P $LIBVIRT_STORAGE_POOL >> $IRONIC_VM_MACS_CSV_FILE -v $IRONIC_VM_VOLUME_COUNT -P $LIBVIRT_STORAGE_POOL \
-t $IRONIC_MACHINE_TYPE >> $IRONIC_VM_MACS_CSV_FILE
SUBSHELL SUBSHELL
if is_deployed_by_ipmi; then if is_deployed_by_ipmi; then
@ -2438,7 +2533,7 @@ function enroll_nodes {
local ironic_node_ram=$IRONIC_VM_SPECS_RAM local ironic_node_ram=$IRONIC_VM_SPECS_RAM
local ironic_node_disk=$IRONIC_VM_SPECS_DISK local ironic_node_disk=$IRONIC_VM_SPECS_DISK
local ironic_ephemeral_disk=$IRONIC_VM_EPHEMERAL_DISK local ironic_ephemeral_disk=$IRONIC_VM_EPHEMERAL_DISK
local ironic_node_arch=x86_64 local ironic_node_arch=$IRONIC_HW_ARCH
if [[ ! -f $IRONIC_VM_MACS_CSV_FILE ]]; then if [[ ! -f $IRONIC_VM_MACS_CSV_FILE ]]; then
touch $IRONIC_VM_MACS_CSV_FILE touch $IRONIC_VM_MACS_CSV_FILE
fi fi
@ -2947,7 +3042,8 @@ function upload_image_if_needed {
echo Building a Cirros image suitable for local boot echo Building a Cirros image suitable for local boot
local dest local dest
IRONIC_PARTITIONED_IMAGE_NAME=cirros-${CIRROS_VERSION}-x86_64-partition IRONIC_PARTITIONED_IMAGE_NAME=cirros-${CIRROS_VERSION}-${IRONIC_HW_ARCH}-partition
dest="$IRONIC_DATA_DIR/$IRONIC_PARTITIONED_IMAGE_NAME.img" dest="$IRONIC_DATA_DIR/$IRONIC_PARTITIONED_IMAGE_NAME.img"
# Export some variables that the script is using. # Export some variables that the script is using.
@ -3012,14 +3108,14 @@ function upload_baremetal_ironic_efiboot {
sudo mkdir -p $efiboot_mount/efi/boot sudo mkdir -p $efiboot_mount/efi/boot
if [[ "$IRONIC_GRUB2_SHIM_FILE" =~ "http".* ]]; then if [[ "$IRONIC_GRUB2_SHIM_FILE" =~ "http".* ]]; then
sudo wget "$IRONIC_GRUB2_SHIM_FILE" -O $efiboot_mount/efi/boot/bootx64.efi sudo wget "$IRONIC_GRUB2_SHIM_FILE" -O $efiboot_mount/efi/boot/boot${GRUB_ARCH}.efi
else else
sudo cp "$IRONIC_GRUB2_SHIM_FILE" $efiboot_mount/efi/boot/bootx64.efi sudo cp "$IRONIC_GRUB2_SHIM_FILE" $efiboot_mount/efi/boot/boot${GRUB_ARCH}.efi
fi fi
if [[ "$IRONIC_GRUB2_FILE" =~ "http".* ]]; then if [[ "$IRONIC_GRUB2_FILE" =~ "http".* ]]; then
sudo wget "$IRONIC_GRUB2_FILE" -O $efiboot_mount/efi/boot/grubx64.efi sudo wget "$IRONIC_GRUB2_FILE" -O $efiboot_mount/efi/boot/grub${GRUB_ARCH}.efi
else else
sudo cp "$IRONIC_GRUB2_FILE" $efiboot_mount/efi/boot/grubx64.efi sudo cp "$IRONIC_GRUB2_FILE" $efiboot_mount/efi/boot/grub${GRUB_ARCH}.efi
fi fi
sudo umount $efiboot_mount sudo umount $efiboot_mount

View File

@ -49,7 +49,7 @@ CONSOLE_PTY = """
<target port='0'/> <target port='0'/>
</serial> </serial>
<console type='pty'> <console type='pty'>
<target type='serial' port='0'/> <target port='0'/>
</console> </console>
""" """
@ -136,6 +136,7 @@ def main():
params['console'] = CONSOLE_LOG % {'console_log': args.console_log} params['console'] = CONSOLE_LOG % {'console_log': args.console_log}
else: else:
params['console'] = CONSOLE_PTY params['console'] = CONSOLE_PTY
libvirt_template = template.render(**params) libvirt_template = template.render(**params)
conn = libvirt.open("qemu:///system") conn = libvirt.open("qemu:///system")

View File

@ -12,7 +12,7 @@ export PS4='+ ${BASH_SOURCE:-}:${FUNCNAME[0]:-}:L${LINENO:-}: '
# Keep track of the DevStack directory # Keep track of the DevStack directory
TOP_DIR=$(cd $(dirname "$0")/.. && pwd) TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
while getopts "n:c:i:m:M:d:a:b:e:E:p:o:f:l:L:N:A:D:v:P:" arg; do while getopts "n:c:i:m:M:d:a:b:e:E:p:o:f:l:L:N:A:D:v:P:t:" arg; do
case $arg in case $arg in
n) NAME=$OPTARG;; n) NAME=$OPTARG;;
c) CPU=$OPTARG;; c) CPU=$OPTARG;;
@ -36,6 +36,7 @@ while getopts "n:c:i:m:M:d:a:b:e:E:p:o:f:l:L:N:A:D:v:P:" arg; do
D) NIC_DRIVER=$OPTARG;; D) NIC_DRIVER=$OPTARG;;
v) VOLUME_COUNT=$OPTARG;; v) VOLUME_COUNT=$OPTARG;;
P) STORAGE_POOL=$OPTARG;; P) STORAGE_POOL=$OPTARG;;
t) MACHINE_TYPE=$OPTARG;;
esac esac
done done
@ -123,11 +124,12 @@ if ! virsh list --all | grep -q $NAME; then
if [[ -n "$EMULATOR" ]]; then if [[ -n "$EMULATOR" ]]; then
vm_opts+="--emulator $EMULATOR " vm_opts+="--emulator $EMULATOR "
fi fi
$PYTHON $TOP_DIR/scripts/configure-vm.py \ $PYTHON $TOP_DIR/scripts/configure-vm.py \
--bootdev network --name $NAME \ --bootdev network --name $NAME \
--arch $ARCH --cpus $CPU --memory $MEM --libvirt-nic-driver $LIBVIRT_NIC_DRIVER \ --arch $ARCH --cpus $CPU --memory $MEM --libvirt-nic-driver $LIBVIRT_NIC_DRIVER \
--disk-format $DISK_FORMAT $VM_LOGGING --engine $ENGINE $UEFI_OPTS $vm_opts \ --disk-format $DISK_FORMAT $VM_LOGGING --engine $ENGINE $UEFI_OPTS $vm_opts \
--interface-count $INTERFACE_COUNT $MAC_ADDRESS >&2 --interface-count $INTERFACE_COUNT $MAC_ADDRESS --machine_type $MACHINE_TYPE >&2
fi fi
# echo mac in format mac1,ovs-node-0i1;mac2,ovs-node-0i2;...;macN,ovs-node0iN # echo mac in format mac1,ovs-node-0i1;mac2,ovs-node-0i2;...;macN,ovs-node0iN

View File

@ -14,10 +14,19 @@
{% endif %} {% endif %}
{% endif %} {% endif %}
<bootmenu enable='no'/> <bootmenu enable='no'/>
{% if arch != 'aarch64' %}
<bios useserial='yes'/> <bios useserial='yes'/>
{% endif %}
</os> </os>
{% if engine == 'kvm' %} {% if engine == 'kvm' or arch == 'aarch64' %}
<cpu mode='host-passthrough'/> {% if engine == 'kvm' %}
<cpu mode='host-passthrough'/>
{% endif %}
{% if arch == 'aarch64' %}
<cpu mode='custom' match='exact' check='none'>
<model fallback='allow'>cortex-a53</model>
</cpu>
{% endif %}
{% else %} {% else %}
<cpu mode='host-model'/> <cpu mode='host-model'/>
{% endif %} {% endif %}

View File

@ -0,0 +1,105 @@
=====================================================
Deploying Ironic on ARM64 with DevStack
=====================================================
The instructions here are specifically on how to configure for
`Deploying Ironic with DevStack <https://docs.openstack.org/ironic/latest/contributor/devstack-guide.html>`_
on an ARM64 architecture.
.. _ARM64configurations:
Configurations
==============
Create devstack/local.conf with the following content::
cat >local.conf <<END
[[local|localrc]]
# Enable and disable services
disable_all_services
# enable_service <service name>
# Credentials
ADMIN_PASSWORD=password
DATABASE_PASSWORD=password
RABBIT_PASSWORD=password
SERVICE_PASSWORD=password
SERVICE_TOKEN=password
# Set glance's default limit to be baremetal image friendly
GLANCE_LIMIT_IMAGE_SIZE_TOTAL=5000
# Enable Ironic plugin
enable_plugin ironic https://opendev.org/openstack/ironic
# Create a virtual machine to pose as Ironic's baremetal node.
IRONIC_VM_COUNT=1
# The parameters below represent the minimum possible values to create
# functional aarch64-based nodes.
IRONIC_VM_SPECS_RAM=4096
IRONIC_VM_SPECS_DISK=3
IRONIC_VM_SPECS_CPU=1
IRONIC_VM_VOLUME_COUNT=2
IRONIC_RPC_TRANSPORT=json-rpc
IRONIC_RAMDISK_TYPE=dib
# Enable hardware types and interfaces.
IRONIC_ENABLED_HARDWARE_TYPES=redfish
IRONIC_ENABLED_MANAGEMENT_INTERFACES=redfish
IRONIC_DEFAULT_RESCUE_INTERFACE=agent
IRONIC_ENABLED_BOOT_INTERFACES="ipxe,redfish-virtual-media,http-ipxe,pxe,http"
IRONIC_ENABLED_DEPLOY_INTERFACES="direct,ramdisk"
IRONIC_ENABLED_RESCUE_INTERFACES="agent,no-rescue"
# Specify deploy driver. This driver should be in the enabled list above.
IRONIC_DEPLOY_DRIVER=redfish
CIRROS_VERSION=0.6.1
CIRROS_ARCH=aarch64
DEFAULT_IMAGE_NAME=cirros-0.6.1-aarch64-uec
FORCE_CONFIG_DRIVE=False
# aarch64 + IRONIC_BUILD_DEPLOY_RAMDISK will be a bad mix
IRONIC_BUILD_DEPLOY_RAMDISK=False
IRONIC_AGENT_IMAGE_DOWNLOAD_SOURCE=http
IRONIC_AUTOMATED_CLEAN_ENABLED=False
IRONIC_BOOT_MODE=uefi
IRONIC_CALLBACK_TIMEOUT=800
IRONIC_GRUB2_SHIM_FILE=https://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/EFI/BOOT/BOOTAA64.EFI
IRONIC_GRUB2_FILE=https://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/EFI/BOOT/grubaa64.efi
IRONIC_HW_ARCH=aarch64
IRONIC_MACHINE_TYPE=virt-6.2
IRONIC_JSON_RPC_AUTH_STRATEGY='http_basic'
IRONIC_DIB_RAMDISK_OS=debian-arm64
INSTALL_TEMPEST=False
VIRT_DRIVER=ironic
# By default, DevStack creates a 10.0.0.0/24 network for instances.
# If this overlaps with the hosts network, you may adjust with the
# following.
IP_VERSION=4
FIXED_RANGE=10.1.0.0/20
IPV4_ADDRS_SAFE_TO_USE=10.1.0.0/20
NETWORK_GATEWAY=10.1.0.1
Q_AGENT=openvswitch
Q_ML2_PLUGIN_MECHANISM_DRIVERS=openvswitch
Q_ML2_TENANT_NETWORK_TYPE=vxlan
# Log all output to files
LOGFILE=/opt/stack/devstack.log
LOGDIR=/opt/stack/logs
IRONIC_VM_LOG_DIR=/opt/stack/ironic-bm-logs
END
This configuration sets up DevStack to work with ARM architecture hardware,
using aarch64 images and appropriate hardware types, interfaces, and settings.
Refer to the `Ironic on Devstack setup guide <https://docs.openstack.org/ironic/latest/contributor/devstack-guide.html>`_ for more information on deploying Ironic with DevStack.

View File

@ -270,7 +270,7 @@ documentation:
Ironic Boot from Volume <ironic-boot-from-volume> Ironic Boot from Volume <ironic-boot-from-volume>
Ironic w/Multitenant Networking <ironic-multitenant-networking> Ironic w/Multitenant Networking <ironic-multitenant-networking>
Deploying Ironic on ARM64 architecture with DevStack <arm-devstack-guide>
Deploying to Ironic node using Nova Deploying to Ironic node using Nova
=================================== ===================================

View File

@ -101,6 +101,74 @@
s-object: False s-object: False
s-proxy: False s-proxy: False
- job:
name: ironic-standalone-aarch64
description:
Test ironic standalone configured with ipmi hardware type, ramdisk and
direct deploy interfaces, rescue enabled.
parent: ironic-base
irrelevant-files:
- ^.*\.rst$
- ^api-ref/.*$
- ^doc/.*$
- ^install-guide/.*$
- ^ironic/locale/.*$
- ^ironic/tests/.*$
- ^releasenotes/.*$
- ^setup.cfg$
- ^test-requirements.txt$
- ^tools/.*$
- ^tox.ini$
vars:
tempest_test_regex: BaremetalDriverDirectWholedisk
tempest_concurrency: 2
devstack_localrc:
CIRROS_VERSION: 0.6.1
CIRROS_ARCH: aarch64
DEFAULT_IMAGE_NAME: cirros-0.6.1-aarch64-uec
FORCE_CONFIG_DRIVE: False
IRONIC_AGENT_IMAGE_DOWNLOAD_SOURCE: http
IRONIC_AUTOMATED_CLEAN_ENABLED: False
IRONIC_BUILD_DEPLOY_RAMDISK: False
IRONIC_DEPLOY_DRIVER: redfish
IRONIC_DEFAULT_RESCUE_INTERFACE: agent
IRONIC_ENABLED_BOOT_INTERFACES: "ipxe,redfish-virtual-media,http-ipxe,pxe,http"
IRONIC_ENABLED_HARDWARE_TYPES: redfish
IRONIC_ENABLED_MANAGEMENT_INTERFACES: redfish
IRONIC_ENABLED_DEPLOY_INTERFACES: "direct,ramdisk"
IRONIC_ENABLED_RESCUE_INTERFACES: "agent,no-rescue"
IRONIC_BOOT_MODE: uefi
IRONIC_CALLBACK_TIMEOUT: 800
IRONIC_GRUB2_SHIM_FILE: https://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/EFI/BOOT/BOOTAA64.EFI
IRONIC_GRUB2_FILE: https://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/EFI/BOOT/grubaa64.efi
IRONIC_HW_ARCH: aarch64
IRONIC_MACHINE_TYPE: virt-6.2
IRONIC_JSON_RPC_AUTH_STRATEGY: 'http_basic'
IRONIC_DIB_RAMDISK_OS: debian-arm64
IRONIC_RAMDISK_TYPE: dib
IRONIC_RPC_TRANSPORT: json-rpc
IRONIC_VM_SPECS_RAM: 4096
IRONIC_VM_SPECS_CPU: 1
IRONIC_VM_COUNT: 1
IRONIC_VM_VOLUME_COUNT: 2
# We're using a lot of disk space in this job. Some testing nodes have
# a small root partition, so use /opt which is mounted from a bigger
# ephemeral partition on such nodes
LIBVIRT_STORAGE_POOL_PATH: /opt/libvirt/images
devstack_services:
n-api: False
n-api-meta: False
n-cond: False
n-cpu: False
n-novnc: False
n-sch: False
nova: False
placement-api: False
s-account: False
s-container: False
s-object: False
s-proxy: False
# NOTE(TheJulia): This job is being phased out as it ends up executing # NOTE(TheJulia): This job is being phased out as it ends up executing
# the wholedisk standalone deploy, the partition standalone deploy, # the wholedisk standalone deploy, the partition standalone deploy,
# software raid tests, and ramdisk iso boot tests. All of this while in # software raid tests, and ramdisk iso boot tests. All of this while in

View File

@ -55,6 +55,8 @@
voting: false voting: false
- ironic-inspector-tempest-uefi-redfish-vmedia: - ironic-inspector-tempest-uefi-redfish-vmedia:
voting: false voting: false
- ironic-standalone-aarch64:
voting: false
- ironic-tempest-ipa-wholedisk-bios-ipmi-direct-dib: - ironic-tempest-ipa-wholedisk-bios-ipmi-direct-dib:
voting: false voting: false
- ironic-tempest-ipxe-ipv6: - ironic-tempest-ipxe-ipv6: