From d2a5ea161369aa160f649586ad7ece527b487218 Mon Sep 17 00:00:00 2001 From: OpenStack Release Bot Date: Thu, 18 Sep 2025 15:43:21 +0000 Subject: [PATCH 1/8] Update .gitreview for stable/2025.2 Change-Id: Ie84e2a5244ebe66277bbab95fa327e93ee718bbe Signed-off-by: OpenStack Release Bot Generated-By: openstack/project-config:roles/copy-release-tools-scripts/files/release-tools/functions --- .gitreview | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitreview b/.gitreview index 5e14c84..2ff6323 100644 --- a/.gitreview +++ b/.gitreview @@ -2,3 +2,4 @@ host=review.opendev.org port=29418 project=openstack/ironic-python-agent-builder.git +defaultbranch=stable/2025.2 From 1899d74aa4f42e425a9d4b69ed42ffca8fabe4f4 Mon Sep 17 00:00:00 2001 From: OpenStack Release Bot Date: Thu, 18 Sep 2025 15:43:23 +0000 Subject: [PATCH 2/8] Update TOX_CONSTRAINTS_FILE for stable/2025.2 Update the URL to the upper-constraints file to point to the redirect rule on releases.openstack.org so that anyone working on this branch will switch to the correct upper-constraints list automatically when the requirements repository branches. Until the requirements repository has as stable/2025.2 branch, tests will continue to use the upper-constraints list on master. Change-Id: I9b282c630cd0f79a590551feafbe5b3dc48473e0 Signed-off-by: OpenStack Release Bot Generated-By: openstack/project-config:roles/copy-release-tools-scripts/files/release-tools/functions --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index c3e97f1..416c820 100644 --- a/tox.ini +++ b/tox.ini @@ -10,7 +10,7 @@ setenv = VIRTUAL_ENV={envdir} PYTHONWARNINGS=default::DeprecationWarning deps = - -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} + -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2} -r{toxinidir}/doc/requirements.txt [testenv:pep8] From 2a5899d13a11f1b7e0df505d17650e1972bfaa28 Mon Sep 17 00:00:00 2001 From: Riccardo Pittau Date: Tue, 21 Oct 2025 09:13:47 +0200 Subject: [PATCH 3/8] Publish CentOS Stream 10 IPA dib images Change-Id: I95850914746f9e6df7a00d8ed690c938bb8dce94 Signed-off-by: Riccardo Pittau (cherry picked from commit b083749df035a2ae8738d5720abcff3dcd575e5b) --- zuul.d/project.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml index c4717d7..ad39752 100644 --- a/zuul.d/project.yaml +++ b/zuul.d/project.yaml @@ -43,6 +43,8 @@ - publish-openstack-python-branch-tarball - ironic-python-agent-build-image-dib-centos9: branches: master + - ironic-python-agent-build-image-dib-centos10: + branches: master - ironic-python-agent-build-image-dib-debian: branches: master - ironic-python-agent-build-image-dib-debian-arm64: From b1904e5fbc19e8f96c65f7dbb0a5829d48ba7735 Mon Sep 17 00:00:00 2001 From: Mathieu Parent Date: Wed, 1 Oct 2025 14:42:58 +0200 Subject: [PATCH 4/8] Wait up to 30 seconds for config drive Handle Virtual Media ISO (sr0) appearing later Issue: https://bugs.launchpad.net/ironic-python-agent-builder/+bug/2126068 Change-Id: I185f0955d86767784ea6b68c01ffc484c83c61ae Signed-off-by: Mathieu Parent (cherry picked from commit 9aca8fd38fbef23719675bb71fd12d133f228460) --- .../ironic-agent-resolve-config-drive.service | 2 ++ ...ironic-python-agent-resolve-configdrive.sh | 22 +++++++++++++------ ...ait-config-drive-30s-3c51adba5fddc8a2.yaml | 4 ++++ 3 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 releasenotes/notes/wait-config-drive-30s-3c51adba5fddc8a2.yaml diff --git a/dib/ironic-python-agent-ramdisk/static/etc/systemd/system/ironic-agent-resolve-config-drive.service b/dib/ironic-python-agent-ramdisk/static/etc/systemd/system/ironic-agent-resolve-config-drive.service index fa367eb..9ffbcba 100644 --- a/dib/ironic-python-agent-ramdisk/static/etc/systemd/system/ironic-agent-resolve-config-drive.service +++ b/dib/ironic-python-agent-ramdisk/static/etc/systemd/system/ironic-agent-resolve-config-drive.service @@ -3,6 +3,8 @@ Description=Ironic agent config drive setup Wants=network-pre.target Before=network-pre.target After=local-fs.target +Before=glean.service +Before=system-glean.slice [Service] ExecStart=/bin/bash /usr/local/bin/ironic-python-agent-resolve-configdrive.sh diff --git a/dib/ironic-python-agent-ramdisk/static/usr/local/bin/ironic-python-agent-resolve-configdrive.sh b/dib/ironic-python-agent-ramdisk/static/usr/local/bin/ironic-python-agent-resolve-configdrive.sh index 0f6cc4e..20b4f2d 100755 --- a/dib/ironic-python-agent-ramdisk/static/usr/local/bin/ironic-python-agent-resolve-configdrive.sh +++ b/dib/ironic-python-agent-ramdisk/static/usr/local/bin/ironic-python-agent-resolve-configdrive.sh @@ -10,19 +10,27 @@ PATH=/bin:/usr/bin:/sbin:/usr/sbin # Inspired by/based on glean-early.sh # https://opendev.org/opendev/glean/src/branch/master/glean/init/glean-early.sh -# NOTE(TheJulia): We care about iso images, and would expect lower case as a -# result. In the case of VFAT partitions, they would be upper case. -CONFIG_DRIVE_LABEL="config-2" - -# Identify the number of devices -device_count=$(lsblk -o PATH,LABEL | grep -c $CONFIG_DRIVE_LABEL || true) - # Identify if we have an a publisher id set publisher_id="" if grep -q "ir_pub_id" /proc/cmdline; then publisher_id=$(cat /proc/cmdline | sed -e 's/^.*ir_pub_id=//' -e 's/ .*$//') fi +# NOTE(TheJulia): We care about iso images, and would expect lower case as a +# result. In the case of VFAT partitions, they would be upper case. +CONFIG_DRIVE_LABEL="config-2" + +i=0 +while [ $i -lt 30 ] ; do + i=$((i + 1)) + + # Identify the number of devices + device_count=$(lsblk -o PATH,LABEL | grep -c $CONFIG_DRIVE_LABEL || true) + + [ $device_count -lt 1 ] || break + sleep 1 +done + if [ $device_count -lt 1 ]; then # Nothing to do here, exit! exit 0 diff --git a/releasenotes/notes/wait-config-drive-30s-3c51adba5fddc8a2.yaml b/releasenotes/notes/wait-config-drive-30s-3c51adba5fddc8a2.yaml new file mode 100644 index 0000000..5220569 --- /dev/null +++ b/releasenotes/notes/wait-config-drive-30s-3c51adba5fddc8a2.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - | + Wait config drive up to 30 seconds. This ensure that network data is available to Glean. From cecaa0301bf1eab3c7e839a198247107fd982806 Mon Sep 17 00:00:00 2001 From: Julia Kreger Date: Mon, 3 Nov 2025 14:43:09 -0800 Subject: [PATCH 5/8] cs10 - remove excess intel firmware Adds intel bluetooth, dsps, and wifi adapters to the list of firmware blobs which are not needed. This should reduce the uncompresses artifacts storage by approximately 95MB. Change-Id: I92e206583a915738472499d110b8ab6c8fa1861d Signed-off-by: Julia Kreger (cherry picked from commit 4bc39d7f14df892288b6ffa1288cbb5362d02863) --- .../environment.d/10-defaults.bash | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dib/ironic-python-agent-ramdisk/environment.d/10-defaults.bash b/dib/ironic-python-agent-ramdisk/environment.d/10-defaults.bash index 1dc8c12..a107e27 100644 --- a/dib/ironic-python-agent-ramdisk/environment.d/10-defaults.bash +++ b/dib/ironic-python-agent-ramdisk/environment.d/10-defaults.bash @@ -1,4 +1,4 @@ -export IPA_REMOVE_FIRMWARE=${IPA_REMOVE_FIRMWARE:-amdgpu,netronome,qcom,ti-communication,ti-keystone,ueagle-atm,rsi,mrvl,brcm,mediatek,ath10k,rtlwifi,rtw88,rtw89,libertas,ath11k,mellanox/mlxsw_spectrum,s5p-mfc,ti/tas2781,ti-connectivity,TAS,ath3k,ath6k,ath9k,ath12k,rtl_bt,v4l,cirrus,dvb,mwl8k,mwlwifi,cypress,atmel,vicam} +export IPA_REMOVE_FIRMWARE=${IPA_REMOVE_FIRMWARE:-amdgpu,netronome,qcom,ti-communication,ti-keystone,ueagle-atm,rsi,mrvl,brcm,mediatek,ath10k,rtlwifi,rtw88,rtw89,libertas,ath11k,mellanox/mlxsw_spectrum,s5p-mfc,ti/tas2781,ti-connectivity,TAS,ath3k,ath6k,ath9k,ath12k,rtl_bt,v4l,cirrus,dvb,mwl8k,mwlwifi,cypress,atmel,vicam,iwlwifi,intel/ibt,intel/dsp} # NOTE(TheJulia): List of what each item represents for future context # amdgpu == AMD/ATI Radeon/Vega/Raven firmware for drivers @@ -35,3 +35,6 @@ export IPA_REMOVE_FIRMWARE=${IPA_REMOVE_FIRMWARE:-amdgpu,netronome,qcom,ti-commu # cypress == Broadcom Wireless # atmel == Atmel wireless # vicam == Intel wireless +# iwlwifi == Intel wireless adapters +# intel/ibt == Intel bluetooth +# intel/dsp == Intel audio dsp From 4ccd18d36d1a7e0dd7da9023efbbc088c18abfd9 Mon Sep 17 00:00:00 2001 From: Julia Kreger Date: Wed, 12 Nov 2025 11:45:21 -0800 Subject: [PATCH 6/8] Fix firmware cleanup - more. Some follow-up checks of recent firmware fixes caused me to realize we've mixxed up the firmware cleanup even more and our defensiveness on the removal resulted in some confusion. Ultimately, I guess this is... my second attempt to improve this, but also attempt to heavily restrict our automatic glob expansion usage. 2025-11-12 18:58:43.824 | + rm -rf /usr/lib/firmware/vicam 2025-11-12 18:58:43.824 | + for item in ${IPA_REMOVE_FIRMWARE//,/ } 2025-11-12 18:58:43.824 | + [[ iwlwifi != '' ]] 2025-11-12 18:58:43.824 | + [[ iwlwifi =~ / ]] 2025-11-12 18:58:43.824 | + rm -rf /usr/lib/firmware/iwlwifi 2025-11-12 18:58:43.824 | + for item in ${IPA_REMOVE_FIRMWARE//,/ } 2025-11-12 18:58:43.824 | + [[ intel/ibt != '' ]] 2025-11-12 18:58:43.824 | + [[ intel/ibt =~ / ]] 2025-11-12 18:58:43.824 | + rm -r -f '/usr/lib/firmware/intel/ibt*' The net result before this change was the IPA Centos10 build initramfs files were running around 533 MB, and with this change the file sizes are down to 464MB. Change-Id: Ie420a192fbf9ed2fa246c31d799078186a5ca8e7 Signed-off-by: Julia Kreger (cherry picked from commit 34c953278fa1c8bbdca26c4882f14900f4480c5c) --- .../post-install.d/99-remove-extra-packages | 41 +++++++++++++++---- ...re-cleanup-revisited-3047b3bf415bc91c.yaml | 9 ++++ 2 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 releasenotes/notes/fix-firmware-cleanup-revisited-3047b3bf415bc91c.yaml diff --git a/dib/ironic-python-agent-ramdisk/post-install.d/99-remove-extra-packages b/dib/ironic-python-agent-ramdisk/post-install.d/99-remove-extra-packages index 1ee3420..76f1521 100755 --- a/dib/ironic-python-agent-ramdisk/post-install.d/99-remove-extra-packages +++ b/dib/ironic-python-agent-ramdisk/post-install.d/99-remove-extra-packages @@ -12,17 +12,40 @@ rm -rf /tmp/ironic-python-agent # below will keep it from erroring. KNOWN_FIRMWARE_PATH="/lib/firmware/ /usr/lib/firmware/" for folder in $KNOWN_FIRMWARE_PATH; do + if [[ ! -d $folder ]]; then + echo "Skipping firmware removal for $folder as it is not found." + fi for item in ${IPA_REMOVE_FIRMWARE//,/ }; do - # Attempt removal of item, but don't error + # NOTE(TheJulia): The original idea here has been delete whole folders + # but the patterns have shifted and evolved, and it we need to remove + # files in the main folder as well, or subsections their of. Also, due + # to perception of risk on the build process, the code is intended + # to be *very* defensive here. + + # tl;dr Attempt removal of item, but don't error # if it is not present already. - if [[ "$item" != "" ]] && [[ "$item" =~ "/" ]]; then - # We're deleting targetted contents in a folder, - # and not an entire folder. Since we're checking for an - # an empty string, we should be fine letting it do the - # expansion. - rm -r -f $folder$item* - else - rm -rf $folder$item || true + if [[ "$item" != "" ]]; then + if [[ "$item" =~ "/" ]]; then + # We're deleting targetted contents in a folder, + # and not an entire folder. Since we're checking for an + # an empty string, we should be fine letting it do the + # expansion. + rm -r -f $folder$item* + elif [[ -d "$folder$item" ]]; then + # This was the original deletion code path where we + # are attempting to delete a folder. + # This is normally not handled with the glob expansion + # expansion even though it could be due to management + # the host's contents as it is constructed. + rm -rf $folder$item || true + elif [[ $(ls $folder$item* | wc -l) -gt 0 ]]; then + # In this case, we have to use glob expansion because we + # have objects which are only available via glob expansion. + # NOTE(TheJulia): Fun factoid, these folders can have + # subfolders as well, and recursive is thus required becuase + # otherwise rm errors and aborts the deletion. + rm -rf $folder$item* + fi fi done done diff --git a/releasenotes/notes/fix-firmware-cleanup-revisited-3047b3bf415bc91c.yaml b/releasenotes/notes/fix-firmware-cleanup-revisited-3047b3bf415bc91c.yaml new file mode 100644 index 0000000..d4dde9b --- /dev/null +++ b/releasenotes/notes/fix-firmware-cleanup-revisited-3047b3bf415bc91c.yaml @@ -0,0 +1,9 @@ +--- +fixes: + - | + Fixes firmware cleanup to be a bit more defensive and also be more + open to allowing for "glob expansion" as it relates to cleaning up files. + Ultimately this change fixes firmware cleanup so remnents are not left + in the image where previously some artifacts were not deleted due to + prior defensiveness in the cleanup logic. The net result is smaller + images for booting IPA. From bb5286efd8a4c4c39e0aa923bcc767ab145cdf62 Mon Sep 17 00:00:00 2001 From: Clif Houck Date: Fri, 12 Jun 2026 13:21:00 -0500 Subject: [PATCH 7/8] ci: Pin setuptools to a range that still ships Recent setuptools releases (82.0.0 and later) have removed the ``pkg_resources`` module. Our docs environment still depends on ``pkg_resources`` transitively via ``openstackdocstheme/pbr``, causing import error when run under newer environments. Modeled off of CID's ironic commit. Change-Id: I90d1bb04321ac912ea1dbe57475f657be6ce3d30 Signed-off-by: Clif Houck --- tox.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tox.ini b/tox.ini index 416c820..8302968 100644 --- a/tox.ini +++ b/tox.ini @@ -12,6 +12,7 @@ setenv = deps = -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2025.2} -r{toxinidir}/doc/requirements.txt + setuptools>=64.0.0,<82.0.0 # MIT [testenv:pep8] deps = From 81207e7cf7e579402f56356d61e9588c58ed76bf Mon Sep 17 00:00:00 2001 From: Clif Houck Date: Fri, 12 Jun 2026 14:40:48 -0500 Subject: [PATCH 8/8] Pin setuptools in the requirements.txt copied from IPA back to a version that is compatible with stable branches. Change-Id: Ie76f8f3c3a912dbd9c66b7b23775b0f994f4d19a Signed-off-by: Clif Houck --- tinyipa/build-tinyipa.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tinyipa/build-tinyipa.sh b/tinyipa/build-tinyipa.sh index 5e14e80..e90c4e2 100755 --- a/tinyipa/build-tinyipa.sh +++ b/tinyipa/build-tinyipa.sh @@ -144,6 +144,9 @@ $PYTHON_COMMAND setup.py sdist --dist-dir "$BUILDDIR/tmp/localpip" --quiet ls $BUILDDIR/tmp/localpip || true cp requirements.txt $BUILDDIR/tmp/ipa-requirements.txt +# NOTE(clif): Modify ipa-requirements.txt to pin setuptools +echo "setuptools>=64.0.0,<82.0.0 # MIT" >> $BUILDDIR/tmp/ipa-requirements.txt + if [ -n "$PYTHON_EXTRA_SOURCES_DIR_LIST" ]; then IFS="," read -ra PKGDIRS <<< "$PYTHON_EXTRA_SOURCES_DIR_LIST" for PKGDIR in "${PKGDIRS[@]}"; do