Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
f08e3d8
Clear affinity before deleting stale conductor
Afonne-CID Apr 1, 2026
eda12b9
Merge "Clear affinity before deleting stale conductor"
Apr 4, 2026
d9a953f
Remove IRONIC_RAMDISK_TYPE devstack setting
juliakreger Apr 6, 2026
afb64cf
Remove iLO hardware type and interfaces
jayofdoom Mar 30, 2026
4527983
gracefully handle plugging the port for a test node
cardoe Apr 7, 2026
1697ff3
devstack: fix qrouter used in iptables calls
cardoe Apr 8, 2026
b9c5161
fix ip route call to be idempotent
cardoe Apr 8, 2026
8a0116f
devstack: Drop dead reference to pyghmi
stephenfin Apr 8, 2026
7eec8f6
Merge "gracefully handle plugging the port for a test node"
Apr 11, 2026
1bebb71
Merge "devstack: fix qrouter used in iptables calls"
Apr 11, 2026
202bfb5
Merge "fix ip route call to be idempotent"
Apr 11, 2026
ddf1eb2
Merge "Remove IRONIC_RAMDISK_TYPE devstack setting"
Apr 11, 2026
776a146
Improve search experience in Ironic docs
AnishereMariam Apr 12, 2026
88ae571
runbooks: add traits support, description field, and v1.112 API
cardoe Mar 26, 2026
c4d98ae
Merge "Remove iLO hardware type and interfaces"
Apr 13, 2026
c8a501c
Merge "Improve search experience in Ironic docs"
Apr 13, 2026
a5cc727
devstack: skip qrouter namespace config for ovn
karelyatin Apr 13, 2026
ef253eb
Merge "runbooks: add traits support, description field, and v1.112 API"
Apr 13, 2026
1d6c70d
merge upstream/master into main
Apr 15, 2026
f4d02ae
UPSTREAM: <carry>: add OWNERS and test dockerfile back again
elfosardo May 5, 2023
a1aa476
UPSTREAM: <carry>: Do not upgrade test image
elfosardo May 24, 2023
e53f85c
DPU modeling - parent_node DB/Model/API
juliakreger Apr 11, 2023
ca5f65f
follow-up on DPU change api-ref
juliakreger May 24, 2023
0fee4f3
UPSTREAM: <carry>: update base image for OCP 4.15
elfosardo Oct 18, 2023
c070367
UPSTREAM: <carry>: add ci-operator config
elfosardo Dec 12, 2023
3080f2f
UPSTREAM: <carry>: install distro pbr
elfosardo Dec 13, 2023
075a192
Revert "UPSTREAM: <carry>: install distro pbr"
elfosardo Dec 14, 2023
9b73fd6
UPSTREAM: <carry>: fix ci operator config
elfosardo Dec 14, 2023
e705079
UPSTREAM: <carry>: update base image for OCP 4.16
elfosardo Mar 18, 2024
c14b55c
UPSTREAM: <carry>: pin upper-constraints
elfosardo May 5, 2025
c92b857
UPSTREAM: <carry>: update base image for tests
elfosardo May 9, 2025
fcb316c
UPSTREAM: <carry>: Run tests using Python 3.12
elfosardo May 9, 2025
c28aedc
UPSTREAM: <carry>: unpin upper-constraints
elfosardo Jul 11, 2025
86db89c
UPSTREAM: <carry>: Run tests using Python 3.12
elfosardo May 9, 2025
e3e39c7
Fix the ability to escape service fail
juliakreger Aug 8, 2025
6170134
Fix servicing abort to respect abortable flag
jacob-anders Aug 13, 2025
e4f7131
UPSTREAM: <carry>: update base image for tests
iurygregory Sep 8, 2025
5944d46
UPSTREAM: <carry>: Update test base image for 4.22
elfosardo Jan 20, 2026
1199152
UPSTREAM: <carry>: Update username user by Jacob.
jacob-anders Jan 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 14 additions & 134 deletions devstack/lib/ironic
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,6 @@ set +o pipefail
# Set up default directories
GITDIR["python-ironicclient"]=$DEST/python-ironicclient

GITREPO["pyghmi"]=${PYGHMI_REPO:-${GIT_BASE}/x/pyghmi}
GITBRANCH["pyghmi"]=${PYGHMI_BRANCH:-master}
GITDIR["pyghmi"]=$DEST/pyghmi

GITREPO["virtualbmc"]=${VIRTUALBMC_REPO:-${GIT_BASE}/openstack/virtualbmc.git}
GITBRANCH["virtualbmc"]=${VIRTUALBMC_BRANCH:-master}
GITDIR["virtualbmc"]=$DEST/virtualbmc
Expand Down Expand Up @@ -325,15 +321,6 @@ IRONIC_DEFAULT_TRAITS=${IRONIC_DEFAULT_TRAITS:-CUSTOM_GOLD}
# Whether to build the ramdisk or download a prebuilt one.
IRONIC_BUILD_DEPLOY_RAMDISK=$(trueorfalse True IRONIC_BUILD_DEPLOY_RAMDISK)

# Ironic IPA ramdisk type, supported types are:
IRONIC_SUPPORTED_RAMDISK_TYPES_RE="^(tinyipa|dib)$"
IRONIC_RAMDISK_TYPE=${IRONIC_RAMDISK_TYPE:-dib}

# Confirm we have a supported ramdisk type or fail early.
if [[ ! "$IRONIC_RAMDISK_TYPE" =~ $IRONIC_SUPPORTED_RAMDISK_TYPES_RE ]]; then
die $LINENO "Unrecognized IRONIC_RAMDISK_TYPE: $IRONIC_RAMDISK_TYPE. Expected 'tinyipa' or 'dib'"
fi

# Which deploy driver to use - valid choices right now
# are ``ipmi`` and ``redfish``.
#
Expand Down Expand Up @@ -374,18 +361,10 @@ IRONIC_DIB_RELEASE=${IRONIC_DIB_RAMDISK_RELEASE:-}
if [[ "$IRONIC_BUILD_DEPLOY_RAMDISK" == "False" && \
! (-e "$IRONIC_DEPLOY_RAMDISK" && -e "$IRONIC_DEPLOY_KERNEL") && \
(-z "$IRONIC_AGENT_KERNEL_URL" || -z "$IRONIC_AGENT_RAMDISK_URL") ]]; then
case $IRONIC_RAMDISK_TYPE in
tinyipa)
IRONIC_AGENT_KERNEL_FILE=tinyipa-${IPA_DOWNLOAD_BRANCH}.vmlinuz
IRONIC_AGENT_RAMDISK_FILE=tinyipa-${IPA_DOWNLOAD_BRANCH}.gz
;;
dib)
IRONIC_AGENT_KERNEL_FILE=ipa-${IRONIC_DIB_RAMDISK_OS}-${IPA_DOWNLOAD_BRANCH}.kernel
IRONIC_AGENT_RAMDISK_FILE=ipa-${IRONIC_DIB_RAMDISK_OS}-${IPA_DOWNLOAD_BRANCH}.initramfs
;;
esac
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/${IPA_DOWNLOAD_SOURCE}/${IRONIC_RAMDISK_TYPE}/files/${IRONIC_AGENT_RAMDISK_FILE}
IRONIC_AGENT_KERNEL_FILE=ipa-${IRONIC_DIB_RAMDISK_OS}-${IPA_DOWNLOAD_BRANCH}.kernel
IRONIC_AGENT_RAMDISK_FILE=ipa-${IRONIC_DIB_RAMDISK_OS}-${IPA_DOWNLOAD_BRANCH}.initramfs
IRONIC_AGENT_KERNEL_URL=https://tarballs.openstack.org/${IPA_DOWNLOAD_SOURCE}/dib/files/${IRONIC_AGENT_KERNEL_FILE}
IRONIC_AGENT_RAMDISK_URL=https://tarballs.openstack.org/${IPA_DOWNLOAD_SOURCE}/dib/files/${IRONIC_AGENT_RAMDISK_FILE}
fi

# This refers the options for disk-image-create and the platform on which
Expand Down Expand Up @@ -868,21 +847,13 @@ IRONIC_NEUTRON_AGENT_REPORT_STATE_ATTEMPTS=$(( $IRONIC_NEUTRON_AGENT_REPORT_STAT

# Username to use by Ansible to access ramdisk,
# to be set as '[ansible]/default_username' option.
# If not set here (default), will be set to 'tc' for TinyIPA ramdisk,
# for other ramdisks it must be either provided here,
# or set manually per-node via ironic API
IRONIC_ANSIBLE_SSH_USER=${IRONIC_ANSIBLE_SSH_USER:-}
# Path to the private SSH key to use by ansible deploy interface
# that will be set as '[ansible]/default_key_file' option in config.
# The public key path is assumed to be ${IRONIC_ANSIBLE_SSH_KEY}.pub
# and will be used when rebuilding the image to include this public key
# in ~/.ssh/authorized_keys of a $IRONIC_ANSIBLE_SSH_USER in the ramdisk.
# Only the TinyIPA ramdisks are currently supported for such rebuild.
# For TinyIPA ramdisks, if the specified file doesn't exist, it will
# be created and will contain a new RSA passwordless key. We assume
# that the directories in the path to this file exist and are
# writable.
# For other ramdisk types, make sure the corresponding public key is baked into
# CRITICAL - Make sure the corresponding public key is baked into
# the ramdisk to be used by DevStack and provide the path to the private key here,
# or set it manually per node via ironic API.
# FIXME(pas-ha) auto-generated keys currently won't work for multi-node
Expand Down Expand Up @@ -973,11 +944,6 @@ function is_deployed_by_ipmi {
return 1
}

function is_deployed_by_ilo {
[[ "${IRONIC_DEPLOY_DRIVER}" == ilo ]] && return 0
return 1
}

function is_deployed_by_drac {
[[ "${IRONIC_DEPLOY_DRIVER}" == idrac ]] && return 0
return 1
Expand All @@ -1003,13 +969,6 @@ function is_redfish_enabled {
return 1
}

function is_ansible_with_tinyipa {
# NOTE(pas-ha) we support rebuilding the ramdisk to include (generated) SSH keys
# as needed for ansible deploy interface only for TinyIPA ramdisks for now
is_ansible_deploy_enabled && [[ "$IRONIC_RAMDISK_TYPE" == "tinyipa" ]] && return 0
return 1
}

function is_http_server_required {
[[ "$IRONIC_IPXE_ENABLED" == "True" ]] && return 0
is_deployed_by_agent && [[ "$IRONIC_AGENT_IMAGE_DOWNLOAD_SOURCE" != "swift" ]] && return 0
Expand Down Expand Up @@ -1922,31 +1881,10 @@ function configure_ironic_conductor {
fi

if is_ansible_deploy_enabled; then
if is_ansible_with_tinyipa; then
if [[ ! -f $IRONIC_ANSIBLE_SSH_KEY ]]; then
# generate ssh key if absent as we will rebuild the ramdisk
# TODO(pas-ha) make it work for multi-node DevStack:
# - generate outside of this script
# - pass path in as $IRONIC_ANSIBLE_SSH_KEY
# - distribute private key to subnodes under the same path
# Similar to what we do for n-g-s, may be even reuse its key.
ssh-keygen -t rsa -N '' -f $IRONIC_ANSIBLE_SSH_KEY
chmod 600 $IRONIC_ANSIBLE_SSH_KEY
fi
if [[ -z $IRONIC_ANSIBLE_SSH_USER ]]; then
# we definitely know the default username to use for TinyIPA image
IRONIC_ANSIBLE_SSH_USER='devuser'
fi
# (rpittau) most recent tinyipa uses python3 natively so we need to change
# the default ansible python interpreter.
iniset $IRONIC_CONF_FILE ansible default_python_interpreter /usr/bin/python3
fi
iniset $IRONIC_CONF_FILE ansible default_key_file $IRONIC_ANSIBLE_SSH_KEY
if [[ -n $IRONIC_ANSIBLE_SSH_USER ]]; then
iniset $IRONIC_CONF_FILE ansible default_username $IRONIC_ANSIBLE_SSH_USER
fi
# TODO(pas-ha) find a way to include the CA bundle into the image during rebuild,
# at least for the tinyipa ramdisk
iniset $IRONIC_CONF_FILE ansible image_store_insecure "True"
fi

Expand Down Expand Up @@ -2574,7 +2512,7 @@ SUBSHELL
PUBLIC_SUBNET_ID=$(openstack router show $Q_ROUTER_NAME -c external_gateway_info -f json | jq -r .external_gateway_info.external_fixed_ips[0].subnet_id)
# Add a route for dhcp-less return path traffic
PUBLIC_SUBNET_DEV=$(ip -j route get $PUBLIC_SUBNET_IP | jq -r '.[0].dev')
sudo ip route add 10.0.6.0/24 via $PUBLIC_SUBNET_IP dev $PUBLIC_SUBNET_DEV onlink
sudo ip route replace 10.0.6.0/24 via $PUBLIC_SUBNET_IP dev $PUBLIC_SUBNET_DEV onlink

if [[ "${IRONIC_NETWORK_SIMULATOR:-ovs}" != "ovs" ]]; then
create_network_simulator
Expand Down Expand Up @@ -3345,13 +3283,6 @@ function enroll_nodes {
node_options+=" --driver-info ipmi_address=$bmc_address \
--driver-info ipmi_password=$bmc_passwd \
--driver-info ipmi_username=$bmc_username"
elif is_deployed_by_ilo; then
node_options+=" --driver-info ilo_address=$bmc_address \
--driver-info ilo_password=$bmc_passwd \
--driver-info ilo_username=$bmc_username"
if [[ $IRONIC_ENABLED_BOOT_INTERFACES == *"ilo-virtual-media"* ]]; then
node_options+=" --driver-info deploy_iso=$IRONIC_DEPLOY_ISO_ID"
fi
elif is_deployed_by_drac; then
node_options+=" --driver-info drac_address=$bmc_address \
--driver-info drac_password=$bmc_passwd \
Expand Down Expand Up @@ -3714,11 +3645,13 @@ function configure_iptables {
fi

# (rpittau) workaround to allow TFTP traffic on ubuntu bionic with conntrack helper disabled
local qrouter
qrouter=$(sudo ip netns list | grep qrouter | awk '{print $1;}')
if [[ ! -z "$qrouter" ]]; then
sudo ip netns exec $qrouter iptables -A PREROUTING -t raw -p udp --dport 69 -j CT --helper tftp
sudo ip netns exec $qrouter ip6tables -A PREROUTING -t raw -p udp --dport 69 -j CT --helper tftp || true
if [[ "$Q_AGENT" != "ovn" ]]; then
local pub_router_id
pub_router_id=$(openstack --os-cloud $OS_CLOUD router show $Q_ROUTER_NAME -f value -c id)
if [[ ! -z "$pub_router_id" ]]; then
sudo ip netns exec qrouter-$pub_router_id iptables -A PREROUTING -t raw -p udp --dport 69 -j CT --helper tftp
sudo ip netns exec qrouter-$pub_router_id ip6tables -A PREROUTING -t raw -p udp --dport 69 -j CT --helper tftp || true
fi
fi
}

Expand Down Expand Up @@ -3783,58 +3716,13 @@ function build_ipa_ramdisk {
local kernel_path=$1
local ramdisk_path=$2
local iso_path=$3
case $IRONIC_RAMDISK_TYPE in
'tinyipa')
build_tinyipa_ramdisk $kernel_path $ramdisk_path $iso_path
;;
'dib')
build_ipa_dib_ramdisk $kernel_path $ramdisk_path $iso_path
;;
*)
die $LINENO "Unrecognised IRONIC_RAMDISK_TYPE: $IRONIC_RAMDISK_TYPE. Expected either of 'dib' or 'tinyipa'."
;;
esac
build_ipa_dib_ramdisk $kernel_path $ramdisk_path $iso_path
}

function setup_ipa_builder {
git_clone $IRONIC_PYTHON_AGENT_BUILDER_REPO $IRONIC_PYTHON_AGENT_BUILDER_DIR $IRONIC_PYTHON_AGENT_BUILDER_BRANCH
}

function build_tinyipa_ramdisk {
echo "Building ironic-python-agent deploy ramdisk"
local kernel_path=$1
local ramdisk_path=$2
local iso_path=$3
cd $IRONIC_PYTHON_AGENT_BUILDER_DIR/tinyipa
export BUILD_AND_INSTALL_TINYIPA=true
if is_ansible_deploy_enabled; then
export AUTHORIZE_SSH=true
export SSH_PUBLIC_KEY=$IRONIC_ANSIBLE_SSH_KEY.pub
fi
make
cp tinyipa.gz $ramdisk_path
cp tinyipa.vmlinuz $kernel_path
if is_deploy_iso_required; then
make iso
cp tinyipa.iso $iso_path
fi
make clean
cd -
}

function rebuild_tinyipa_for_ansible {
local ansible_tinyipa_ramdisk_name
pushd $IRONIC_PYTHON_AGENT_BUILDER_DIR/tinyipa
export TINYIPA_RAMDISK_FILE=$IRONIC_DEPLOY_RAMDISK
export SSH_PUBLIC_KEY=$IRONIC_ANSIBLE_SSH_KEY.pub
make addssh
ansible_tinyipa_ramdisk_name="ansible-$(basename $IRONIC_DEPLOY_RAMDISK)"
mv $ansible_tinyipa_ramdisk_name $TOP_DIR/files
make clean
popd
IRONIC_DEPLOY_RAMDISK=$TOP_DIR/files/$ansible_tinyipa_ramdisk_name
}

# install_diskimage_builder() - Collect source and prepare or install from pip
function install_diskimage_builder {
if use_library_from_git "diskimage-builder"; then
Expand Down Expand Up @@ -4092,11 +3980,6 @@ function upload_baremetal_ironic_deploy {
else
download_with_retry "$IRONIC_AGENT_RAMDISK_URL" $IRONIC_DEPLOY_RAMDISK
fi
if is_ansible_with_tinyipa; then
# NOTE(pas-ha) if using ansible-deploy and tinyipa,
# this will rebuild ramdisk and override $IRONIC_DEPLOY_RAMDISK
rebuild_tinyipa_for_ansible
fi
fi
fi

Expand Down Expand Up @@ -4130,9 +4013,6 @@ function upload_baremetal_ironic_deploy {
die_if_not_set $LINENO IRONIC_DEPLOY_ISO_ID "Failed to load deploy iso into glance"
fi
else
if is_ansible_with_tinyipa; then
ironic_deploy_ramdisk_name="ansible-$ironic_deploy_ramdisk_name"
fi
IRONIC_DEPLOY_KERNEL_ID=$(openstack --os-cloud $OS_CLOUD image show $ironic_deploy_kernel_name -f value -c id)
IRONIC_DEPLOY_RAMDISK_ID=$(openstack --os-cloud $OS_CLOUD image show $ironic_deploy_ramdisk_name -f value -c id)
fi
Expand Down
2 changes: 1 addition & 1 deletion devstack/tools/ironic/scripts/create-node.sh
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ INTERFACE_COUNT=${INTERFACE_COUNT:-1}
if [[ "${NET_SIMULATOR:-ovs}" == "ovs" ]]; then
for int in $(seq 1 $INTERFACE_COUNT); do
ovsif=ovs-${NAME}i${int}
sudo ovs-vsctl --no-wait add-port $BRIDGE $ovsif
sudo ovs-vsctl -- --if-exists del-port $BRIDGE $ovsif -- add-port $BRIDGE $ovsif
done
else
for int in $(seq 1 $INTERFACE_COUNT); do
Expand Down
10 changes: 5 additions & 5 deletions doc/source/admin/boot-from-volume.rst
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ the node OR the iPXE boot templates such that the node CAN be booted.
.. figure:: ./../images/boot-from-volume.svg
:width: 100%

In this example, the boot interface does the heavy lifting. For the
``ilo`` hardware type with its hardware type-specific boot
interface, it is able to signal via an out-of-band mechanism to the
baremetal node's BMC that the integrated iSCSI initiators are to connect
to the supplied volume target information.
In this example, the boot interface does the heavy lifting. Some
hardware types with vendor-specific boot interfaces are able to
signal via an out-of-band mechanism to the baremetal node's BMC
that the integrated iSCSI initiators are to connect to the supplied
volume target information.

In most hardware, this would be the network cards of the machine.

Expand Down
12 changes: 4 additions & 8 deletions doc/source/admin/cleaning.rst
Original file line number Diff line number Diff line change
Expand Up @@ -483,13 +483,10 @@ Hardware Manager.

Out-of-band
-----------
Out-of-band are actions performed by your management controller, such as IPMI,
iLO, or DRAC. Out-of-band steps will be performed by Ironic using a power or
management interface. Which steps are performed depends on the hardware type
and hardware itself.

For Out-of-Band cleaning operations supported by iLO hardware types, refer to
:ref:`ilo_node_cleaning`.
Out-of-band are actions performed by your management controller, such as
IPMI or DRAC. Out-of-band steps will be performed by Ironic using a
power or management interface. Which steps are performed depends on the
hardware type and hardware itself.

FAQ
===
Expand Down Expand Up @@ -536,7 +533,6 @@ multiple configuration values:
[conductor]
clean_step_priority_override=deploy.erase_devices_metadata:123
clean_step_priority_override=management.reset_bios_to_default:234
clean_step_priority_override=management.clean_priority_reset_ilo:345

This parameter can be specified as many times as required to define priorities
for several cleaning steps - the values will be combined.
Expand Down
1 change: 0 additions & 1 deletion doc/source/admin/dhcp-less.rst
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ Hardware type support
This feature is known to work with the following hardware types:

* :doc:`Redfish </admin/drivers/redfish>` with ``redfish-virtual-media`` boot
* :doc:`iLO </admin/drivers/ilo>` with ``ilo-virtual-media`` boot

Configuring network data
------------------------
Expand Down
1 change: 0 additions & 1 deletion doc/source/admin/drivers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ Hardware Types
:maxdepth: 1

drivers/idrac
drivers/ilo
drivers/intel-ipmi
drivers/ipmitool
drivers/redfish
Expand Down
6 changes: 2 additions & 4 deletions doc/source/admin/drivers/ansible.rst
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,8 @@ Bootstrap image requirements
- python-requests (for ironic callback and streaming image download)
- python-netifaces (for ironic callback)

A set of scripts to build a suitable deploy ramdisk based on TinyCore Linux
and ``tinyipa`` ramdisk, and an element for ``diskimage-builder`` can be found
in ironic-staging-drivers_ project but will be eventually migrated to the new
ironic-python-agent-builder_ project.
An element for ``diskimage-builder`` to build a suitable deploy ramdisk
can be found in the ironic-python-agent-builder_ project.

Setting up your environment
===========================
Expand Down
Loading