1301 Commits

Author SHA1 Message Date
Zuul
236b33abff Merge "tox: Drop redundant injection of VIRTUAL_ENV variable" 2026-02-18 15:19:29 +00:00
Takashi Kajinami
b55f08a660 tox: Drop redundant injection of VIRTUAL_ENV variable
The environment variable is set automatically.

cf. https://github.com/tox-dev/tox/commit/be5373bab

Change-Id: I1061ab6bac578cbee181a75ae38a89d3c64322cb
Signed-off-by: Takashi Kajinami <kajinamit@oss.nttdata.com>
2026-02-17 03:57:59 +00:00
Steve Baker
9df86a04b9 bootc install: Treat SELinux Permissive like Enforcing
Currently Permissive is treated like Disabled for bootc install which
means the written operating system will also have SELinux disabled.

This change treats Permissive like Enforcing, with the assumption that
Permissive is "enough" SELinux enforcement for bootc install.

Likely all IPA builds on SELinux distros are set to Permissive[1], which
means it is currently not practical to provision a SELinux enabled bootc
system.

[1] https://opendev.org/openstack/ironic-python-agent-builder/src/branch/master/dib/ironic-ramdisk-base/element-deps#L3

Change-Id: Id8a049b242a8c7e38103afc988749ecb2a787ce4
Signed-off-by: Steve Baker <sbaker@redhat.com>
2026-01-09 15:10:15 +13:00
Zuul
b02398ffde Merge "enable_vlan_interfaces: support identifying interfaces by MAC" 2025-12-12 20:26:39 +00:00
Jonathan Davies
f596fe4701 enable_vlan_interfaces: support identifying interfaces by MAC
The enable_vlan_interfaces config option supports a comma-separated list
of <interface>.<vlan> pairs. However, using this relies on knowledge of
the interface name. When used via the ipa-enable-vlan-interfaces kernel
command-line parameter, an interface name may be hard to predict.

As an alternative to identifying interfaces by name, support identifying
them by MAC.

Change-Id: Ice822a8e7b8d82352b3b39f87d930bef3eb7b461
Signed-off-by: Jonathan Davies <jonathan.davies@nutanix.com>
2025-12-11 19:05:59 +00:00
Jay Faulkner
ccb120a698 Add request logging for API requests
While we didn't traditionally log all API requests in IPA, it's a good
idea. This code is derived from the code in Ironic to do the same thing.

Assisted-by: Claude-code
Change-Id: I94de68ec7a251830b3e393485154233b0b908e06
Signed-off-by: Jay Faulkner <jay@jvf.cc>
2025-12-05 09:06:10 -08:00
Riccardo Pittau
e78d4af663 Fix slow test_find_routable_addr_no_reachable_urls
The test was taking 30 seconds due to _find_routable_addr()
entering a retry loop even when no IPs were collected from
unreachable API URLs. The code would loop 3 times with 10
second sleeps between attempts despite having nothing to check.

Add an early return when the ips set is empty to avoid
unnecessary retries.

Change-Id: I21892e0ea7351cabab740a86fc82ff7d087d4cb8
Signed-off-by: Riccardo Pittau <elfosardo@gmail.com>
2025-11-26 15:03:11 +00:00
Zuul
1a1a7070ef Merge "Deprecate PReP partition support?" 2025-11-26 10:38:55 +00:00
Zuul
8f4a5a3f68 Merge "Skip BMC detection when using out-of-band management" 2025-11-22 16:02:02 +00:00
Zuul
033a237e96 Merge "Fix API URL reachability test to use full URL with port" 2025-11-19 12:36:00 +00:00
Zuul
a1739af940 Merge "Implement functionality for the is_root_volume RAID config" 2025-11-18 19:28:06 +00:00
Riccardo Pittau
ca6f4fb988 Skip BMC detection when using out-of-band management
When Ironic uses out-of-band management interfaces like Redfish,
iDRAC, iLO, or iRMC, the BMC address is already known and configured
in Ironic. This change allows the agent to skip BMC address detection
via ipmitool when instructed by Ironic through the lookup response.

This reduces deployment time by avoiding unnecessary ipmitool calls
during hardware inventory collection.

The agent now checks for the 'agent_skip_bmc_detect' flag in the
config section of the lookup response and skips BMC detection
accordingly. This flag is stored in the cached node data for use
during hardware inventory collection.

Depends-On: I6a432db3eb238894e0ed2676243ce69ec300a9eb

Assisted-By: Claude Sonnet 4.5
Change-Id: Id5470136defb981d1855e3c57cd16c03a6eb916e
Signed-off-by: Riccardo Pittau <elfosardo@gmail.com>
2025-11-18 16:46:21 +01:00
Riccardo Pittau
7d7735a216 Fix API URL reachability test to use full URL with port
The _test_ip_reachability method was only using the hostname/IP
address when testing reachability, ignoring the port number from
the API URL. This caused LookupAgentIPError when the Ironic API
was running on a non-standard port (e.g., 6385).

This change modifies _test_ip_reachability to:
- Accept the full API URL instead of just an IP address
- Use the complete URL (including protocol and port) when testing

The _find_routable_addr method now passes the full api_url to
_test_ip_reachability instead of just the hostname, ensuring the
port is included in reachability tests.

Assisted-By: Claude Sonnet 4.5
Change-Id: Ibb407255cfcd5cf9617f040338561fd494e8b41f
Signed-off-by: Riccardo Pittau <elfosardo@gmail.com>
2025-11-18 15:49:46 +01:00
Riccardo Pittau
bae591a808 Fix RuntimeError when stopping heartbeater in rescue mode
In rescue mode, the agent attempts to stop the heartbeater thread
even though it was never started, causing a RuntimeError. This fix
adds checks to ensure the heartbeater thread is alive before
attempting to stop it.

Assisted-By: Claude Sonnet 4.5
Change-Id: I3e97b10f2c7f3c454f0db2a3c3c8efb61ffeda5a
Signed-off-by: Riccardo Pittau <elfosardo@gmail.com>
2025-11-13 13:26:08 +01:00
Riccardo Pittau
2c6cf7cf1f Test advertised ip reachability before assigning it
The advertised ip for ironic API is checked only as routable but
it could still be unreachable, we need to check the actual
connectivity before assigning it.

Assisted-By: Claude Sonnet 4
Change-Id: I0adca5ad00ba419a7e2aa6883b3690b4507c25e5
Signed-off-by: Riccardo Pittau <elfosardo@gmail.com>
2025-11-10 16:17:30 +01:00
Morten Stephansen
487f069ee6 Implement functionality for the is_root_volume RAID config
The is_root_volume config option has been listed in the documentation
for a while, but has not been supported by the IPA.
With this patch, if there is a logical disk
in the target_raid_config with the setting is_root_volume: True,
it will be picked up as the root device (root_device hints
will not even be checked). Additionally, if is_root_volume: False,
for a volume then it will be excluded from the list of
possible root devices used by the root_device hints.

Depends-On: https://review.opendev.org/c/openstack/ironic-python-agent/+/965797
Change-Id: If195b8f2c471cd7cf3f690664c7f13b6cef10ce2
Signed-off-by: Jakub Jelinek <jakub.jelinek@cern.ch>
Signed-off-by: Morten Stephansen <morten.kaastrup.stephansen@cern.ch>
2025-11-04 13:11:31 +00:00
Morten Stephansen
bb4b4fdb38 Fix for matching hints with lists of strings
Added logic for matching hints with lists of WWN/Serial. These lists
appear when both lsblk and udev are used to fetch the information about
a device. One consequence of this is that it allows a device on the
skip list to be used as root device, thus overwriting the protected
data. This has previously been handled before matching the hints,
e.g. the removed section in hardware.py. This patch aims to fix the
problem globally by handling the issue inside the find_devices_by_hints
function.

Closes-bug: #2130410
Change-Id: I28129f2ededb37474025f35164d5dc9ece21ec8e
Signed-off-by: Morten Stephansen <morten.kaastrup.stephansen@cern.ch>
Signed-off-by: Jakub Jelinek <jakub.jelinek@cern.ch>
2025-11-03 16:37:56 +00:00
Afonne-CID
1739fa3819 Deprecate PReP partition support?
Marking PReP (PowerPC Reference Platform) partition support as
deprecated in ironic-python-agent. PReP partitions are used to boot
ppc64* systems. POWER hardware is a small, specialized share of today's
bare-metal deployments.

This is more or less a litmus test on whether PReP support should be
retired; highlighting the comment at: https://review.opendev.org/c/openstack/ironic-python-agent/+/958333?tab=comments&commentId=00ef1ecc_d1f149b9

Change-Id: I88081500f7f951ce3627944c2945d4cfbdbbf451
Signed-off-by: Afonne-CID <afonnepaulc@gmail.com>
2025-10-16 06:42:21 +01:00
Zuul
f0888131c1 Merge "Fix skip block devices for RAID arrays" 2025-09-30 09:17:30 +00:00
kubajj
d43913453b Fix skip block devices for RAID arrays
The original implementation of the skip block devices for RAID arrays:
https://review.opendev.org/c/openstack/ironic-python-agent/+/852999
introduced a couple bugs which were uncaught:

1. Key error when a holder disk contains just logical disks on the skip list.
2. RAID arrays on skip list throw "Failed to remove partitions" because they are not removed from the list of remaining RAID devices when running wipefs
3. list_block_devices_check_skip_list does not match volume names to RAID arrays
4. MD superblock wrongly checked (detail instead of examine)
5. Partition tables are being created when a partition is on a skip list
6. EFI partition handling in a scenario when a partition on the same physical disk is not deleted

Closes-bug: #2080871
Signed-off-by: Jakub Jelinek <jakub.jelinek@cern.ch>
Signed-off-by: Morten Stephansen <morten.kaastrup.stephansen@cern.ch>
Change-Id: I59b65c6b69af2385ed8a5dcd427e4d9c91f90abe
2025-09-26 12:17:55 +00:00
Jakub Jelinek
f14c187a64 Fix erasable devices check
There is a conditional which is supposed to check whether there are
any erasable devices. However, in the current state, the conditional
is wrong as the call is missing the node as a parameter.

Signed-off-by: Jakub Jelinek <jakub.jelinek@cern.ch>
Signed-off-by: Morten Stephansen <morten.kaastrup.stephansen@cern.ch>
Change-Id: I38768b9ba3dc1bb5160e5841865450a8d7df5466
2025-09-17 14:22:52 +00:00
Zuul
ffafce66ca Merge "Support transport type as a root device hint" 2025-09-03 22:24:16 +00:00
Morten Stephansen
41a00b2465 Removed redundant side-effects
In test_create_configuration_with_different_disks_skip_list there are redundant side-effects which are never used.

Change-Id: I7b6acbd6583831ba82d6a68ce0d8410ee0bd18a2
Signed-off-by: Morten Stephansen <morten.kaastrup.stephansen@cern.ch>
2025-09-02 10:00:21 +00:00
Zuul
0fa82ee2ee Merge "Fix for motherboards where efibootmgr returns UTF-8." 2025-08-13 16:45:19 +00:00
Morten Stephansen
f302c1c73e Fix for motherboards where efibootmgr returns UTF-8.
Some motherboards return UTF-8 for the efibootmgr. This results in IPA not being able to remove duplicate records, etc.

This change implements a check for UTF-16 compatibility and tries to decode efibootmgr output as UTF-8 otherwise.

Closes-bug: #2072336
Co-Authored-By: Jakub Jelinek <jakub.jelinek@cern.ch>
Change-Id: I35432773826d13edb1dc9dd25f99bb0907a8fa0d
Signed-off-by: Morten Stephansen <morten.kaastrup.stephansen@cern.ch>
Signed-off-by: Jakub Jelinek <jakub.jelinek@cern.ch>
2025-08-07 06:57:42 +00:00
Zuul
f46f56decc Merge "Hard stop on image download duration threshold" 2025-07-31 20:03:08 +00:00
Zuul
07f8c07674 Merge "Hint at sector sizes when reporting an invalid written image" 2025-07-25 07:10:23 +00:00
Kaifeng Wang
2e4172a024 Support transport type as a root device hint
Adds a tran field to the block device and allow to use it
as a root device hint.

Change-Id: I3fc83730a6100abb2b2aa98fc894713ecbbe3043
Closes-Bug: #2100951
Signed-off-by: Kaifeng Wang <kaifeng.w@gmail.com>
2025-07-24 16:36:19 +08:00
Zuul
5a96e0a937 Merge "Vendor own option for tls cert file and key file" 2025-07-23 19:02:17 +00:00
Zuul
c2c72eef97 Merge "Provide usable __repr__ for serializable objects" 2025-07-22 01:26:55 +00:00
Afonne-CID
e1a31eb97a Hard stop on image download duration threshold
Adds a wall timeout `image_download_max_timeout` to enforce an upper
bound on total download duration.

While the per-chunk timeout protects against stalled reads, downloads
that trickle in just under the timeout threshold (e.g., due to heavy
TCP retransmits) can hang for longer than intended.

Now, if the total allowed time is exceeded, the download is aborted with
a non-retryable `ImageDownloadTimeoutError` regardless of per-chunk
retry or connection success.

A value of 0 (the default) disables this feature.

Closes-Bug: #2115995
Change-Id: I3b56d21abae0488853bfed14072ba21116d47baf
Signed-off-by: Afonne-CID <afonnepaulc@gmail.com>
2025-07-21 22:56:05 +01:00
Dmitry Tantsur
0ad2685ce4 Fix wrong result of filter_device in the base interface
Returning None means "exclude any device". It still works if the only
hardware manager is GenericHardwareManager, but enabling any more
without overriding filter_device causes all devices to get filtered.

Change-Id: I25eb028baa1b9182caee07a0b935e9fa107999a8
Closes-Bug: #2117234
Signed-off-by: Dmitry Tantsur <dtantsur@protonmail.com>
2025-07-21 13:49:03 +02:00
Zuul
c3ef9a563d Merge "Fix software RAID creation on different physical devices" 2025-07-15 18:29:00 +00:00
Zuul
a7d8afde40 Merge "Trivial: avoid root logger in modules" 2025-07-13 17:23:29 +00:00
Zuul
4b0a3c162d Merge "Log efibootmgr output as part of the system logs" 2025-07-13 02:31:43 +00:00
kubajj
46af01c82f Log efibootmgr output as part of the system logs
Create a file efibootmgr with the verbose output of the efibootmgr command
when collecting the system logs. This can be used for debugging of boot order.

Change-Id: Ic957024d19bb01a45a3014dc2a5e4492d087e893
Signed-off-by: Jakub Jelinek <vilouskubajj@gmail.com>
2025-07-10 09:02:36 +00:00
Dmitry Tantsur
9e9334fa00 Hint at sector sizes when reporting an invalid written image
Change-Id: Iee7f22e9958b68f263d267c434678478b9a38648
Signed-off-by: Dmitry Tantsur <dtantsur@protonmail.com>
2025-07-09 15:59:03 +02:00
Dmitry Tantsur
1840e987d5 Trivial: avoid root logger in modules
Change-Id: I1eb8c9637c38496b5d4dd6493be43f414f35680c
Signed-off-by: Dmitry Tantsur <dtantsur@protonmail.com>
2025-07-07 15:16:35 +02:00
Takashi Kajinami
a2739f7e56 Vendor own option for tls cert file and key file
... instead of using oslo.service. Current usage of oslo.service is
too limited to add the dependency, because
 - oslo.service registers multiple options but only two of these are
   used
 - the wrap implementation from oslo.service is not actually used

Change-Id: I4e8f18951d73e329a54cf6546344c5704fe4aa90
Signed-off-by: Takashi Kajinami <kajinamit@oss.nttdata.com>
2025-07-05 22:07:34 +09:00
Dmitry Tantsur
9db3cd1e4d Graceful way for hardware managers to ignore certain devices
My use case for this feature is to exclude network devices that use
the cdc_ether driver. These USB network interfaces often cause all sorts
of issues. For example, some models have the same hardcoded MAC address,
which breaks inspection.

Currently, to exclude a certain device, a hardware manager must override
the entire listing function (in my case, list_interfaces). Not only is
it tedious, but it also requires constantly updating the hardware
managers to match the implementation in GenericHardware. Realistically,
it will cause hardware manager authors to inherit GenericHardware, which
is the opposite of how hardware managers should be written.

Note that the node-level skip list only affects root device selection
and cleaning for block devices. This feature affects everything that
uses list_block_devices and is applied before the node-level skip list.

This change adds a new hardware manager call filter_device. For each
network, block or USB device, it allows a hardware manager to do either
of four things:
1. Delegate the decision to a lower level hardware manager by raising
   IncompatibleHardwareMethodError
2. Remove the device by returning None
3. Change the device by returning a modified instance
4. Return the device unchanged to keep it in the listing.

Note that I'm removing debug logging when IncompatibleHardwareMethodError
is raised. Not only the log message is incorrect (the error does not
necessarily mean that the method is not implemented at all), it already
noticeable space in the logs, and with this change will become very
noisy.

Change-Id: I5437343af6c6157882bcf0600dd89bd20478c948
Signed-off-by: Dmitry Tantsur <dtantsur@protonmail.com>
2025-07-04 16:31:02 +02:00
Dmitry Tantsur
9426df9ab3 Split hardware manager initialize out of evaluate_hardware_support
The current code in GenericHardware.evaluate_hardware_support ends up
using hardware manager calls, which then use partly initialized hardware
manager list and can even cause a recursion.

This change introduces a new optional call initialize() which is
guaranteed to run:
1) After all hardware managers have been evaluated
2) After the hardware manager cache is populated
3) In the order of the support level of hardware managers

Change-Id: I068d3d73483c161062aa3b48f3154a2d99941382
Signed-off-by: Dmitry Tantsur <dtantsur@protonmail.com>
2025-07-04 16:30:40 +02:00
Dmitry Tantsur
ddeed6fa9e Provide usable __repr__ for serializable objects
These objects are frequently logged or compared in unit tests.
It's very helpful to be able to inspect their content.

Change-Id: Ib725dcd5f54f4492205f95974d887b8b42c74039
2025-06-26 15:58:01 +02:00
Dmitry Tantsur
521811cbcc Fix software RAID creation on different physical devices
When creating multiple software RAID logical disks that use different
sets of physical devices, the partition indices were incorrectly shared
across all devices. This caused the second RAID array creation to fail
because it tried to use partition indices that didn't exist on those
specific devices.

This change fixes the issue by tracking partition indices separately for
each physical device, ensuring that each device's partitions are numbered
correctly starting from their first available index.

Closes-Bug: #2115211
Change-Id: I440db4654f3d1d54274d1eee8c4b21c2b0a18d22
Signed-off-by: Mohammed Naser <mnaser@vexxhost.com>
2025-06-25 16:15:14 +00:00
Zuul
b64a41372d Merge "trivial: Fix missing extra space in logging" 2025-05-16 17:34:11 +00:00
Zuul
b51cc75ff3 Merge "netutils: Use ethtool ioctl to get permanent mac address" 2025-05-07 21:53:20 +00:00
Nicolas Belouin
48422a532f netutils: Use ethtool ioctl to get permanent mac address
Fetching the permanent MAC address of the interface instead of the
default one allows to get the right one in case it got changed during
setup (likely with a bonding setup).

In order to fetch the permanent MAC address of a given interface, one
can either use Netlink (either rtnetlink or ethtool), or use ethtool
ioctl.

The use of ioctl feels simpler and requires no additional dependency.
The implementation falls back to older behavior should an error occur.

Closes-Bug: #2103450
Change-Id: I54151990e396ddcf775128ca24d3db08e45c256d
Signed-off-by: Nicolas Belouin <nicolas.belouin@suse.com>
2025-04-25 12:06:29 +02:00
cid
c03021fee2 Remove eventlet from Ironic Python Agent
This change removes several usages of eventlet from IPA:
- Upgrades all requirements on oslo library versions to new ones that
  support non-eventlet use.
- Removes use of the eventlet wsgi server (via oslo_service.wsgi) and
  replaces it with the cheroot wsgi server.
- Removes explicit patching of python modules with eventlet

Note that due to some oslo libraries still using ``eventlet`` to detect
and workaround it's use. This means that it is still installed in
environments alongside IPA, even if it's not used or patched into any
modules.

Depends-On: https://review.opendev.org/c/openstack/requirements/+/947727
Change-Id: I9accab2d5e9529a88ef5d3db85e76901f14114eb
2025-04-23 11:01:10 -07:00
Zuul
b20ed83d78 Merge "Remove unnecessary +x mode" 2025-04-16 10:31:06 +00:00
Takashi Kajinami
9b03ca7d52 Remove unnecessary +x mode
These files are not actually executable.

Change-Id: Id4208a91c005b8199d62320882c4f14dcd7f7761
2025-04-16 12:07:58 +09:00
Julia Kreger
f359c81c28 trivial: Fix missing extra space in logging
Change-Id: Id85563015b3ea9e2802baa7b8ab1ca1d858568d5
2025-04-15 06:57:35 -07:00