├── .git-blame-ignore-revs ├── .gitignore ├── .gitreview ├── .pre-commit-config.yaml ├── .stestr.conf ├── CONTRIBUTING.rst ├── LICENSE ├── README.rst ├── bindep.txt ├── doc ├── requirements.txt └── source │ ├── admin │ ├── hardware_managers.rst │ ├── how_it_works.rst │ ├── index.rst │ ├── rescue.rst │ └── troubleshooting.rst │ ├── conf.py │ ├── contributor │ ├── hardware_managers.rst │ ├── index.rst │ ├── metrics.rst │ └── rescue.rst │ ├── index.rst │ └── install │ └── index.rst ├── examples ├── README.rst ├── business-logic │ ├── example_business_logic.py │ ├── setup.cfg │ └── setup.py ├── custom-disk-erase │ ├── example_disk_eraser.py │ ├── setup.cfg │ └── setup.py └── vendor-device │ ├── example_device.py │ ├── setup.cfg │ └── setup.py ├── imagebuild └── README.rst ├── ironic_python_agent ├── __init__.py ├── agent.py ├── api │ ├── __init__.py │ └── app.py ├── burnin.py ├── cmd │ ├── __init__.py │ ├── agent.py │ └── inspect.py ├── config.py ├── device_hints.py ├── disk_partitioner.py ├── disk_utils.py ├── dmi_inspector.py ├── efi_utils.py ├── encoding.py ├── errors.py ├── extensions │ ├── __init__.py │ ├── base.py │ ├── clean.py │ ├── deploy.py │ ├── flow.py │ ├── image.py │ ├── log.py │ ├── poll.py │ ├── rescue.py │ ├── service.py │ ├── standby.py │ └── system.py ├── hardware.py ├── hardware_managers │ ├── __init__.py │ ├── cna.py │ ├── container.py │ ├── mlnx.py │ └── nvidia │ │ └── nvidia_fw_update.py ├── inject_files.py ├── inspect.py ├── inspector.py ├── ironic_api_client.py ├── mdns.py ├── metrics_lib │ ├── __init__.py │ ├── metrics.py │ ├── metrics_collector.py │ ├── metrics_statsd.py │ └── metrics_utils.py ├── netutils.py ├── numa_inspector.py ├── partition_utils.py ├── qemu_img.py ├── raid_utils.py ├── tests │ ├── __init__.py │ ├── functional │ │ ├── __init__.py │ │ ├── base.py │ │ └── test_commands.py │ └── unit │ │ ├── __init__.py │ │ ├── base.py │ │ ├── dmi_inspector_data.py │ │ ├── extensions │ │ ├── __init__.py │ │ ├── test_base.py │ │ ├── test_clean.py │ │ ├── test_deploy.py │ │ ├── test_flow.py │ │ ├── test_image.py │ │ ├── test_log.py │ │ ├── test_poll.py │ │ ├── test_rescue.py │ │ ├── test_service.py │ │ └── test_standby.py │ │ ├── hardware_managers │ │ ├── __init__.py │ │ ├── nvidia │ │ │ ├── __init__.py │ │ │ └── test_nvidia_fw_update.py │ │ ├── test_cna.py │ │ ├── test_container.py │ │ └── test_mlnx.py │ │ ├── metrics_lib │ │ ├── __init__.py │ │ ├── test_metrics.py │ │ ├── test_metrics_collector.py │ │ ├── test_metrics_statsd.py │ │ └── test_metrics_utils.py │ │ ├── samples │ │ └── hardware_samples.py │ │ ├── test_agent.py │ │ ├── test_api.py │ │ ├── test_base.py │ │ ├── test_burnin.py │ │ ├── test_device_hints.py │ │ ├── test_disk_partitioner.py │ │ ├── test_disk_utils.py │ │ ├── test_dmi_inspector.py │ │ ├── test_efi_utils.py │ │ ├── test_encoding.py │ │ ├── test_errors.py │ │ ├── test_hardware.py │ │ ├── test_inject_files.py │ │ ├── test_inspector.py │ │ ├── test_ironic_api_client.py │ │ ├── test_mdns.py │ │ ├── test_multi_hardware.py │ │ ├── test_multi_hardware_clean_steps.py │ │ ├── test_netutils.py │ │ ├── test_numa_inspector.py │ │ ├── test_partition_utils.py │ │ ├── test_qemu_img.py │ │ ├── test_raid_utils.py │ │ ├── test_tls_utils.py │ │ └── test_utils.py ├── tls_utils.py ├── utils.py └── version.py ├── plugin-requirements.txt ├── pyproject.toml ├── releasenotes ├── config.yaml ├── notes │ ├── .placeholder │ ├── 4k-block-size-config-drives-4470828dd06d2600.yaml │ ├── Collect_NIC_name_given_by_BIOS-657c68c0ae16365b.yaml │ ├── LLDP-ignore-NICs-that-are-not-plugged-in-29213f0a701a72e4.yaml │ ├── ability-to-disable-secure-erase-c3223262726d5aff.yaml │ ├── add-block-device-uuid-c8b38264e1688110.yaml │ ├── add-coreos-dhcp-rescue-support-1dd8e9d5ac9c7594.yaml │ ├── add-disk-wait-config-opts-fe805292baca8029.yaml │ ├── add-erase-devices-express-1df107c75f2b3627.yaml │ ├── add-hostname-8bbf24712b6a4919.yaml │ ├── add-inspection-retry-1d385f69607c1452.yaml │ ├── add-log-extension-35ca22cc0709af4c.yaml │ ├── add-more-lan-channels-8f5197ed5f057c25.yaml │ ├── add-named-logfiles-to-burnin-4388309bf7442d53.yaml │ ├── add-numa-topology-info-8c253fd9e56169f1.yaml │ ├── add-optional-tls-support-3ab6a834154fedec.yaml │ ├── add-pci-devices-info-3f86934a505d1b31.yaml │ ├── add-portal-port-arg-6d4faec2f709c8e9.yaml │ ├── add-secondary-sorting-by-name-for-root-disks-4de2c0358b9a1e2c.yaml │ ├── add-service-steps-support-655cc02d112ed0a8.yaml │ ├── add-smart-test-to-disk-burnin-d02d31e23e5efa9a.yaml │ ├── add-support-for-bootc-70b8a4546b176ab4.yaml │ ├── add-support-for-burnin-gpu-76c8c267529a18bd.yaml │ ├── add-unit-test-cc4a1a05859ad17d.yaml │ ├── add-vendor-info-56be9a8605d80bf0.yaml │ ├── add-vlan-interfaces-cdfeb39d0f3d444d.yaml │ ├── add_burnin_cpu-9acbb36048246a6b.yaml │ ├── add_burnin_disk-12adb5735a41af47.yaml │ ├── add_burnin_dynamic_network_pairing-33e398255050eb98.yaml │ ├── add_burnin_memory-4099ca42bd3b99db.yaml │ ├── add_burnin_network-4856153d21c25f4a.yaml │ ├── add_erase_pstore-b109c58ed8f5d351.yaml │ ├── add_interface_vendor_and_product-74e9815f20ee0cac.yaml │ ├── add_mellanox_hardware_manager-edfae87964737df1.yaml │ ├── additional-wwn-hints-ffd02ceafcb3dc70.yaml │ ├── adds-nvme-secure-erase-0ecfd624e5f50581.yaml │ ├── adds-smartctl-ata-check-to-secure-erase-caebba4f25821575.yaml │ ├── advertise-address-c3b152fe475fb539.yaml │ ├── advertise-protocol-110ae1587f727e62.yaml │ ├── agent-fully-retries-image-downloads-67409a493c6d08ae.yaml │ ├── agent-token-support-1086218cf2a0c917.yaml │ ├── agent_partition_image-91941adc6683c673.yaml │ ├── allows-bootloader-install-failure-to-be-ignored-b99667b13afa9759.yaml │ ├── always-make-sure-config-drive-is-umounted-a3985bbb45e89051.yaml │ ├── append-efi-partition-to-fstab-e9f945a4dd19bd7a.yaml │ ├── apply-raid-aeca7848c6320d6b.yaml │ ├── ataraid_does_not_appear_as_disk-8a260e66b3496bf6.yaml │ ├── attempts-ata-disk-unlock-897d76c494ec2976.yaml │ ├── auto-tls-b52b873663f35618.yaml │ ├── avoid-grub2-using-efibootmgr-bd27c0978d1cf71b.yaml │ ├── bandit-fixes-a971142075b29ca9.yaml │ ├── basic-auth-for-user-image-server-150835e7567444da.yaml │ ├── bindmount-run-4c6a31d3ee4e0ed6.yaml │ ├── block-device-hctl-e81573812be3d469.yaml │ ├── bmc-mac-introspection-e4c2e203d8529710.yaml │ ├── bmo-extra-147559c8d1776e8c.yaml │ ├── boot-info-f18336ada089f6dd.yaml │ ├── bootloader-ignored-uefi-mode-8578a009d5b5be62.yaml │ ├── bug-2010123-d4c38d8f6606d0e0.yaml │ ├── build-tinyipa-with-python3-d4a64aa18f970968.yaml │ ├── build-tinyipa-with-tinycore8-b39d0415b1c25f6b.yaml │ ├── bumpsipalookupattempts-29de7c949aaf6556.yaml │ ├── cache-image-removal-3b5a80a6038a320b.yaml │ ├── capture-early-logging-0f3fa58d75656117.yaml │ ├── change-heartbeat-method-d0119406137022e3.yaml │ ├── check-for-ipmi-device-before-invocation-45b00d15c94edd00.yaml │ ├── check-if-ESP-is-mounted-f9e0eff3609c2668.yaml │ ├── check-partition-table-after-writing-34efbd557d8de7cb.yaml │ ├── check-virtual-media-devices-a9b1f54c3fe7884d.yaml │ ├── checksum-before-considering-download-completed-91cca9fef34d8cf5.yaml │ ├── clarify-heartbeat-connection-errors-2af152bf2d7928e2.yaml │ ├── clean_uefi_nvram-554041f2e7b2d555.yaml │ ├── clock-skew-1fbf542b193cec17.yaml │ ├── coalesce_heartbeats-fb8899a5f9fe4709.yaml │ ├── collect-cpu-sockets-0dbc09a1ebccfe77.yaml │ ├── collect-dmi-output-f2e9feabef16bacf.yaml │ ├── collect-manager-a80bcf370048eeec.yaml │ ├── collect-more-8bc9ad4c63e873e1.yaml │ ├── collect-udev-f6ada5163cf4a26c.yaml │ ├── command_params-869fa547b5be2236.yaml │ ├── configdrive-dup-3fc46a878fe82485.yaml │ ├── configdrive-partuuid-3259cfb7428c1483.yaml │ ├── configdrive-ssl-02b069948dfef814.yaml │ ├── container-poweroff-d9ffb637cf1cee6c.yaml │ ├── content-type-f4d5ab15adf37252.yaml │ ├── coreos-uses-chroot-8a01ba0b38a4a4f4.yaml │ ├── coreos_ipa_image_poweroff_reboot_in_chroot_by_sysrq-42447fc4cdd7dafe.yaml │ ├── correct-uefi-regex-112211c2427cd4d9.yaml │ ├── correction-failure-output-when-downloading-image-39f93838d1ed2928.yaml │ ├── cpu-flags-e3cec7e5cba069ef.yaml │ ├── create_raids_with_volume_name-93e0bb59ef210fe4.yaml │ ├── de-duplicate-by-label-baa090c5b1bff992.yaml │ ├── deprecate-and-vendor-metrics-1df0ca4c865613f8.yaml │ ├── deprecate-coreos-8b01bcf796c0dc54.yaml │ ├── detect-endianness-f53a6c4571aba3fe.yaml │ ├── device-hints-from-node-object-9a689f5a4175a1a6.yaml │ ├── disable-md5-image-checksum-7def176928d36e75.yaml │ ├── discover-ipv6-bmc-address-b3b357ff6c5d822c.yaml │ ├── disk-label-fix-536897e41a4d817f.yaml │ ├── disk-wait-2e0e85e0947f80e9.yaml │ ├── drop-python2-2006fd8a4a6de56d.yaml │ ├── efi-partuuid-5fe933a462eeede1.yaml │ ├── enable-cleaning-fallback-57e8c9aa2f24e63d.yaml │ ├── enable-skipping-disks-0c4c8b72231715a1.yaml │ ├── enable-skipping-raids-40263cc3a19cfd27.yaml │ ├── enhance-checksum-2256ffdcce13836e.yaml │ ├── erase-deploy-step-3e952fa863bca908.yaml │ ├── erase-device-metadata-clean-step-31b4a615c0ff7f18.yaml │ ├── erase_metadata_from_partitions-4f1902533d530b8f.yaml │ ├── eventlet-removal-1bd8c6c2d5f8a765.yaml │ ├── executes-gpt-partition-fix-b6156cc16da00dfc.yaml │ ├── extend-ipa-lookup-timeout-05ee5b1372792dbe.yaml │ ├── extend-pci-metric-5482284d6a9fe765.yaml │ ├── extend-retry-timeout-30c930a33d97c193.yaml │ ├── fail_ipa_start_if_ironic_api_invalid-7b78fcaba2141cc5.yaml │ ├── fallback-to-findfs-59abde55221e1e84.yaml │ ├── fasttrack-stale-cache-fd93b56a955c7ab1.yaml │ ├── feature-2010228-cf3a59b88f07c3a7.yaml │ ├── fetc-checksum-support-additional-format-4b29c5cdaa6b8d16.yaml │ ├── findbonds-733c7c91a5665b05.yaml │ ├── fix-agent-determination-of-partition-table-type-3c78bf78266e8cef.yaml │ ├── fix-agent-unable-to-stop-py3-6c210793476968d1.yaml │ ├── fix-auxillarly-node-lookup-argument-83d3f717c039e454.yaml │ ├── fix-bmc-ip-detection-for-coreos-483be0286593e393.yaml │ ├── fix-boot-mode-for-partition-images-f96cf2b3c27b6533.yaml │ ├── fix-bootloader-install-with-mdraid-0a254035df9d0bed.yaml │ ├── fix-bytes-json-serializable-collected-logs-ad61022b287dc3e2.yaml │ ├── fix-clean-config-for-full-device-28ee09b58d97d122.yaml │ ├── fix-cleaning-read-only-device-c8a0f4cc2f434d99.yaml │ ├── fix-coreos-modprobe-75bda45c7bbeb469.yaml │ ├── fix-hardcoded-path-to-grub-7006f29a9ef72e75.yaml │ ├── fix-high-cpu-usage-eventlet-1dccf3b81dd42c47.yaml │ ├── fix-iscsi-teardown-handling-0df2345318d3c843.yaml │ ├── fix-local-boot-for-partition-images-755f570dc0982868.yaml │ ├── fix-mac-permaddr-0bc7d688eee4b814.yaml │ ├── fix-mlnx-hardware-mgr-never-run-72072580be4d6e7a.yaml │ ├── fix-multipath-parent-device-e85afad63159250c.yaml │ ├── fix-nic-without-numa-node-b401f97c46afa4a1.yaml │ ├── fix-nvidia-hw-mgr-https-38825a4161a8561b.yaml │ ├── fix-nvme-partition-image-handling-b8487133a188fd32.yaml │ ├── fix-nvme-software-raid-race-2e0e104de9611228.yaml │ ├── fix-physical-memory-arm64-957755f6cd91ad85.yaml │ ├── fix-raid-volume-name-ac9013e7b5cf3d46.yaml │ ├── fix-raid_device-not-set-8b03688ce83ce22e.yaml │ ├── fix-rescan-device-7b00c6836b687ce8.yaml │ ├── fix-rescan-device-raid-29aa1558b036b496.yaml │ ├── fix-softraid-name-poisoning-4e934dd4e60830b1.yaml │ ├── fix-to-pass-root-uuid-for-whole-disk-image-1c13b70f6b74bce0.yaml │ ├── fix-uefi-boot-entry-creation-for-aarch64-2b143c5bf189c2f6.yaml │ ├── fix-vfd-mount-for-capitalized-device-name-db7f519e900f4e22.yaml │ ├── fix_chronyd_time_sync-626a14b66ca37677.yaml │ ├── fix_efi_uuid_fstab-f2edbee9bfbac64a.yaml │ ├── fix_errors_in_erase_devices_express-f425c76b485a875f.yaml │ ├── fix_partition_cleanup-46491861c930db12.yaml │ ├── fixes-agent-lookup-retries-1b4bb90b8e783aca.yaml │ ├── fixes-centos-fedora-grub2-mkconfig-hang-fe22cde231994044.yaml │ ├── fixes-efibootmgr-character-encoding-19e531ba694824c1.yaml │ ├── fixes-error-handling-of-efibootmgr-not-present-in-ramdisk-f11b4241edcf0e81.yaml │ ├── full-sync-d2ec6b248a73f04a.yaml │ ├── get-holder-disks-with-nvme-7d5fa75df2fd5904.yaml │ ├── get-physical-memory-535a32362bcdf83a.yaml │ ├── get_md_components_by_uuid-7f08d423ea9e7c94.yaml │ ├── get_numa_node-eeab34a92739b6f6.yaml │ ├── handle-configdrive-large-disks-3517e9fcf16c7f39.yaml │ ├── handle-fd0-devices-3d1f31c3b34819e8.yaml │ ├── handle-partuuid-for-fstab-e0aadea20a056982.yaml │ ├── handle-ssl-063a91fb7bdcf9b9.yaml │ ├── heartbeat-jitter-620bbcba591d2894.yaml │ ├── ignore-grub-efi-fail-dcf7eb07f61f4388.yaml │ ├── image-checksum-39b2ceef40933c28.yaml │ ├── image-download-retries-65ac31fe4328e438.yaml │ ├── image-security-5c23b890409101c9.yaml │ ├── improve-tgtd-status-d17173dc8f67959f.yaml │ ├── inject-files-b411369ce6856dac.yaml │ ├── inspect-to-clean-b3616d843775c187.yaml │ ├── inspect-url-15547d48432cd2b5.yaml │ ├── inspection-409-69d5bd6c2a49d2ec.yaml │ ├── inspection-to-report-disk-by-path-e3fd4c331d200903.yaml │ ├── inspection-wait-for-ips-223e39b65fef31bd.yaml │ ├── inspection-wait-for-ips-v2-146016f758d7010c.yaml │ ├── inspector-logs-9b7c010c219691d2.yaml │ ├── inspector-retry-502-2b286e2ccc64c195.yaml │ ├── instance-info-root-device-02fed0966bb00fb3.yaml │ ├── inventory-conf-29b59ebe97aefbde.yaml │ ├── ip6-addresses-1c2b9bcd9a124de7.yaml │ ├── ipa-debug-68c86101b1fdc3d9.yaml │ ├── ipmi-address-channel-b6b8010c41d05c1b.yaml │ ├── ipmi-cleanup-a4454f6851d81c4d.yaml │ ├── ipv6-bmc-mac-6133fb30c0d4cc5e.yaml │ ├── ipv6-listen-85d40e58156e398f.yaml │ ├── ipv6-provision-42e9000f6f6a7a3a.yaml │ ├── ironic-error-97e76d9ddacff039.yaml │ ├── iscsi-detection-on-diskless-hw-f27dcce3aaa35ac2.yaml │ ├── jitter-for-inspection-command-5a226927757a0308.yaml │ ├── let_crypt_generate_the_salt-99876591325275a1.yaml │ ├── lib-exc-41ee122eb4a04bc4.yaml │ ├── limit-qemu-img-malloc-arena-025ed84115481eae.yaml │ ├── limit-qemu-img-ram-usage-d7b7a16ac5e9c917.yaml │ ├── lldp-error-handling-5b6576b378ef9c3a.yaml │ ├── lldp-loop-fdfa584caf33d847.yaml │ ├── lldp-raw-a09174cb930bca97.yaml │ ├── lockdown-dc656fd26f13321f.yaml │ ├── lockout-command-result-a368187515385270.yaml │ ├── log-download-size-57982fa8df336520.yaml │ ├── log-file-7aaaf31693ddc617.yaml │ ├── logs-collector-non-ascii-010339bf256443c8.yaml │ ├── lsblk-all-956c1df808a169bf.yaml │ ├── lshw-cb89894be057bdc9.yaml │ ├── lshw-for-memory-and-system-info-35c69da067c72b36.yaml │ ├── lshw-no-memory-bank-size-05ea71987362986e.yaml │ ├── manual-introspection-b04b5c25f5e004ac.yaml │ ├── manually-configure-ironic-api-version-517afd0a423036ad.yaml │ ├── md-restart-9e0d47863a086792.yaml │ ├── mdadm-d5b8c186182620b1.yaml │ ├── mdns-e020484e64d76edb.yaml │ ├── min-ironic-ocata-dff80e567783e87c.yaml │ ├── mix-and-match-disk-detection-58db04403ce220a0.yaml │ ├── mlnx-steps-now-available-for-deploy-4a4226ffaae888f3.yaml │ ├── move_swraid_to_efibootmgr-d87c1bfde1661fb5.yaml │ ├── multipath-handling-00a5b412d2cf2e4e.yaml │ ├── multipath-serial-615fc925984abbf7.yaml │ ├── multipath_error_handling_improvement-1669d0de4bfdbe95.yaml │ ├── multiple-lan-channels-ee32d80150f990bf.yaml │ ├── name-root-device-hints-0cfc8c90d03c8bf0.yaml │ ├── net-speed-8854901e2051bb79.yaml │ ├── new-agent-api-afbe7391493749be.yaml │ ├── new-sync-command-6f5fa55df2fd5903.yaml │ ├── no-bash-for-grub-c38369af8cc7cf26.yaml │ ├── no-coreos-3345cc69009dead9.yaml │ ├── no-iscsi-fd21808edbea5ac2.yaml │ ├── no-link-local-2e861978c5c7bf30.yaml │ ├── no-mac-54616606ee6b844d.yaml │ ├── no-netboot-d034bb1d1d9166c5.yaml │ ├── no-retry-disk-space-errors-a24c29b336fd11d9.yaml │ ├── no-sample-ac11bd0fa27af62a.yaml │ ├── no-standalone-bb34eae2cc468837.yaml │ ├── no-zram-78cc6583f4f90a9c.yaml │ ├── old-inspector-data-5e63c9bce72b4fb5.yaml │ ├── only-run-evaluate-hardware-support-once-9ec1ae327b4e03f2.yaml │ ├── oslo-config-generator-b0f70b9fb7e23997.yaml │ ├── parallel-erase-disk-devices-09ea33d5443aead0.yaml │ ├── partition_check_read_only_base_device-5bc15ac2f034aca9.yaml │ ├── permit-pre-hashed-rescue-passwords-4275f6e697533cec.yaml │ ├── pint-0.5-816aaf3a4f6d4a6e.yaml │ ├── poll-mode-063bd36b2b18bffb.yaml │ ├── prefix-lldp-timeout-50acc656313d8dd2.yaml │ ├── prepare-image-49744276cef719d5.yaml │ ├── preserve-efi-folder-contents-ea1e278b3093ec55.yaml │ ├── prevent-deletion-of-shared-disk-filesystems-4c17c7666d2fe3bc.yaml │ ├── prevent-needless-iscsi-cleanup-f8d602c0abc7e8ba.yaml │ ├── prevent-restart-after-rescue-2cdd9cb03c0efb1b.yaml │ ├── prioritize-lsblk-device-serials-8cae406ca5164a01.yaml │ ├── qemu-img-ooo-write-721b8a0057ab7b8a.yaml │ ├── qemu-write-zeros-2edbf3152c57e2b6.yaml │ ├── raid-esp-size-2c322adb2d3b9ce7.yaml │ ├── raid-hints-604f9ffdd86432eb.yaml │ ├── raid5-6-support-0807597c3633a26c.yaml │ ├── readd_missing_devs-2ed85805388b6e42.yaml │ ├── rebuild_on_esp_raid-33f359bdf5ccaa09.yaml │ ├── relax-checksum-feeding-11044ae02b411a07.yaml │ ├── remove-agent-token-required-808e99b83b4456a1.yaml │ ├── remove-lldp-timeout-ea481dbb01a39522.yaml │ ├── remove-py38-15fc164a4a08b764.yaml │ ├── remove-switch_port_descr-switch_chassis_descr-40f2bb37b5f1fdd1.yaml │ ├── remove-sysrq-2c2804930180f408.yaml │ ├── remove-vendor-passthru-eda3519c322eb4e2.yaml │ ├── report-intf-bus-and-driver-63ed0277b372c1d1.yaml │ ├── rescan-before-checking-uefi-64597c937880134d.yaml │ ├── rescan-device-after-mkfs-3f9d52a2e3b6fff3.yaml │ ├── rescue-dhcp_network-for-tinyipa-a14de5fae38a5dce.yaml │ ├── respect-listen-directives-94fb863c5b692c07.yaml │ ├── rework-ata-secure-erase-c6684962ef078281.yaml │ ├── root-device-hints-rotational-67e6e61074c26561.yaml │ ├── sector_size-b2c0a07086012c17.yaml │ ├── set-clock-prior-to-poweroff-af6ec210aad8b45a.yaml │ ├── several-urls-9c3b8c14338b06ba.yaml │ ├── skip-lookup-and-heartbeat-if-apiurl-not-configured-5ae8b04ae1e74673.yaml │ ├── skips-bootloader-install-35c463195aa61800.yaml │ ├── sleep-ebe58fbe07d30219.yaml │ ├── softraid-bootable-with-uefi-aa22e6cbaf1ea747.yaml │ ├── softraid-creation-on-nvme-a2fd4c531d200904.yaml │ ├── softraid-partitioning-refactor-104b817c3bdc73e3.yaml │ ├── softraid-zap-superblocks-anywhere.yaml │ ├── software-raid-4a88e6c5af9ea742.yaml │ ├── software-raid-raid-ESPs-25a2aa117b99620a.yaml │ ├── software-raid-use-label-as-rootfs-uuid-d9a3827180f1a238.yaml │ ├── software_raid_use_rootfs_uuid-9149cc0c8638d5d5.yaml │ ├── start_passing_agent_version_to_ironic-6fa8670ae0e7eb38.yaml │ ├── stream-raw-images-d2e245aaed991d86.yaml │ ├── streaming-partition-images-cdeb260ef8f90012.yaml │ ├── streaming-uuid-fdf136a7745fbb3d.yaml │ ├── support-4096-sector-size-490adc8ed256092d.yaml │ ├── support-bootloader-csv-file-use-c815b520c600cd98.yaml │ ├── support-collecting-ipv6-address-dd819d543f851a63.yaml │ ├── support-image-proxy-e2987a6589375451.yaml │ ├── support-linux-io-6bbd7ff1f0d70a0e.yaml │ ├── support-lldp-in-inventory-4ab6e45ccd35dace.yaml │ ├── support-prep-partitions-5e273572ab7ce018.yaml │ ├── suse-tinyipa-support-20acecd6d7b20952.yaml │ ├── sw-raid-assemble-9c20fe967f73d1dd.yaml │ ├── timeout_on_file_download-ed77918318316075.yaml │ ├── tinycore-ipv6-1b620c61402b5720.yaml │ ├── tinyipa-python3-default-b8434793e17465db.yaml │ ├── tinyipa-rescue-dhcp-multi-tenant-b32bda7bf2b12679.yaml │ ├── tinyipa-ssh-e8a3a01a3f3ff5f4.yaml │ ├── udev-settle-f75db34db990ad68.yaml │ ├── udevadm-settle-9d3e5f1f20211857.yaml │ ├── uefi-esp-660fc2c650e6af92.yaml │ ├── uefi-fallback-266c647f6aff58fd.yaml │ ├── uefi-images-38c8536db189ffc1.yaml │ ├── understand-node-conflict-is-locked-2ea21dd45abfe4f7.yaml │ ├── up-qemuimg-mem-1536183a02b3a235.yaml │ ├── usb-autodiscovery-ab5a4a40ba096bb8.yaml │ ├── use-latest-coreos-87f826d26b46548d.yaml │ ├── use-system-random-00b0721c8ebd0c5a.yaml │ ├── vmedia-copy-6a58f3183b166c42.yaml │ ├── wait-for-interfaces-before-lookup-9bf38852b2f176a1.yaml │ ├── wait-root-device-504b517c3aec73e2.yaml │ ├── whole-disk-grub-0b1b8b9c44e31d28.yaml │ └── zero-size-78d3be2ac8fd59c2.yaml └── source │ ├── 2023.1.rst │ ├── 2023.2.rst │ ├── 2024.1.rst │ ├── 2024.2.rst │ ├── 2025.1.rst │ ├── _static │ └── .placeholder │ ├── _templates │ └── .placeholder │ ├── conf.py │ ├── index.rst │ ├── liberty.rst │ ├── mitaka.rst │ ├── newton.rst │ ├── ocata.rst │ ├── pike.rst │ ├── queens.rst │ ├── rocky.rst │ ├── stein.rst │ ├── train.rst │ ├── unreleased.rst │ ├── ussuri.rst │ ├── victoria.rst │ ├── wallaby.rst │ ├── xena.rst │ ├── yoga.rst │ └── zed.rst ├── requirements.txt ├── setup.cfg ├── setup.py ├── test-requirements.txt ├── tools ├── bandit.yml ├── config │ ├── check_uptodate.sh │ └── ipa-config-generator.conf ├── run_bashate.sh └── with_venv.sh ├── tox.ini └── zuul.d ├── ironic-python-agent-jobs.yaml └── project.yaml /.git-blame-ignore-revs: -------------------------------------------------------------------------------- 1 | 36e5993a0477c917163a315ad095124339f96fd9 # ignoring changes from codespell -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.py[co] 2 | src/* 3 | build/* 4 | AUTHORS 5 | ChangeLog 6 | *.egg* 7 | .tox/* 8 | .idea 9 | devenv/* 10 | cover 11 | .coverage 12 | coverage.xml 13 | .stestr 14 | imagebuild/.image_cache 15 | imagebuild/coreos/build 16 | imagebuild/coreos/dist 17 | imagebuild/coreos/oem/authorized_keys 18 | imagebuild/coreos/oem/container.tar.gz 19 | imagebuild/coreos/UPLOAD 20 | *.swp 21 | _build 22 | doc/source/contributor/api/ 23 | doc/build 24 | .proxy.sh.save 25 | 26 | # release notes build 27 | releasenotes/build 28 | 29 | # upper-constraints handling for image builds 30 | upper-constraints.txt 31 | 32 | # auto-generated example file 33 | etc/ironic_python_agent/ironic_python_agent.conf.sample 34 | -------------------------------------------------------------------------------- /.gitreview: -------------------------------------------------------------------------------- 1 | [gerrit] 2 | host=review.opendev.org 3 | port=29418 4 | project=openstack/ironic-python-agent.git 5 | -------------------------------------------------------------------------------- /.stestr.conf: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | test_path=${OS_TEST_PATH:-./ironic_python_agent/tests/unit} 3 | top_dir=./ 4 | -------------------------------------------------------------------------------- /CONTRIBUTING.rst: -------------------------------------------------------------------------------- 1 | If you would like to contribute to the development of OpenStack, 2 | you must follow the steps in this page: 3 | 4 | https://docs.openstack.org/infra/manual/developers.html 5 | 6 | Once those steps have been completed, changes to OpenStack 7 | should be submitted for review via the Gerrit tool, following 8 | the workflow documented at: 9 | 10 | https://docs.openstack.org/infra/manual/developers.html#development-workflow 11 | 12 | Pull requests submitted through GitHub will be ignored. 13 | 14 | Bugs should be filed in Launchpad, not GitHub: 15 | 16 | https://bugs.launchpad.net/ironic-python-agent/+bugs 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2012-2013 Rackspace, Inc. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use 4 | this file except in compliance with the License. You may obtain a copy of the 5 | License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software distributed 10 | under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 11 | CONDITIONS OF ANY KIND, either express or implied. See the License for the 12 | specific language governing permissions and limitations under the License. 13 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | =================== 2 | Ironic Python Agent 3 | =================== 4 | 5 | Team and repository tags 6 | ======================== 7 | 8 | .. image:: https://governance.openstack.org/tc/badges/ironic-python-agent.svg 9 | :target: https://governance.openstack.org/tc/reference/tags/index.html 10 | 11 | Overview 12 | ======== 13 | 14 | An agent for controlling and deploying Ironic controlled baremetal nodes. 15 | 16 | The ironic-python-agent works with the agent driver in Ironic to provision 17 | the node. Starting with ironic-python-agent running on a ramdisk on the 18 | unprovisioned node, Ironic makes API calls to ironic-python-agent to provision 19 | the machine. This allows for greater control and flexibility of the entire 20 | deployment process. 21 | 22 | The ironic-python-agent may also be used with the original Ironic pxe drivers 23 | as of the Kilo OpenStack release. 24 | 25 | 26 | Building the IPA deployment ramdisk 27 | =================================== 28 | 29 | For more information see the `Image Builder `_ section of the Ironic Python Agent 30 | developer guide. 31 | 32 | 33 | Using IPA with devstack 34 | ======================= 35 | 36 | This is covered in the `Deploying Ironic with DevStack `_ 37 | section of the Ironic dev-quickstart guide. 38 | 39 | 40 | Project Resources 41 | ================= 42 | Project bugs are tracked on Launchpad: 43 | 44 | https://bugs.launchpad.net/ironic-python-agent/+bugs 45 | 46 | Developer documentation can be found here: 47 | 48 | https://docs.openstack.org/ironic-python-agent/latest/ 49 | 50 | Release notes for the project are available at: 51 | 52 | https://docs.openstack.org/releasenotes/ironic-python-agent/ 53 | 54 | Source code repository for the project is located at: 55 | 56 | https://opendev.org/openstack/ironic-python-agent/ 57 | 58 | IRC channel: 59 | #openstack-ironic on irc.oftc.net 60 | 61 | To contribute, start here: `Openstack: How to 62 | contribute `_. 63 | -------------------------------------------------------------------------------- /bindep.txt: -------------------------------------------------------------------------------- 1 | # these are needed to compile Python dependencies from sources 2 | python3-all-dev [platform:dpkg !platform:ubuntu-precise test] 3 | python3-devel [platform:rpm test] 4 | build-essential [platform:dpkg test] 5 | libssl-dev [platform:dpkg test] 6 | libffi-dev [platform:dpkg test] 7 | libffi-devel [platform:rpm test] 8 | 9 | # these are needed for functional tests 10 | mdadm [test] 11 | parted [test] 12 | 13 | # this is needed for compiling translations 14 | gettext [test] 15 | 16 | # these are needed to build a deploy ramdisk 17 | 18 | gnupg [imagebuild] 19 | squashfs-tools [platform:dpkg platform:redhat imagebuild] 20 | squashfs [platform:suse imagebuild] 21 | libguestfs0 [platform:dpkg imagebuild] 22 | libguestfs [platform:rpm imagebuild] 23 | python-guestfs [platform:dpkg imagebuild] 24 | # for TinyIPA build 25 | wget [imagebuild] 26 | python3-pip [imagebuild] 27 | unzip [imagebuild] 28 | sudo [imagebuild] 29 | gawk [imagebuild] 30 | file [imagebuild] 31 | podman [imagebuild] 32 | -------------------------------------------------------------------------------- /doc/requirements.txt: -------------------------------------------------------------------------------- 1 | doc8>=0.6.0 # Apache-2.0 2 | sphinx>=2.0.0 # BSD 3 | openstackdocstheme>=2.2.1 # Apache-2.0 4 | reno>=3.1.0 # Apache-2.0 5 | sphinxcontrib-apidoc>=0.2.0 # BSD 6 | -------------------------------------------------------------------------------- /doc/source/admin/index.rst: -------------------------------------------------------------------------------- 1 | ================================== 2 | Ironic Python Agent Administration 3 | ================================== 4 | 5 | .. toctree:: 6 | how_it_works 7 | hardware_managers 8 | rescue 9 | troubleshooting 10 | -------------------------------------------------------------------------------- /doc/source/admin/rescue.rst: -------------------------------------------------------------------------------- 1 | .. _admin_rescue: 2 | 3 | =========== 4 | Rescue mode 5 | =========== 6 | 7 | Overview 8 | ======== 9 | 10 | Rescue mode is a feature that can be used to boot a ramdisk for a tenant in 11 | case the machine is otherwise inaccessible. For example, if there's a disk 12 | failure that prevents access to another operating system, rescue mode can be 13 | used to diagnose and fix the problem. 14 | 15 | Support in ironic-python-agent images 16 | ===================================== 17 | 18 | Rescue is initiated when ironic-conductor sends the ``finalize_rescue`` 19 | command to ironic-python-agent. A user ``rescue`` is created with a password 20 | provided as an argument to this command. DHCP is then configured to 21 | facilitate network connectivity, thus enabling a user to login to the machine 22 | in rescue mode. 23 | 24 | .. warning:: Rescue mode exposes the contents of the ramdisk to the tenant. 25 | Ensure that any rescue image you build does not contain secrets 26 | (e.g. sensitive clean steps, proprietary firmware blobs). 27 | 28 | The below has information about supported images that may be built to use 29 | rescue mode. 30 | 31 | DIB 32 | --- 33 | 34 | The DIB image supports rescue mode when used with DHCP tenant networks. 35 | 36 | After the ``finalize_rescue`` command completes, DHCP will be configured on all 37 | network interfaces, and a ``rescue`` user will be created with the specified 38 | ``rescue_password``. 39 | 40 | TinyIPA 41 | ------- 42 | 43 | The TinyIPA image supports rescue mode when used with DHCP tenant networks. 44 | No special action is required to `build a TinyIPA image`_ with this support. 45 | 46 | After the ``finalize_rescue`` command completes, DHCP will be configured on all 47 | network interfaces, and a ``rescue`` user will be created with the specified 48 | ``rescue_password``. 49 | 50 | .. _build a TinyIPA image: https://docs.openstack.org/ironic-python-agent-builder/latest/admin/tinyipa.html 51 | -------------------------------------------------------------------------------- /doc/source/conf.py: -------------------------------------------------------------------------------- 1 | # -- General configuration ---------------------------------------------------- 2 | 3 | # Add any Sphinx extension module names here, as strings. They can be 4 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. 5 | extensions = ['sphinx.ext.autodoc', 6 | 'sphinx.ext.viewcode', 7 | 'sphinxcontrib.apidoc', 8 | 'openstackdocstheme', 9 | ] 10 | 11 | openstackdocs_projects = [ 12 | 'ironic', 13 | 'ironic-inspector', 14 | 'ironic-lib', 15 | ] 16 | 17 | # autodoc generation is a bit aggressive and a nuisance when doing heavy 18 | # text edit cycles. 19 | # execute "export SPHINX_DEBUG=1" in your terminal to disable 20 | 21 | # Add any paths that contain templates here, relative to this directory. 22 | templates_path = ['_templates'] 23 | 24 | # The suffix of source filenames. 25 | source_suffix = '.rst' 26 | 27 | # The master toctree document. 28 | master_doc = 'index' 29 | 30 | # General information about the project. 31 | copyright = 'OpenStack Foundation' 32 | 33 | # A list of ignored prefixes for module index sorting. 34 | modindex_common_prefix = ['ironic_python_agent'] 35 | 36 | # If true, '()' will be appended to :func: etc. cross-reference text. 37 | add_function_parentheses = True 38 | 39 | # If true, the current module name will be prepended to all description 40 | # unit titles (such as .. function::). 41 | add_module_names = True 42 | 43 | # The name of the Pygments (syntax highlighting) style to use. 44 | pygments_style = 'native' 45 | 46 | # sphinxcontrib.apidoc options 47 | apidoc_module_dir = '../../ironic_python_agent' 48 | apidoc_output_dir = 'contributor/api' 49 | apidoc_excluded_paths = [ 50 | 'tests', 51 | ] 52 | apidoc_separate_modules = True 53 | 54 | 55 | # -- Options for HTML output -------------------------------------------------- 56 | 57 | # The theme to use for HTML and HTML Help pages. Major themes that come with 58 | # Sphinx are currently 'default' and 'sphinxdoc'. 59 | html_theme = 'openstackdocs' 60 | 61 | # openstackdocstheme options 62 | openstackdocs_repo_name = 'openstack/ironic-python-agent' 63 | openstackdocs_pdf_link = True 64 | openstackdocs_use_storyboard = False 65 | 66 | # Output file base name for HTML help builder. 67 | htmlhelp_basename = 'Ironic Python Agentdoc' 68 | 69 | latex_use_xindy = False 70 | 71 | # Grouping the document tree into LaTeX files. List of tuples 72 | # (source start file, target name, title, author, documentclass 73 | # [howto/manual]). 74 | latex_documents = [ 75 | ( 76 | 'index', 77 | 'doc-ironic-python-agent.tex', 78 | 'Ironic Python Agent Documentation', 79 | 'OpenStack Foundation', 80 | 'manual' 81 | ), 82 | ] 83 | -------------------------------------------------------------------------------- /doc/source/contributor/index.rst: -------------------------------------------------------------------------------- 1 | =================================== 2 | Contributing to Ironic Python Agent 3 | =================================== 4 | 5 | Ironic Python Agent is an agent for controlling and deploying Ironic controlled 6 | baremetal nodes. Typically run in a ramdisk, the agent exposes a REST API for 7 | provisioning servers. 8 | 9 | Throughout the remainder of the document, Ironic Python Agent will be 10 | abbreviated to IPA. 11 | 12 | .. toctree:: 13 | 14 | hardware_managers 15 | metrics 16 | rescue 17 | 18 | Generated Developer Documentation 19 | ================================= 20 | 21 | * :ref:`modindex` 22 | 23 | .. toctree:: 24 | :hidden: 25 | 26 | api/modules 27 | -------------------------------------------------------------------------------- /doc/source/contributor/metrics.rst: -------------------------------------------------------------------------------- 1 | .. _metrics: 2 | 3 | =============================================== 4 | Emitting metrics from Ironic-Python-Agent (IPA) 5 | =============================================== 6 | 7 | .. warning:: 8 | IPA metrics are deprecated and scheduled for removal at or after the 9 | 2026.1 OpenStack release cycle. 10 | 11 | This document describes how to emit metrics from IPA, including timers and 12 | counters in code to directly emitting hardware metrics from a custom 13 | HardwareManager. 14 | 15 | Overview 16 | ======== 17 | IPA uses a vendored version of the metrics implementation originally from 18 | ironic-lib, with a few caveats due to the dynamic configuration done at 19 | lookup time. You cannot cache the metrics instance as the MetricsLogger 20 | returned will change after lookup if configs different than the default 21 | setting have been used. This also means that the method decorator 22 | cannot be used in IPA. 23 | 24 | Using a context manager 25 | ======================= 26 | Using the context manager is the recommended way for sending metrics that time 27 | or count sections of code. However, given that you cannot cache the 28 | MetricsLogger, you have to explicitly call get_metrics_logger() from 29 | every time. For example:: 30 | 31 | from ironic_python_agent.metrics_lib import metrics_utils 32 | 33 | def my_method(): 34 | with metrics_utils.get_metrics_logger(__name__).timer('my_method'): 35 | return _do_work() 36 | 37 | As a note, these metric collectors do work for custom HardwareManagers as 38 | well. However, you may want to metric the portions of a method that determine 39 | compatibility separate from portions of a method that actually do work, in 40 | order to assure the metrics are relevant and useful on all hardware. 41 | 42 | Explicitly sending metrics 43 | ========================== 44 | A feature that may be particularly helpful for deployers writing custom 45 | HardwareManagers is the ability to explicitly send metrics. For instance, 46 | you could add a cleaning step which would retrieve metrics about a device and 47 | ship them using the provided metrics library. For example:: 48 | 49 | from ironic_python_agent.metrics_lib import metrics_utils 50 | 51 | def my_cleaning_step(): 52 | for name, value in _get_smart_data(): 53 | metrics_utils.get_metrics_logger(__name__).send_gauge(name, value) 54 | 55 | -------------------------------------------------------------------------------- /doc/source/contributor/rescue.rst: -------------------------------------------------------------------------------- 1 | =========== 2 | Rescue Mode 3 | =========== 4 | 5 | Ironic supports putting nodes in rescue mode using hardware types that 6 | support rescue interfaces. A rescue operation can be used to boot nodes 7 | into a rescue ramdisk so that the ``rescue`` user can access the node. 8 | This provides the ability to access the node when normal access is not 9 | possible. For example, if there is a need to perform manual password 10 | reset or data recovery in the event of some failure, a rescue operation 11 | can be used. IPA rescue extension exposes a command ``finalize_rescue`` 12 | (that is used by Ironic) to set the password for the ``rescue`` user 13 | when the rescue ramdisk is booted. 14 | 15 | finalize_rescue command 16 | ======================= 17 | 18 | The rescue extension exposes the command ``finalize_rescue``; when 19 | invoked, it triggers rescue mode:: 20 | 21 | POST /v1/commands 22 | 23 | {"name": "rescue.finalize_rescue", 24 | "params": { 25 | "rescue_password": "p455w0rd"} 26 | } 27 | 28 | ``rescue_password`` is a required parameter for this command. 29 | 30 | Upon success, it returns following data in response:: 31 | 32 | {"command_name": "finalize_rescue", 33 | "command_params": { 34 | "rescue_password": "p455w0rd"}, 35 | "command_status": "SUCCEEDED" 36 | "command_result": null 37 | "command_error": null 38 | } 39 | 40 | If successful, this synchronous command will: 41 | 42 | 1. Write the salted and encrypted ``rescue_password`` to 43 | ``/etc/ipa-rescue-config/ipa-rescue-password`` in the chroot or filesystem 44 | that ironic-python-agent is running in. 45 | 46 | 2. Stop the ironic-python-agent process after completing these actions and 47 | returning the response to the API request. 48 | -------------------------------------------------------------------------------- /doc/source/index.rst: -------------------------------------------------------------------------------- 1 | =============================== 2 | Welcome to Ironic Python Agent! 3 | =============================== 4 | 5 | Overview 6 | ======== 7 | 8 | Ironic Python Agent (often abbreviated as IPA) is an agent for controlling and 9 | deploying :ironic-doc:`Ironic <>` controlled baremetal nodes. Typically run in 10 | a ramdisk, the agent exposes a REST API for provisioning servers. 11 | 12 | Contents 13 | ======== 14 | 15 | .. toctree:: 16 | :maxdepth: 3 17 | 18 | install/index 19 | admin/index 20 | contributor/index 21 | 22 | Indices and tables 23 | ================== 24 | 25 | * :ref:`genindex` 26 | * :ref:`search` 27 | -------------------------------------------------------------------------------- /examples/README.rst: -------------------------------------------------------------------------------- 1 | Example Hardware Managers 2 | ========================= 3 | 4 | ``vendor-device`` 5 | ----------------- 6 | 7 | This example manager is meant to demonstrate good patterns for developing a 8 | device-specific hardware manager, such as for a specific version of NIC or 9 | disk. 10 | 11 | Use Cases include: 12 | 13 | * Adding device-specific clean-steps, such as to flash firmware or 14 | verify it's still properly working after being provisioned. 15 | * Implementing erase_device() using a vendor-provided utility for a given 16 | disk model. 17 | 18 | ``custom-disk-erase`` 19 | --------------------- 20 | 21 | This example manager is meant to demonstrate good patterns for developing a 22 | hardware manager to perform disk erasure using a custom vendor utility. 23 | 24 | Use case: 25 | * Ensuring block devices of a specific model are erased using custom code 26 | 27 | ``business-logic`` 28 | ------------------ 29 | 30 | This example manager is meant to demonstrate how cleaning and the agent can 31 | use the node object and the node itself to enforce business logic and node 32 | consistency. 33 | 34 | Use Cases include: 35 | 36 | * Quality control on hardware by ensuring no component is beyond its useful 37 | life. 38 | * Asserting truths about the node; such as number of disks or total RAM. 39 | * Reporting metrics about the node's hardware state. 40 | * Overriding logic of get_os_install_device(). 41 | * Inserting additional deploy steps. 42 | 43 | Make your own Manager based on these 44 | ------------------------------------ 45 | 46 | To make your own hardware manager based on these examples, copy a relevant 47 | example out of this directory. Modify class names and entrypoints in setup.cfg 48 | to be not-examples. 49 | 50 | Since the entrypoints are defined in setup.cfg, simply installing your new 51 | python package alongside IPA in a custom ramdisk should be enough to enable 52 | the new hardware manager. 53 | -------------------------------------------------------------------------------- /examples/business-logic/setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | name = example-business-logic 3 | author = Jay Faulkner 4 | author-email = jay@jvf.cc 5 | summary = IPA Example Hardware Managers: Business Logic 6 | license = Apache-2 7 | classifier = 8 | Intended Audience :: Developers 9 | Operating System :: OS Independent 10 | License :: OSI Approved :: Apache Software License 11 | Programming Language :: Python :: 3 12 | 13 | [files] 14 | modules = 15 | example_business_logic 16 | 17 | [entry_points] 18 | ironic_python_agent.hardware_managers = 19 | example_business_logic = example_business_logic:ExampleBusinessLogicHardwareManager 20 | -------------------------------------------------------------------------------- /examples/business-logic/setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import setuptools 3 | 4 | setuptools.setup( 5 | setup_requires=['pbr'], 6 | pbr=True) 7 | -------------------------------------------------------------------------------- /examples/custom-disk-erase/example_disk_eraser.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); 2 | # you may not use this file except in compliance with the License. 3 | # You may obtain a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, 9 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 | # See the License for the specific language governing permissions and 11 | # limitations under the License. 12 | 13 | from oslo_log import log 14 | 15 | from ironic_python_agent import exceptions 16 | from ironic_python_agent import hardware 17 | 18 | LOG = log.getLogger() 19 | 20 | 21 | def _is_supported_disk(block_device): 22 | # Helper methods are outside the class, to prevent them from being called 23 | # by dispatch_to_managers. 24 | # 25 | # This method would perform checks to see if this is a disk that is 26 | # supported by this custom hardware manager. 27 | return True 28 | 29 | 30 | class ExampleDiskEraserHardwareManager(hardware.HardwareManager): 31 | """Example hardware manager to support wiping a specific model disk""" 32 | 33 | # All hardware managers have a name and a version. 34 | # Version should be bumped anytime a change is introduced. This will 35 | # signal to Ironic that if automatic node cleaning is in progress to 36 | # restart it from the beginning, to ensure consistency. The value can 37 | # be anything; it's checked for equality against previously seen 38 | # name:manager pairs. 39 | HARDWARE_MANAGER_NAME = 'ExampleDiskEraserHardwareManager' 40 | HARDWARE_MANAGER_VERSION = '1' 41 | 42 | def evaluate_hardware_support(self): 43 | """Declare level of hardware support provided. 44 | 45 | Since this example covers a case of supporting a specific device, 46 | for disk erasure, we're going to return SERVICE_PROVIDER statically, 47 | and actually do disk detection in erase_device method. 48 | 49 | :returns: HardwareSupport level for this manager. 50 | """ 51 | return hardware.HardwareSupport.SERVICE_PROVIDER 52 | 53 | def erase_block_device(self, node, block_device): 54 | """Erases hardware via custom utility if supported.""" 55 | if not _is_supported_disk(block_device): 56 | raise exceptions.IncompatibleHardwareMethodError( 57 | "Not supported by this manager") 58 | 59 | # Put your code here to wipe the disk. 60 | -------------------------------------------------------------------------------- /examples/custom-disk-erase/setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | name = example-disk-eraser 3 | author = Jay Faulkner 4 | author-email = jay@jvf.cc 5 | summary = IPA Example Hardware Managers: Example Disk Eraser 6 | license = Apache-2 7 | classifier = 8 | Intended Audience :: Developers 9 | Operating System :: OS Independent 10 | License :: OSI Approved :: Apache Software License 11 | Programming Language :: Python :: 3 12 | Development Status :: 4 - Beta 13 | 14 | [files] 15 | modules = 16 | example_disk_eraser 17 | 18 | [entry_points] 19 | ironic_python_agent.hardware_managers = 20 | example_disk_eraser = example_disk_eraser:ExampleDiskEraserHardwareManager 21 | -------------------------------------------------------------------------------- /examples/custom-disk-erase/setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import setuptools 3 | 4 | setuptools.setup( 5 | setup_requires=['pbr'], 6 | pbr=True) 7 | -------------------------------------------------------------------------------- /examples/vendor-device/setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | name = example-vendor-device 3 | author = Jay Faulkner 4 | author-email = jay@jvf.cc 5 | summary = IPA Example Hardware Managers: Vendor Device 6 | license = Apache-2 7 | classifier = 8 | Intended Audience :: Developers 9 | Operating System :: OS Independent 10 | License :: OSI Approved :: Apache Software License 11 | Programming Language :: Python :: 3 12 | Development Status :: 4 - Beta 13 | 14 | [files] 15 | modules = 16 | example_device 17 | 18 | [entry_points] 19 | ironic_python_agent.hardware_managers = 20 | example_device = example_device:ExampleDeviceHardwareManager 21 | -------------------------------------------------------------------------------- /examples/vendor-device/setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import setuptools 3 | 4 | setuptools.setup( 5 | setup_requires=['pbr'], 6 | pbr=True) 7 | -------------------------------------------------------------------------------- /imagebuild/README.rst: -------------------------------------------------------------------------------- 1 | ironic-python-agent images 2 | ========================== 3 | 4 | The content has been moved to `ironic-python-agent-builder 5 | `_. 6 | -------------------------------------------------------------------------------- /ironic_python_agent/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/ironic_python_agent/__init__.py -------------------------------------------------------------------------------- /ironic_python_agent/api/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/ironic_python_agent/api/__init__.py -------------------------------------------------------------------------------- /ironic_python_agent/cmd/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/ironic_python_agent/cmd/__init__.py -------------------------------------------------------------------------------- /ironic_python_agent/cmd/agent.py: -------------------------------------------------------------------------------- 1 | # Copyright 2013 Rackspace, Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | import sys 16 | 17 | from oslo_config import cfg 18 | from oslo_log import log 19 | from oslo_service import sslutils 20 | from oslo_utils import strutils 21 | 22 | from ironic_python_agent import agent 23 | from ironic_python_agent import config 24 | from ironic_python_agent import utils 25 | 26 | CONF = cfg.CONF 27 | 28 | 29 | def run(): 30 | """Entrypoint for IronicPythonAgent.""" 31 | # NOTE(dtantsur): this must happen very early of the files from 32 | # /etc/ironic-python-agent.d won't be loaded 33 | utils.copy_config_from_vmedia() 34 | 35 | log.register_options(CONF) 36 | CONF(args=sys.argv[1:]) 37 | # Debug option comes from oslo.log, allow overriding it via kernel cmdline 38 | ipa_debug = config.APARAMS.get('ipa-debug') 39 | if ipa_debug is not None: 40 | ipa_debug = strutils.bool_from_string(ipa_debug) 41 | CONF.set_override('debug', ipa_debug) 42 | log.setup(CONF, 'ironic-python-agent') 43 | # Used for TLS configuration 44 | sslutils.register_opts(CONF) 45 | 46 | logger = log.getLogger(__name__) 47 | logger.debug("Configuration:") 48 | CONF.log_opt_values(logger, log.DEBUG) 49 | utils.log_early_log_to_logger() 50 | agent.IronicPythonAgent.from_config(CONF).run() 51 | -------------------------------------------------------------------------------- /ironic_python_agent/cmd/inspect.py: -------------------------------------------------------------------------------- 1 | # Copyright 2013 Rackspace, Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | import sys 16 | 17 | from oslo_config import cfg 18 | from oslo_log import log 19 | 20 | from ironic_python_agent import inspect as inspection 21 | 22 | CONF = cfg.CONF 23 | 24 | 25 | def run(): 26 | """Entrypoint for IronicPythonAgent.""" 27 | log.register_options(CONF) 28 | CONF(args=sys.argv[1:]) 29 | log.setup(CONF, 'ironic-python-agent') 30 | inspection.IronicInspection().run() 31 | -------------------------------------------------------------------------------- /ironic_python_agent/encoding.py: -------------------------------------------------------------------------------- 1 | # Copyright 2013 Rackspace, Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | import json 16 | import uuid 17 | 18 | 19 | class Serializable(object): 20 | """Base class for things that can be serialized.""" 21 | serializable_fields = () 22 | 23 | def serialize(self): 24 | """Turn this object into a dict.""" 25 | return dict((f, getattr(self, f)) for f in self.serializable_fields) 26 | 27 | 28 | class SerializableComparable(Serializable): 29 | """A Serializable class which supports some comparison operators 30 | 31 | This class supports the '__eq__' and '__ne__' comparison operators, but 32 | intentionally disables the '__hash__' operator as some child classes may be 33 | mutable. The addition of these comparison operators is mainly used to 34 | assist with unit testing. 35 | """ 36 | 37 | __hash__ = None 38 | 39 | def __eq__(self, other): 40 | return self.serialize() == other.serialize() 41 | 42 | def __ne__(self, other): 43 | return self.serialize() != other.serialize() 44 | 45 | 46 | class RESTJSONEncoder(json.JSONEncoder): 47 | """A slightly customized JSON encoder.""" 48 | def encode(self, o): 49 | """Turn an object into JSON. 50 | 51 | Appends a newline to responses when configured to pretty-print, 52 | in order to make use of curl less painful from most shells. 53 | """ 54 | delimiter = '' 55 | 56 | # if indent is None, newlines are still inserted, so we should too. 57 | if self.indent is not None: 58 | delimiter = '\n' 59 | 60 | return super(RESTJSONEncoder, self).encode(o) + delimiter 61 | 62 | def default(self, o): 63 | """Turn an object into a serializable object. 64 | 65 | In particular, by calling :meth:`.Serializable.serialize` on `o`. 66 | """ 67 | if isinstance(o, Serializable): 68 | return o.serialize() 69 | elif isinstance(o, uuid.UUID): 70 | return str(o) 71 | else: 72 | return json.JSONEncoder.default(self, o) 73 | -------------------------------------------------------------------------------- /ironic_python_agent/extensions/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/ironic_python_agent/extensions/__init__.py -------------------------------------------------------------------------------- /ironic_python_agent/extensions/flow.py: -------------------------------------------------------------------------------- 1 | # Copyright 2014 Mirantis, Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | from oslo_log import log 16 | 17 | from ironic_python_agent import errors 18 | from ironic_python_agent.extensions import base 19 | 20 | LOG = log.getLogger(__name__) 21 | 22 | 23 | def _validate_exts(ext, flow=None): 24 | for task in flow: 25 | for method in task: 26 | ext_name, cmd = ext.split_command(method) 27 | if ext_name not in ext.ext_mgr.names(): 28 | raise errors.RequestedObjectNotFoundError('Extension', 29 | ext_name) 30 | ext_obj = ext.ext_mgr[ext_name].obj 31 | ext.check_cmd_presence(ext_obj, ext_name, cmd) 32 | 33 | 34 | class FlowExtension(base.BaseAgentExtension, base.ExecuteCommandMixin): 35 | @base.async_command('start_flow', _validate_exts) 36 | def start_flow(self, flow=None): 37 | for task in flow: 38 | for method, params in task.items(): 39 | LOG.info("Executing method %s for now", method) 40 | result = self.execute_command(method, **params) 41 | result.join() 42 | LOG.info("%s method's execution is done", method) 43 | if result.command_status == base.AgentCommandStatus.FAILED: 44 | raise errors.CommandExecutionError( 45 | "%s was failed" % method 46 | ) 47 | -------------------------------------------------------------------------------- /ironic_python_agent/extensions/log.py: -------------------------------------------------------------------------------- 1 | # Copyright 2016 Red Hat, Inc. 2 | # All Rights Reserved. 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 5 | # not use this file except in compliance with the License. You may obtain 6 | # a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | # License for the specific language governing permissions and limitations 14 | # under the License. 15 | 16 | from ironic_python_agent.extensions import base 17 | from ironic_python_agent import utils 18 | 19 | 20 | class LogExtension(base.BaseAgentExtension): 21 | 22 | @base.sync_command('collect_system_logs') 23 | def collect_system_logs(self): 24 | """Collect system logs. 25 | 26 | Collect and package diagnostic and support data from the ramdisk. 27 | 28 | :raises: CommandExecutionError if failed to collect the system logs. 29 | :returns: A dictionary with the key `system_logs` and the value 30 | of a gzipped and base64 encoded string of the file with 31 | the logs. 32 | """ 33 | logs = utils.collect_system_logs() 34 | return {'system_logs': logs} 35 | -------------------------------------------------------------------------------- /ironic_python_agent/extensions/poll.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); 2 | # you may not use this file except in compliance with the License. 3 | # You may obtain a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, 9 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 | # See the License for the specific language governing permissions and 11 | # limitations under the License. 12 | 13 | from oslo_log import log 14 | 15 | from ironic_python_agent import errors 16 | from ironic_python_agent.extensions import base 17 | from ironic_python_agent import hardware 18 | 19 | LOG = log.getLogger(__name__) 20 | 21 | 22 | class PollExtension(base.BaseAgentExtension): 23 | 24 | @base.sync_command('get_hardware_info') 25 | def get_hardware_info(self): 26 | """Get the hardware information where IPA is running.""" 27 | hardware_info = hardware.dispatch_to_managers('list_hardware_info') 28 | return hardware_info 29 | 30 | @base.sync_command('set_node_info') 31 | def set_node_info(self, node_info=None): 32 | """Set node lookup data when IPA is running at passive mode. 33 | 34 | :param node_info: A dictionary contains the information of the node 35 | where IPA is running. 36 | """ 37 | if not self.agent.standalone: 38 | error_msg = ('Node lookup data can only be set when the Ironic ' 39 | 'Python Agent is running in standalone mode.') 40 | LOG.error(error_msg) 41 | raise errors.InvalidCommandError(error_msg) 42 | LOG.debug('Received lookup results: %s', node_info) 43 | self.agent.process_lookup_data(node_info) 44 | -------------------------------------------------------------------------------- /ironic_python_agent/extensions/system.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); 2 | # you may not use this file except in compliance with the License. 3 | # You may obtain a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, 9 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 | # See the License for the specific language governing permissions and 11 | # limitations under the License. 12 | 13 | from oslo_log import log 14 | 15 | from ironic_python_agent.extensions import base 16 | 17 | LOG = log.getLogger(__name__) 18 | 19 | 20 | class SystemExtension(base.BaseAgentExtension): 21 | 22 | # TODO(dtantsur): migrate (with deprecation) other system-wide commands 23 | # from standby (power_off, run_image renamed into reboot, sync). 24 | 25 | @base.sync_command('lockdown') 26 | def lockdown(self): 27 | """Lock the agent down to prevent interactions with it.""" 28 | self.agent.lockdown = True 29 | self.agent.serve_api = False 30 | -------------------------------------------------------------------------------- /ironic_python_agent/hardware_managers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/ironic_python_agent/hardware_managers/__init__.py -------------------------------------------------------------------------------- /ironic_python_agent/metrics_lib/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/ironic_python_agent/metrics_lib/__init__.py -------------------------------------------------------------------------------- /ironic_python_agent/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/ironic_python_agent/tests/__init__.py -------------------------------------------------------------------------------- /ironic_python_agent/tests/functional/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/ironic_python_agent/tests/functional/__init__.py -------------------------------------------------------------------------------- /ironic_python_agent/tests/unit/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/ironic_python_agent/tests/unit/__init__.py -------------------------------------------------------------------------------- /ironic_python_agent/tests/unit/extensions/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/ironic_python_agent/tests/unit/extensions/__init__.py -------------------------------------------------------------------------------- /ironic_python_agent/tests/unit/extensions/test_log.py: -------------------------------------------------------------------------------- 1 | # Copyright 2016 Red Hat, Inc. 2 | # All Rights Reserved. 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 5 | # not use this file except in compliance with the License. You may obtain 6 | # a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | # License for the specific language governing permissions and limitations 14 | # under the License. 15 | 16 | from unittest import mock 17 | 18 | from ironic_python_agent.extensions import log 19 | from ironic_python_agent.tests.unit import base 20 | from ironic_python_agent import utils 21 | 22 | 23 | class TestLogExtension(base.IronicAgentTest): 24 | 25 | def setUp(self): 26 | super(TestLogExtension, self).setUp() 27 | self.agent_extension = log.LogExtension() 28 | 29 | @mock.patch.object(utils, 'collect_system_logs', autospec=True) 30 | def test_collect_system_logs(self, mock_collect): 31 | ret = 'Squidward Tentacles' 32 | mock_collect.return_value = ret 33 | 34 | cmd_result = self.agent_extension.collect_system_logs() 35 | serialized_cmd_result = cmd_result.serialize() 36 | expected_ret = {'system_logs': ret} 37 | self.assertEqual(expected_ret, serialized_cmd_result['command_result']) 38 | -------------------------------------------------------------------------------- /ironic_python_agent/tests/unit/hardware_managers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/ironic_python_agent/tests/unit/hardware_managers/__init__.py -------------------------------------------------------------------------------- /ironic_python_agent/tests/unit/hardware_managers/nvidia/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/ironic_python_agent/tests/unit/hardware_managers/nvidia/__init__.py -------------------------------------------------------------------------------- /ironic_python_agent/tests/unit/metrics_lib/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/ironic_python_agent/tests/unit/metrics_lib/__init__.py -------------------------------------------------------------------------------- /ironic_python_agent/tests/unit/test_encoding.py: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2015 Intel Corporation 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 4 | # not use this file except in compliance with the License. You may obtain 5 | # a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12 | # License for the specific language governing permissions and limitations 13 | # under the License. 14 | 15 | import json 16 | 17 | from ironic_python_agent import encoding 18 | from ironic_python_agent.tests.unit import base 19 | 20 | 21 | class SerializableTesting(encoding.Serializable): 22 | serializable_fields = ('jack', 'jill') 23 | 24 | def __init__(self, jack, jill): 25 | self.jack = jack 26 | self.jill = jill 27 | 28 | 29 | class SerializableComparableTesting(encoding.SerializableComparable): 30 | serializable_fields = ('jack', 'jill') 31 | 32 | def __init__(self, jack, jill): 33 | self.jack = jack 34 | self.jill = jill 35 | 36 | 37 | class TestSerializable(base.IronicAgentTest): 38 | def test_baseclass_serialize(self): 39 | obj = encoding.Serializable() 40 | self.assertEqual({}, obj.serialize()) 41 | 42 | def test_childclass_serialize(self): 43 | expected = {'jack': 'hello', 'jill': 'world'} 44 | obj = SerializableTesting('hello', 'world') 45 | self.assertEqual(expected, obj.serialize()) 46 | 47 | 48 | class TestSerializableComparable(base.IronicAgentTest): 49 | 50 | def test_childclass_equal(self): 51 | obj1 = SerializableComparableTesting('hello', 'world') 52 | obj2 = SerializableComparableTesting('hello', 'world') 53 | self.assertEqual(obj1, obj2) 54 | 55 | def test_childclass_notequal(self): 56 | obj1 = SerializableComparableTesting('hello', 'world') 57 | obj2 = SerializableComparableTesting('hello', 'world2') 58 | self.assertNotEqual(obj1, obj2) 59 | 60 | def test_childclass_hash(self): 61 | # Ensure __hash__ is None 62 | obj = SerializableComparableTesting('hello', 'world') 63 | self.assertIsNone(obj.__hash__) 64 | 65 | 66 | class TestEncoder(base.IronicAgentTest): 67 | 68 | encoder = encoding.RESTJSONEncoder() 69 | 70 | def test_encoder(self): 71 | expected = {'jack': 'hello', 'jill': 'world'} 72 | obj = SerializableTesting('hello', 'world') 73 | self.assertEqual(expected, json.loads(self.encoder.encode(obj))) 74 | -------------------------------------------------------------------------------- /ironic_python_agent/version.py: -------------------------------------------------------------------------------- 1 | # Copyright 2011 OpenStack Foundation 2 | # All Rights Reserved. 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 5 | # not use this file except in compliance with the License. You may obtain 6 | # a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | # License for the specific language governing permissions and limitations 14 | # under the License. 15 | 16 | from importlib import metadata as importlib_metadata 17 | 18 | __version__ = importlib_metadata.version("ironic_python_agent") 19 | -------------------------------------------------------------------------------- /plugin-requirements.txt: -------------------------------------------------------------------------------- 1 | # Required for 'extra-hardware' inspection collector 2 | hardware>=0.24.0 3 | 4 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["pbr>=6.0.0", "setuptools>=64.0.0"] 3 | build-backend = "pbr.build" 4 | 5 | [tool.ruff] 6 | line-length = 79 7 | 8 | [tool.ruff.lint] 9 | select = [ 10 | "E", # pycodestyle (error) 11 | "F", # pyflakes 12 | "G", # flake8-logging-format 13 | "LOG", # flake8-logging 14 | ] 15 | -------------------------------------------------------------------------------- /releasenotes/config.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | closed_branch_tag_re: 'r"(?!^(bugfix-)).+-eo[lm]"' 3 | -------------------------------------------------------------------------------- /releasenotes/notes/.placeholder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/releasenotes/notes/.placeholder -------------------------------------------------------------------------------- /releasenotes/notes/4k-block-size-config-drives-4470828dd06d2600.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes a failure case where a deployed instance may be unable to access 5 | the configuration drive post-deployment. This can occur when block 6 | devices only support 4KB IO interactions. When 4KB block IO sizes 7 | are in use, the ISO9660 filesystem driver in Linux cannot be used 8 | as it is modeled around a 2KB block. We now attempt to verify, and 9 | rebuild the configuration drive on a FAT filesystem when we cannot 10 | mount the supplied configuration drive. Operators can force the agent 11 | to write configuration drives using the FAT filesystem using the 12 | ``[DEFAULT]config_drive_rebuild`` option. 13 | -------------------------------------------------------------------------------- /releasenotes/notes/Collect_NIC_name_given_by_BIOS-657c68c0ae16365b.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Collects the BIOS-given NIC's name and adds ``biosdevname`` field to the 5 | network interface inventory collected by the ``default`` collector of IPA. 6 | The utility ``biosdevname`` is used for this purpose. 7 | 8 | This feature is not available for Debian-based and CoreOS images as 9 | ``biosdevname`` is not packaged for Debian-based distributions. 10 | issues: 11 | - Collection of the BIOS-given names of network interfaces is not possible on 12 | Debian-based images as the utility ``biosdevname`` is not available on 13 | them. This applies to any CoreOS images as well, as they utilize a 14 | Debian-based chroot. 15 | -------------------------------------------------------------------------------- /releasenotes/notes/LLDP-ignore-NICs-that-are-not-plugged-in-29213f0a701a72e4.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes a bug in the LLDP discovery code that prevented reporting any 5 | LLDP information if an LLDP discovery raised an exception for one of the 6 | network interfaces. This could happen, for example, if a network 7 | interface incorrectly indicated its readiness for reading. See `bug 1665025 8 | `_ for details. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/ability-to-disable-secure-erase-c3223262726d5aff.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds the ability for the Bare Metal service conductor 5 | service to explicitly choose to disable ATA Secure Erase 6 | from being executed. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/add-block-device-uuid-c8b38264e1688110.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds UUID of the disks to the inventory of block devices that is 5 | collected during inspection. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/add-coreos-dhcp-rescue-support-1dd8e9d5ac9c7594.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Adds an extension to support rescue mode for a CoreOS-based ramdisk using 4 | DHCP for the tenant network. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/add-disk-wait-config-opts-fe805292baca8029.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Added `ipa-disk-wait-attempts` configuration option to configure the 4 | number of times to try and check to see if at least one suitable disk 5 | has appeared in inventory before proceeding with any actions. 6 | - Added `ipa-disk-wait-delay` configuration option to configure how many 7 | seconds to wait between attempts to check if at least one suitable disk 8 | has appeared in inventory. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/add-erase-devices-express-1df107c75f2b3627.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds support for express cleaning mode where hardware-assisted, fast and 5 | secure data erasure is performed on NVMe devices that support it, 6 | while other devices fall back to erase_devices_metadata. 7 | The goal of this feature is to enable express node cleaning in 8 | environments with hybrid storage configuration (e.g. NVMe + HDD). 9 | -------------------------------------------------------------------------------- /releasenotes/notes/add-hostname-8bbf24712b6a4919.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Add the hostname to the introspection data. This will likely be the 5 | hostname as set by the DHCP server. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/add-inspection-retry-1d385f69607c1452.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where intermittent or transitory connection issues can cause 5 | inspection to fail. The ramdisk now retries to report to inspector a total 6 | of five times. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/add-log-extension-35ca22cc0709af4c.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - A new "log" extension has been added and can be used to retrieve 4 | the system logs via the IPA API. 5 | fixes: 6 | - The "logs" inspection collector now works with the TinyIPA image. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/add-more-lan-channels-8f5197ed5f057c25.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Supports channel numbers 1 to 11 when looking for a BMC address. This is 5 | consistent with the IPMI specification v2.0. Previously, only channels 6 | 1 to 7 were considered. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/add-named-logfiles-to-burnin-4388309bf7442d53.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Add options to have named output files for the burn-in logging: 5 | {'agent_burnin_cpu', 'agent_burnin_vm', 'agent_burnin_fio_network', 6 | 'agent_burnin_fio_disk'}_outputfile. This should ease collecting 7 | the output of the burn-in steps for analysis. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/add-numa-topology-info-8c253fd9e56169f1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Adds a new optional NUMA topology collector named ``numa_topology``. 4 | It collects NUMA specific RAM, CPU and NIC information. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/add-optional-tls-support-3ab6a834154fedec.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Enables support in IPA for hosting the API server over TLS. Using this 5 | support requires setting ``[DEFAULT]listen_tls`` to True, and then setting 6 | ``[ssl]cert_file``, ``[ssl]key_file``, and optionally ``[ssl]ca_file`` to 7 | files embedded in the ramdisk IPA runs inside. 8 | 9 | -------------------------------------------------------------------------------- /releasenotes/notes/add-pci-devices-info-3f86934a505d1b31.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Adds new PCI devices collector named "pci_devices" 4 | to inspector module. 5 | Data is gathered from /sys/bus/pci/devices directory 6 | and is stored under "pci_devices" key as a dictionary 7 | containing "vendor_id" and "product_id" keys, which 8 | then will be used by the inspector to distinguish 9 | various PCI devices. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/add-portal-port-arg-6d4faec2f709c8e9.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Add new portal_port argument into iscsi.start_iscsi_target 4 | to support iscsi portal port customization. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/add-secondary-sorting-by-name-for-root-disks-4de2c0358b9a1e2c.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds secondary sorting by device name when guessing the root disk. This 5 | makes the selection process more predictable and increases the chances 6 | that systems which try only one device for booting will actually 7 | successfully boot after deployment. As the primary sorting is still done 8 | by size, the root device hints still take priority, and the current 9 | behaviour is basically not specifying the order beyond size, this change 10 | does not break backwards compatibility. 11 | -------------------------------------------------------------------------------- /releasenotes/notes/add-service-steps-support-655cc02d112ed0a8.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds a new ``service`` extension which facilitates command handling for 5 | Ironic to retrieve a list of service steps. 6 | - Adds a new base method to base HardwareManager, ``get_service_steps`` 7 | which works the same as ``get_clean_steps`` and ``get_deploy_steps``. 8 | These methods can be extended by hardware managers to permit them to 9 | signal what steps are permitted. 10 | - Extends reasonable deploy/clean steps to also be service steps which 11 | are embedded in the Ironic agent. For example, CPU, Network, and Memory 12 | burnin steps are available as service steps, but not the disk burnin 13 | step as that would likely result in the existing disk contents being 14 | damaged. 15 | -------------------------------------------------------------------------------- /releasenotes/notes/add-smart-test-to-disk-burnin-d02d31e23e5efa9a.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Add 'agent_burnin_fio_disk_smart_test' option in driver-info for disk 5 | burn-in. If set to True, this option will launch a parallel SMART self 6 | test on all devices after the disk burn-in and fail the disk burn-in 7 | clean step if any of the tests fail. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/add-support-for-bootc-70b8a4546b176ab4.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds support to Ironic-Python-Agent to facilitate deployment 5 | of bootable containers. This is an experimental feature for 6 | standalone users. Operators wishing to disable this feature, 7 | can leverage the ``[DEFAULT]disable_bootc_deploy`` option in 8 | ``ironic-python-agent.conf``. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/add-support-for-burnin-gpu-76c8c267529a18bd.yaml: -------------------------------------------------------------------------------- 1 | features: 2 | - | 3 | Add support for GPU burn-in testing using gpu-burn. 4 | -------------------------------------------------------------------------------- /releasenotes/notes/add-unit-test-cc4a1a05859ad17d.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - dmidecode output produces less parsing errors and logs 4 | common and normal output like "No Module Installed" or 5 | "Not Installed" in debug instead of error. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/add-vendor-info-56be9a8605d80bf0.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Add new 'system_vendor' information to data - Add hardware vendor 4 | information(product name, serial number, manufacturer) to data. 5 | This will be able to give Ironic Inspector hints to detect driver. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/add-vlan-interfaces-cdfeb39d0f3d444d.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds the ability to bring up VLAN interfaces and include them in the 5 | introspection report. A new kernel params field is added - 6 | ``ipa-enable-vlan-interfaces``, which defines either the VLAN interface 7 | to enable, the interface to use, or 'all' - which indicates all 8 | interfaces. If the particular VLAN is not provided, IPA will 9 | use the LLDP information for the interface to determine which VLANs should 10 | be enabled. See 11 | `story 2008298 `_. 12 | 13 | -------------------------------------------------------------------------------- /releasenotes/notes/add_burnin_cpu-9acbb36048246a6b.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds a burn-in cleaning step 'burnin_cpu' to stress test CPUs for a 5 | configurable amount of time with stress-ng. To use this step, 6 | stress-ng needs to be installed on the RAM disk. 7 | 8 | -------------------------------------------------------------------------------- /releasenotes/notes/add_burnin_disk-12adb5735a41af47.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds a burn-in cleaning step 'burnin_disk' to stress test disks for a 5 | configurable number of iterations or a configurable amount of time with 6 | fio. To use this step, stress-ng needs to be installed on the RAM disk. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/add_burnin_dynamic_network_pairing-33e398255050eb98.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | For network burn-in, nodes can now be paired dynamically via a 5 | distributed coordination backend (as an alternative to a static 6 | configuration). This allows burn-in to proceed on a "first come 7 | first served" basis with the nodes available, rather than a node 8 | being blocked since the static partner is currently delayed. 9 | 10 | In order to configure this dynamic pairing, the nodes will need 11 | at least ``agent_burnin_fio_network_pairing_backend_url`` in their 12 | ``driver_info`` (the URL for the coordination backend). In order to 13 | separate different hardware types, which may be using different 14 | networks and shall be burnt-in separately, the nodes can in 15 | addition define ``agent_burnin_fio_network_pairing_group_name`` to 16 | have pairing only happening between nodes in the same group. An 17 | additional parameter ``agent_burnin_fio_network_pairing_timeout`` allows to 18 | limit the time given to the nodes to wait for a partner. 19 | -------------------------------------------------------------------------------- /releasenotes/notes/add_burnin_memory-4099ca42bd3b99db.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds a burn-in cleaning step 'burnin_memory' to stress test memory for a 5 | configurable amount of time with stress-ng. To use this step, stress-ng 6 | needs to be installed on the RAM disk. 7 | 8 | -------------------------------------------------------------------------------- /releasenotes/notes/add_burnin_network-4856153d21c25f4a.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds a burn-in cleaning step 'burnin_network' to stress test the 5 | network interface for a configurable amount of time with fio. To 6 | use this step, fio needs to be installed on the RAM disk. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/add_erase_pstore-b109c58ed8f5d351.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds a clean step to erase the Linux kernel's pstore. The step is disabled 5 | by default. 6 | security: 7 | - | 8 | If enabled, the new clean step 'erase_pstore' removes all pstore entries 9 | (the oops/panic logs from a failing kernel) upon cleaning. This is to 10 | reduce the risk that potentially sensitive data is preserved across 11 | instantiations (and therefore different users) of a bare metal node. -------------------------------------------------------------------------------- /releasenotes/notes/add_interface_vendor_and_product-74e9815f20ee0cac.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Add 'vendor' and 'product' fields to 4 | interfaces data for future use in Ironic Inspector. -------------------------------------------------------------------------------- /releasenotes/notes/add_mellanox_hardware_manager-edfae87964737df1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Add support for Mellanox InfiniBand NICs in IPA. 4 | Each Mellanox InfiniBand interface is returned with 5 | an "InfiniBand MAC" and InfiniBand Client-ID calculated 6 | according to a Mellanox-specific translation. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/additional-wwn-hints-ffd02ceafcb3dc70.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Root device hints now also inspect ID_WWN_WITH_EXTENSION 4 | and ID_WWN_VENDOR_EXTENSION from udev. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/adds-nvme-secure-erase-0ecfd624e5f50581.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Adds support for NVMe-specific storage cleaning to IPA. Currently this is 4 | implemented by using nvme-cli format functionality. Crypto Erase is used 5 | if supported by the device, otherwise the code falls back to User Data 6 | Erase. The operators can control NVMe cleaning by using 7 | deploy.enable_nvme_erase config option which controls 8 | ``agent_enable_nvme_erase`` internal setting in driver_internal_info. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/adds-smartctl-ata-check-to-secure-erase-caebba4f25821575.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Adds an additional check if the ``smartctl`` utility is present from the 5 | ``smartmontools`` package, which performs an ATA disk specific check that 6 | should prevent ATA Secure Erase from being performed if a pass-through 7 | device is detected that requires a non-ATA command signling sequence. 8 | Devices such as these can be `smart` disk interfaces such as 9 | RAID controllers and USB disk adapters, which can cause failures 10 | when attempting to Secure Erase, which may render the disk unreachable. 11 | -------------------------------------------------------------------------------- /releasenotes/notes/advertise-address-c3b152fe475fb539.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - IPA will now advertise IP address via which the Ironic API is routed 4 | instead of using the first available. 5 | See https://bugs.launchpad.net/ironic-python-agent/+bug/1558956. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/advertise-protocol-110ae1587f727e62.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | The new kernel parameter ``ipa-advertise-protocol`` can be used to change 5 | the protocol of the callback URL to ``https``. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/agent-fully-retries-image-downloads-67409a493c6d08ae.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes deployment failures when the image download is interrupted 5 | mid-stream while the contents are being downloaded. Previously retries 6 | were limited to only opening the initial connection. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/agent-token-support-1086218cf2a0c917.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds support for the agent to receive, store, and return 5 | an ``agent token`` from the Ironic deployment to help secure 6 | use of the ironic API ``/v1/heartbeat`` endpoint, as well as 7 | the API of the ironic-python-agent ramdisk. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/agent_partition_image-91941adc6683c673.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Add support for partition images in IPA. 4 | This commit adds the ironic-lib as the 5 | requirement for the IPA package. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/allows-bootloader-install-failure-to-be-ignored-b99667b13afa9759.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds an configuration option which can be encoded into the ramdisk itself 5 | or the PXE parameters being provided to instruct the agent to ignore 6 | bootloader installation or configuration failures. This functionality is 7 | useful to work around well-intentioned hardware which is auto-populating 8 | all possible device into the UEFI nvram firmware in order to try and help 9 | ensure the machine boots. Except, this can also mean any 10 | explicit configuration attempt will fail. Operators needing this bypass 11 | can use the ``ipa-ignore-bootloader-failure`` configuration option on the 12 | PXE command line or utilize the ``ignore_bootloader_failure`` option 13 | for the Ramdisk configuration. 14 | In a future version of ironic, this setting may be able to be overridden 15 | by ironic node level configuration. 16 | -------------------------------------------------------------------------------- /releasenotes/notes/always-make-sure-config-drive-is-umounted-a3985bbb45e89051.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where configuration drive volumes which are mounted 5 | by the operating system could remain mounted and cause a lock to be 6 | held, which may conflict with actions such as ``rebuild``. 7 | The agent now always makes sure the folder used by Glean and Cloud-init 8 | is not mounted. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/append-efi-partition-to-fstab-e9f945a4dd19bd7a.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | The system file system configuration file for Linux machines, the 5 | ``/etc/fstab`` file is now updated to include a reference to the 6 | EFI partition in the case of a partition image base deployment. 7 | Without this reference, images deployed using partition images 8 | could end up in situations where upgrading the bootloader could fail. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/apply-raid-aeca7848c6320d6b.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes the return value of the ``apply_configuration`` deploy step: the 5 | ``agent`` RAID interface expects the final RAID configuration to be 6 | returned. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/ataraid_does_not_appear_as_disk-8a260e66b3496bf6.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where devices offered via ATARAID 5 | (or even software RAID setup by a hardware manager) 6 | were excluded from the list as they are not returned 7 | as type disk, even though they should be considered 8 | both disks and block devices. 9 | See `story `_ 10 | for more details. 11 | upgrade: 12 | - | 13 | Operators with custom hardware managers to support software RAID 14 | may wish to ensure that they have removed the software RAID prior 15 | to any stock cleaning step for erasing block devices executes. 16 | As a result of a bug fix, such devices may now be picked up in 17 | the list of possible devices to delete, which may extend cleaning 18 | depending on the deployment configuration. 19 | -------------------------------------------------------------------------------- /releasenotes/notes/attempts-ata-disk-unlock-897d76c494ec2976.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes the ATA Secure Erase logic to attempt an immediate unlock in the 5 | event of a failed attempt to Secure Erase. This is required to permit 6 | fallback to make use of the ``shred`` disk utility. 7 | 8 | In the event that an ATA Secure Erase operation fails during cleaning, 9 | the disk will be write locked. In this case, the disk must be explicitly 10 | unlocked. 11 | 12 | This should also prevent failures where an ATA Secure Erase operation 13 | fails with a pass-through disk controller, which may prevent the disk 14 | from being available after a reboot operation. For additional information, 15 | please see 16 | `story 2002546 `_. 17 | -------------------------------------------------------------------------------- /releasenotes/notes/auto-tls-b52b873663f35618.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | When a recent enough version of ironic is detected and ``listen_tls`` is 5 | ``False``, agent will now generate a self-signed TLS certificate and send 6 | it to ironic on heartbeat. This ensures encrypted communication from 7 | ironic to the agent. Set ``enable_auto_tls`` to ``False`` to disable this 8 | behavior. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/avoid-grub2-using-efibootmgr-bd27c0978d1cf71b.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes the workflow for wholedisk images when using UEFI boot mode, when 5 | possible it will use efibootmgr instead of grub2 to update the NVRAM. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/bandit-fixes-a971142075b29ca9.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes timeout declarations for Bandit 1.7.5 rule additions. 5 | - | 6 | Adds a new configuration option ``http_request_timeout`` 7 | to allow for operators to set the amount of time to wait 8 | for a new request socket to wait. This helps prevent prevent 9 | a possible hanged connection should the initial packets be 10 | lost in tranist. 11 | other: 12 | - | 13 | Adds a new configuration option ``http_request_timeout`` 14 | which is also accessible utilizing the kernel command line 15 | option ``ipa-http-request-timeout``. This option helps prevent 16 | failed connections from hanging the agent. The default is 30 17 | seconds. 18 | -------------------------------------------------------------------------------- /releasenotes/notes/basic-auth-for-user-image-server-150835e7567444da.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Introducing basic authentication and configurable authentication strategy 5 | support for image and image checksum download processes. This feature 6 | introduces 3 new variables that could be set (either via oslo.config or 7 | image_info) to select the authentication strategy an provide credentials 8 | for HTTP(S) basic authentication. The 3 variables are structured in way 9 | that 1 of them 'image_server_auth_strategy' (string) provides the ability 10 | to select between authentication strategies by specifying the name of 11 | the strategy. Currently the only supported authentication strategy is the 12 | 'http-basic' which will make IPA use HTTP(S) basic authentication also 13 | known as the 'RFC 7617' standard. The other 2 variables 14 | 'image_server_password' and 'image_server_user' provide username and 15 | password credentials for image download processes. The 16 | 'image_server_password' and 'image_server_user' are not strategy specific 17 | and could be reused for any username + password based authentication 18 | strategy, but for the moment these 2 variables are only used for the 19 | 'http-basic' strategy. 'image_server_basic_auth' not just enables the 20 | feature but enforces checks on the values of the 2 related credentials. 21 | When the 'http-basic' strategy is enabled for image server download 22 | workflow the download logic will make sure to raise an exception in case 23 | any of the credentials are None or an empty string. Values coming from 24 | 'image_info' are prioritized over values coming from the 'oslo.config' 25 | framework and the 2 different credential source can't be mixed. Passing 1 26 | or 2 out of the 3 from and source and the remaining values from an other 27 | source will result in a exception. 28 | -------------------------------------------------------------------------------- /releasenotes/notes/bindmount-run-4c6a31d3ee4e0ed6.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Mounts ``/run`` into chroot when installing bootloader to prevent timeouts. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/block-device-hctl-e81573812be3d469.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Add HCTL (Host, Channel, Target and Lun) information to the block 4 | devices. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/bmc-mac-introspection-e4c2e203d8529710.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | The introspection now includes the MAC address of the IPMI LAN channel 5 | which has a valid IP address and MAC address assigned in the hardware 6 | inventory data as ``bmc_mac``. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/bmo-extra-147559c8d1776e8c.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | The hardware inventory now contains information about the system firmware: 5 | vendor, version and the build date. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/boot-info-f18336ada089f6dd.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Introduced "boot" field into the inventory, with "current_boot_mode" and 4 | "pxe_interface" fields. Both will be used for inspection. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/bootloader-ignored-uefi-mode-8578a009d5b5be62.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue with deployment ramdisks running in UEFI boot mode where 5 | dual-boot images may cause the logic to prematurely exit before UEFI 6 | parameters can be updated. Internal checks for a BIOS bootloader will 7 | always return ``False`` now when the machine is in UEFI mode. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/bug-2010123-d4c38d8f6606d0e0.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where arguments were not passed to clean steps when 5 | a manual cleaning operation was being executed. The arguments are 6 | now passed in appropriately. -------------------------------------------------------------------------------- /releasenotes/notes/build-tinyipa-with-python3-d4a64aa18f970968.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | other: 3 | - Updates the tinyipa build scripts to support building and running Ironic 4 | Python Agent with Python 3. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/build-tinyipa-with-tinycore8-b39d0415b1c25f6b.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | other: 3 | - Updates the tinyipa build scripts to TinyCoreLinux 8.x 4 | -------------------------------------------------------------------------------- /releasenotes/notes/bumpsipalookupattempts-29de7c949aaf6556.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | other: 3 | - | 4 | Increases the default value for the ``ipa-ip-lookup-attempts`` kernel 5 | argument to 6, adding extra time for networking to be set up before giving 6 | up. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/cache-image-removal-3b5a80a6038a320b.yaml: -------------------------------------------------------------------------------- 1 | deprecations: 2 | - Removed the partial-implementation of image caching. This method was never 3 | used by Ironic, and was a vestige of a feature which was never completed. 4 | Image caching, if it were to be implemented today, would not use this 5 | method anyway. -------------------------------------------------------------------------------- /releasenotes/notes/capture-early-logging-0f3fa58d75656117.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes initial logging before configuration is loaded to re-log anything 5 | recorded for the purposes of troubleshooting. This is necessary as systemd 6 | does not report stdout from a process launch as part of the process's 7 | logging. Now messages will be re-logged once the configuration has been 8 | loaded. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/change-heartbeat-method-d0119406137022e3.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | IPA heartbeat intervals now rely on accurate clock time. Any clean or 5 | deploy steps which attempt to sync the clock may cause heartbeats to not 6 | be emitted. IPA syncs time at startup and shutdown, so these steps should 7 | not be required. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/check-for-ipmi-device-before-invocation-45b00d15c94edd00.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Adds a preliminary check for IPMI device files before the BMC detection 5 | attempts, optimizing `ipmitool` command calls on systems without IPMI 6 | capabilities. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/check-if-ESP-is-mounted-f9e0eff3609c2668.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue with bootloader installation on a software RAID by 5 | checking if the ESP is already mounted. 6 | 7 | 8 | -------------------------------------------------------------------------------- /releasenotes/notes/check-partition-table-after-writing-34efbd557d8de7cb.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes a bug with bad whole disk images and config drives, where we would 5 | attempt to write a config drive partition to the disk without a valid 6 | partition table. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/check-virtual-media-devices-a9b1f54c3fe7884d.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | security: 3 | - | 4 | Addresses a potential vector in which an system authenticated malicious 5 | actor could leveraged data left on disk in some limited cases to make the 6 | API of the ``ironic-python-agent`` attackable, or possibly break cleaning 7 | processes to prevent the machine from being able to be returned to the 8 | available pool. Please see `story 2008749 `_ 9 | for more information. 10 | fixes: 11 | - | 12 | Adds validation of Virtual Media devices in order to prevent existing 13 | partitions on the system from being considered as potential sources of IPA 14 | configuration data. 15 | - | 16 | Adds check into the configuration load from virtual media, to ensure it 17 | only occurs when the machine booted from virtual media. 18 | issues: 19 | - | 20 | Logic around virtual media device validation is now much more strict, 21 | and may not work in all cases. Should you discover a case, please provide 22 | the output from ``lsblk -P -O`` with a virtual media device attached to the 23 | Ironic development community via 24 | `Storyboard `_. 25 | - | 26 | Internal logic to copy configuration data from virtual media now requires 27 | the ``boot_method=vmedia`` flag to be set on the kernel command line of 28 | the bootloader for the virtual media. Operators crafting custom boot 29 | ISOs, should ensure that the appropriate command line is being added in 30 | any custom build processes. 31 | -------------------------------------------------------------------------------- /releasenotes/notes/checksum-before-considering-download-completed-91cca9fef34d8cf5.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes a failure case where downloads would not be retried when the 5 | checksum fails verification. the agent now includes the checksum 6 | activity as part of the file download operation, and will 7 | automatically retry downloads when the checksum fails in 8 | accordance with the existing download retry logic. 9 | This is largely in response to what appears to be intermittent 10 | transport failures at lower levels which we cannot otherwise 11 | detect. 12 | -------------------------------------------------------------------------------- /releasenotes/notes/clarify-heartbeat-connection-errors-2af152bf2d7928e2.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | other: 3 | - | 4 | Adds an explicit capture of connectivity failures in the heartbeat 5 | process to provide a more verbose error message in line with what is 6 | occurring as opposed to just indicating that an error occurred. This 7 | new exception is called ``HeartbeatConnectionError`` and is likely only 8 | going to be visible if there is a local connectivity failure such as a 9 | router failure, switchport in a blocking state, or connection centered 10 | transient failure. 11 | -------------------------------------------------------------------------------- /releasenotes/notes/clean_uefi_nvram-554041f2e7b2d555.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds a deploy step ``clean_uefi_nvram`` to remove unrequired extra UEFI 5 | NVRAM boot entries. By default any entry matching ``HD`` as the root device, 6 | or with a ``shim`` or ``grub`` efi file in the path will be deleted, 7 | ensuring that disk based boot entries are removed before the new entry is 8 | created for the written image. The ``match_patterns`` parameter allows a 9 | list of regular expressions to be passed, where a case insensitive search in 10 | the device path will result in that entry being deleted. -------------------------------------------------------------------------------- /releasenotes/notes/clock-skew-1fbf542b193cec17.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Automatically generated TLS certificates now have their validity starting 5 | in the past (1 hour by default) to allow for clock skew. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/coalesce_heartbeats-fb8899a5f9fe4709.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Heartbeats to the conductor are grouped when they are scheduled or 5 | requested within a time interval of five seconds to avoid sending 6 | them in quick succession. 7 | fixes: 8 | - | 9 | Fixes an issue where a quick succession of heartbeats exposes a race 10 | condition in the conductor's RPC handling. 11 | -------------------------------------------------------------------------------- /releasenotes/notes/collect-cpu-sockets-0dbc09a1ebccfe77.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Add support for collecting the cpu socket number. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/collect-dmi-output-f2e9feabef16bacf.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Adds a new optional dmidecode output collector called ``dmi-decode``. 4 | It collects dmi output for BIOS, processor and memory information. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/collect-manager-a80bcf370048eeec.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Ramdisk log collection now uses the hardware managers mechanism. You can 5 | provide a `collect_system_logs` call to extend the collection process. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/collect-more-8bc9ad4c63e873e1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | other: 3 | - | 4 | The output of ``lsblk`` and the contents of ``/proc/mdstat`` are now 5 | collected with the ramdisk logs for debugging. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/collect-udev-f6ada5163cf4a26c.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | other: 3 | - | 4 | Block devices properties reported by udev are now collected with the 5 | ramdisk logs. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/command_params-869fa547b5be2236.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | The command params no longer appear in the command results. See `story 5 | 2008904 `_ for details. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/configdrive-dup-3fc46a878fe82485.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | other: 3 | - | 4 | The API call ``prepare_image`` and the deploy step ``write_image`` 5 | will now expect configdrive to be passed as an explicit argument 6 | rather than through ``image_info``. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/configdrive-partuuid-3259cfb7428c1483.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | issues: 3 | - | 4 | Creating a configdrive partition on a devicemapper device (e.g. a multipath 5 | storage device) with MBR partitioning may fail with the following error:: 6 | 7 | Command execution failed: Failed to create config drive on disk /dev/dm-0 8 | for node 168af30d-0fad-4d67-af99-b28b3238e977. Error: Unexpected error 9 | while running command. 10 | 11 | Use GPT partitioning instead. 12 | fixes: 13 | - | 14 | Fixes creating a configdrive partition on a devicemapper device (e.g. 15 | a multipath storage device) with GPT partitioning. The newly created 16 | partition is now detected by a pre-generated UUID rather than by comparing 17 | partition numbers. 18 | -------------------------------------------------------------------------------- /releasenotes/notes/configdrive-ssl-02b069948dfef814.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | No longer ignores global TLS configuration options (``ipa-insecure``, etc) 5 | when downloading a configdrive via a URL. 6 | - | 7 | No longer ignores error status codes from the server when downloading 8 | a configdrive via a URL. 9 | - | 10 | The configdrive downloading code now respects the 11 | ``ipa-image-download-connection-timeout`` option and will no longer hang 12 | for a long time if the server does not respond. 13 | -------------------------------------------------------------------------------- /releasenotes/notes/container-poweroff-d9ffb637cf1cee6c.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes fall-back to sysrq when powering off or rebooting the node from 5 | inside a container. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/content-type-f4d5ab15adf37252.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes missing ``Content-Type`` header when sending inspection data back 5 | to ironic-inspector or ironic. While ironic-inspector tolerates the 6 | missing header, it may cause issues with the new inspection implementation. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/coreos-uses-chroot-8a01ba0b38a4a4f4.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - CoreOS image builder now runs IPA in a chroot, instead 4 | of a container. systemd-nspawn has been adding more 5 | security features that break several things IPA needs 6 | to do (after all, IPA manipulates hardware), such as 7 | using sysrq triggers or writing to /sys. 8 | upgrade: 9 | - Now that IPA runs in a chroot, any operator tooling 10 | built around the container may need to change (for 11 | example, methods of getting a shell inside the container). 12 | -------------------------------------------------------------------------------- /releasenotes/notes/coreos_ipa_image_poweroff_reboot_in_chroot_by_sysrq-42447fc4cdd7dafe.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Fixes a bug in the CoreOS IPA images (where IPA runs in a chroot), where 4 | IPA could not power off or reboot properly. In this case, it will now use 5 | SYSRQ commands to forcefully reboot or power off. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/correct-uefi-regex-112211c2427cd4d9.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes a minor issue with the regular expression used for UEFI duplicate 5 | entry cleanup which was introduced in a prior change to refactor the 6 | cleanup operation to avoid UEFI firmware which treats deletion of 7 | entries after addition as an invalid operation. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/correction-failure-output-when-downloading-image-39f93838d1ed2928.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Shows correct output message when IPA fails to download image. 4 | -------------------------------------------------------------------------------- /releasenotes/notes/cpu-flags-e3cec7e5cba069ef.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Return CPU flags with the CPU inventory. 4 | -------------------------------------------------------------------------------- /releasenotes/notes/create_raids_with_volume_name-93e0bb59ef210fe4.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Software RAID devices are built with the `--name` option 4 | followed by volume name if it is defined in target raid config 5 | and an internal ID otherwise. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/de-duplicate-by-label-baa090c5b1bff992.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes cases where duplicates may not be found in the UEFI 5 | firmware NVRAM boot entry table by explicitly looking for, and deleting 6 | for matching labels in advance of creating the EFI boot loader entry. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/deprecate-and-vendor-metrics-1df0ca4c865613f8.yaml: -------------------------------------------------------------------------------- 1 | deprecations: 2 | - | 3 | Ironic Python Agent has had limited capabilities to emit metrics, but was 4 | unable to support prometheus exporting of those metrics, as was possible 5 | for the conductor. Support for sending these metrics will be removed during 6 | or after the 2026.1 OpenStack release cycle. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/deprecate-coreos-8b01bcf796c0dc54.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | deprecations: 3 | - | 4 | Ironic community provided CoreOS IPA images are deprecated. These images 5 | utilize contents that are injected into CoreOS images which utilize a 6 | chroot environment to enable full and unrestricted hardware access. 7 | 8 | This decision is not taken lightly, and is due to multiple constraints 9 | combined with technical changes over time as CoreOS has evolved. 10 | 11 | Per the `CoreOS limitations `_, 12 | as of January 2019, CoreOS: 13 | 14 | 1) Current CoreOS images require 2GB of RAM to operate. 15 | As a result of the RAM requirement, it is problematic for continuous 16 | integration testing to occur with the CoreOS based Ironic-Python-Agent 17 | image in OpenStack testing infrastructure. 18 | 19 | 2) UEFI is not a supported configuration. CoreOS details the required 20 | use of BIOS compatibility mode. Intel is anticipated to remove 21 | BIOS compatibility by `2020 `_. 22 | 23 | 3) CoreOS is moving to require container use via passing ignition 24 | configuration. Limitations explicitly state there are no strait-forward 25 | methods of passing ignition configuration to a CoreOS instance. Mainly the 26 | developed intent is for such data to be passed in via a metadata service or 27 | configuration drive. 28 | 29 | 4) With the previously mentioned use of containers and ignition 30 | configuration, the OEM loading path previously used with CoreOS 31 | is no longer available moving forward as it has been changed to read 32 | ignition `configuration files `_. 33 | -------------------------------------------------------------------------------- /releasenotes/notes/detect-endianness-f53a6c4571aba3fe.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | In case the CSV file used for the bootloader hint does not have BOM 5 | we fail reading its content as utf-16 codec is too generic. 6 | Fail over to utf-16-le as Little Endian is mostly used. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/device-hints-from-node-object-9a689f5a4175a1a6.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - IPA now gets the root device hints directly from the node object 4 | representation instead of the kernel command line. This is a required 5 | work in order to support a more complex syntax for the hints in 6 | the future. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/disable-md5-image-checksum-7def176928d36e75.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | The ``ironic-python-agent`` will now attempt to determine a checksum type 5 | by evaluating the length of the supplied checksum. This allows SHA512 6 | (SHA-2) and SHA256 (SHA-2) checksums to be identified and utilized without 7 | an explicit declaration of the checksum type utilizing the 8 | ``os_hash_algo`` value. 9 | deprecations: 10 | - | 11 | Support for MD5 checksums have been deprecated and will be removed after 12 | the 2024 Release. 13 | -------------------------------------------------------------------------------- /releasenotes/notes/discover-ipv6-bmc-address-b3b357ff6c5d822c.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | IPv6 BMC address is now discovered during inspection and sent as a new 5 | ``bmc_v6address`` inventory field. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/disk-label-fix-536897e41a4d817f.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Fixes bug where the user specified disk_label 4 | is ignored with partition images in agent 5 | drivers. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/disk-wait-2e0e85e0947f80e9.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - On start up wait up to 30 seconds for the first disk device suitable for 4 | deployment to appear. This is to fix both inspection and deployment on 5 | hardware that takes long to initialize (e.g. some RAID devices). 6 | -------------------------------------------------------------------------------- /releasenotes/notes/drop-python2-2006fd8a4a6de56d.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | Python 2.7 support has been dropped. Last release of 5 | ironic-python-agent to support Python 2.7 is OpenStack Train. The 6 | minimum version of Python now supported by ironic-python-agent is 7 | Python 3.6. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/efi-partuuid-5fe933a462eeede1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes configuring UEFI boot when the EFI partition is located on a 5 | devicemapper device. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/enable-cleaning-fallback-57e8c9aa2f24e63d.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - The driver_internal_info internal setting 4 | ``agent_continue_if_ata_erase_failed`` allows operators 5 | to enable disk cleaning operations to fallback from a failed 6 | ata_erase operation to disk shredding operations. 7 | fixes: 8 | - IPA will now attempt to unlock a security locked drive 9 | with a 'NULL' password if it is found to be enabled, 10 | however this will only work if the password was previously 11 | set to a 'NULL' value, such as if a failure during a previous 12 | ata_erase sequence. 13 | - Potential command failures in the secure erase process are 14 | now captured and raised as BlockDeviceEraseError exceptions. 15 | -------------------------------------------------------------------------------- /releasenotes/notes/enable-skipping-disks-0c4c8b72231715a1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Users can specify a list of devices to be skipped during the cleaning 5 | process or be chosen as the root device in property field 6 | ``skip_block_devices``. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/enable-skipping-raids-40263cc3a19cfd27.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - The node property ``skip_block_devices`` supports 4 | specifying volume names of software RAID devices. 5 | These devices are not cleaned during cleaning and 6 | are not created provided they already exist. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/enhance-checksum-2256ffdcce13836e.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds enhanced checksum support to IPA. When ``os_hash_algo`` and 5 | ``os_hash_value`` are passed in via ``image_info`` (from the node's 6 | ``instance_info``), they will be used for image checksum calculation and 7 | verification. The md5 checksum is used if this information is absent. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/erase-deploy-step-3e952fa863bca908.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | The ``deploy.erase_devices_metadata`` clean step can now also be used as 5 | a deploy step. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/erase-device-metadata-clean-step-31b4a615c0ff7f18.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Add a new cleaning step called "erase_devices_metadata" to the generic 4 | hardware manager which is responsible for destroying the metadata 5 | on the disk devices (partition tables, signatures, file-system 6 | identifications, etc...). 7 | -------------------------------------------------------------------------------- /releasenotes/notes/erase_metadata_from_partitions-4f1902533d530b8f.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Erases metadata on disk partitions to prevent the Linux kernel from 5 | automatically recreating storage entities (e.g. LVM, RAID) described by the 6 | metadata. The Hardware Manager API was correspondingly modified to 7 | optionally include partitions when listing block devices. See `story 8 | 2003673 `_ for details. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/eventlet-removal-1bd8c6c2d5f8a765.yaml: -------------------------------------------------------------------------------- 1 | fixes: 2 | - | 3 | Eventlet support in OpenStack is deprecated, and the oslo libraries used 4 | by Ironic Python Agent is deprecating support for eventlet in 2026.2. 5 | This change removes the use of eventlet directly and ensures none of our 6 | libraries are using eventlet-based code. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/executes-gpt-partition-fix-b6156cc16da00dfc.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where secondary GPT partition tables were not being updated 5 | after the ``ironic-python-agent`` wrote the disk image to the target disk. 6 | The agent now unconditionally attempts to repair the secondary partition 7 | table. Previously, software RAID volumes would report errors upon restart. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/extend-ipa-lookup-timeout-05ee5b1372792dbe.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | The default timeout value for the agent to lookup itself in an Ironic 5 | deployment has been extended to 600 seconds from 300 seconds. This is 6 | to provide better stability for Ironic deployments under heavy load 7 | which may be unable to service new requests. This is particularly true 8 | when the backing database is SQLite for Ironic due to the limited write 9 | concurrency of the database. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/extend-pci-metric-5482284d6a9fe765.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Introspection of PCI devices now collects PCI class, revision and PCI bus. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/extend-retry-timeout-30c930a33d97c193.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes the short timeout retries interval, which was previously ``5`` 5 | seconds, to a length that will allow the agent to retry after a 6 | network interruption. The time between retries is now ``10`` seconds, 7 | and the number of retries are set to ``9`` to help ensure intermittent 8 | network outages do not cause recoverable failures. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/fail_ipa_start_if_ironic_api_invalid-7b78fcaba2141cc5.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Values of ``ipa-api-url`` specified in the configuration 4 | file that do not start with either ``https://`` or ``http://`` are no 5 | longer accepted. 6 | Such values lead to failure while contacting ironic-api. 7 | Such misconfigurations will be detected on ironic-python-agent start. 8 | An exception will be raised and an error about the invalid value 9 | will be logged. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/fallback-to-findfs-59abde55221e1e84.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue with the tinyIPA CI testing image by providing a fallback 5 | root volume uuid detection method via the ``findfs`` utility, which is 6 | also already packaged in most distributions with ``lsblk``. 7 | 8 | This fallback was necessary as the ``lsblk`` command in ``TinyCore`` Linux, 9 | upon which TinyIPA is built, does not return data as expected for 10 | volume UUID values. 11 | -------------------------------------------------------------------------------- /releasenotes/notes/fasttrack-stale-cache-fd93b56a955c7ab1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue with nodes undergoing fast-track from introspection to 5 | deployment where the agent internal cache of the node may be stale. 6 | In particular, this can be observed if node does not honor a root device 7 | hint which is saved to Ironic's API *after* the agent was started. 8 | More information can be found in `story 2008039 9 | `_. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/feature-2010228-cf3a59b88f07c3a7.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Add two clean steps MellanoxDeviceHardwareManager to update 5 | NVIDIA NICs firmware images and settings, 6 | * update_nvidia_nic_firmware_image 7 | * update_nvidia_nic_firmware_settings 8 | -------------------------------------------------------------------------------- /releasenotes/notes/fetc-checksum-support-additional-format-4b29c5cdaa6b8d16.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Improved parsing of checksum files. 5 | 6 | * Added support for the ``ALGORITHM (FILENAME) = CHECKSUM`` format used by 7 | CentOS Stream. 8 | * Lines starting with ``#`` are ignored as comments. 9 | * If checksum file contain only the checksum itself, the content is 10 | validated to ensure it is one of the known checksum types. 11 | 12 | -------------------------------------------------------------------------------- /releasenotes/notes/findbonds-733c7c91a5665b05.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes GenericHardwareManager to find network information 5 | for bonded interfaces if they exist. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-agent-determination-of-partition-table-type-3c78bf78266e8cef.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes the agent process for determining what partition label type to 5 | utilize when writing partition images. In many cases, this could fallback 6 | to ``msdos`` if the instance flavor was not properly labeled. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-agent-unable-to-stop-py3-6c210793476968d1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Fixes an issue where the ironic-python-agent is not able to stop when 4 | running with python3.x. 5 | 6 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-auxillarly-node-lookup-argument-83d3f717c039e454.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes a minor incorrect keyword argument that was 5 | matching between the method caller and the unit test but 6 | not the actual method, unit test, and caller. This was 7 | a non-fatal issue, and should now permit the agent to 8 | attempt to lookup the node one last time before deploying 9 | the instance image to pick-up a root device hint. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-bmc-ip-detection-for-coreos-483be0286593e393.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes detection of IPMI address in CoreOS-based images, by ensuring that 5 | parsing of ``ipmitool`` output is compatible with the bundled 6 | implementation of ``awk`` (``mawk``). 7 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-boot-mode-for-partition-images-f96cf2b3c27b6533.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes issue where the running system operating mode was not taken into 5 | account when writing partition images. The agent now utilises a helper 6 | instead of explicitly expecting the flavor derived information to 7 | supply all deployment context. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-bootloader-install-with-mdraid-0a254035df9d0bed.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where the bootloader installation can fail on a software 5 | RAID volume when no root_device hint is set. 6 | See `Story 2007905 7 | `_ 8 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-bytes-json-serializable-collected-logs-ad61022b287dc3e2.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Fixes JSON serialization of logs by encoding them as text instead of byte 4 | strings in IPA. This works for py2.7 as well as py3. See 5 | https://bugs.launchpad.net/ironic-python-agent/+bug/1668533 for details. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-clean-config-for-full-device-28ee09b58d97d122.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - IPA will now successfully clean configuration when it encounters a software 4 | RAID array that was previously created using entire devices instead of 5 | partitions. -------------------------------------------------------------------------------- /releasenotes/notes/fix-cleaning-read-only-device-c8a0f4cc2f434d99.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where metadata erasure cleaning would fail on devices 5 | that are read-only at the hardware level. Typically these are virtual 6 | devices being offered to the operating system for purposes like OS 7 | self-installation. 8 | 9 | In the case of full device erasure, this is explicitly raised as 10 | a hard failure requiring operator intervention. 11 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-coreos-modprobe-75bda45c7bbeb469.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Fixes detection of IPMI address in the CoreOS-based images 4 | by loading IPMI modules before going into chroot. -------------------------------------------------------------------------------- /releasenotes/notes/fix-hardcoded-path-to-grub-7006f29a9ef72e75.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Uses the ``PATH`` environment variable to get the grub2 binary location 4 | instead of assuming it to be ``/usr/sbin``. This fixes installing a boot 5 | loader when the grub2 binary is located somewhere else. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-high-cpu-usage-eventlet-1dccf3b81dd42c47.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue with high cpu usage caused by ironic-python-agent greenthread 5 | eventlent implementation. 6 | 7 | Using eventlet.sleep(0.1) instead of eventlet.sleep(0) gives other processes 8 | of IPA more cpu time to run. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-iscsi-teardown-handling-0df2345318d3c843.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue in fallback error handling where native iSCSI controls 5 | are unavailable due to the composition of the IPA ramdisk and where direct 6 | ``tgtadm`` commands also fails. 7 | 8 | Before fallback error handling was added, the teardown was skipped 9 | completely in the event of the native iSCSI controls being unavailable. 10 | The end user behavior is now as it was previously prior to the fallback 11 | error handling being added, but IPA will still continue to attempt to 12 | clean up the iSCSI session. 13 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-local-boot-for-partition-images-755f570dc0982868.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | IPA now properly checks if the root partition is already mounted. 5 | See `Story 2008631 6 | `_ 7 | for details. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-mac-permaddr-0bc7d688eee4b814.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes IPA collecting the effective MAC address of NICs instead of the 5 | pesistent MAC address. In case it fails to fetch the persistent address 6 | falls back to effective MAC address. 7 | See https://bugs.launchpad.net/ironic-python-agent/+bug/2103450 for 8 | details. 9 | 10 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-mlnx-hardware-mgr-never-run-72072580be4d6e7a.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue with the IntelCnaHardwareManager which prevented hardware 5 | managers with lower priority to be executed and therefore may blocked the 6 | initialization and collection of hardware these managers are supposed to take 7 | care of. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-multipath-parent-device-e85afad63159250c.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fix the logic to detect the right parent device for a given multipath 5 | device. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-nic-without-numa-node-b401f97c46afa4a1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Skips NIC ``numa_node`` discovery if it's not assigned to a numa_node as 5 | in some rare case, such as a VM with virtual NUMA node, NICs might 6 | not be in a NUMA node and this breaks ``numa-topology`` discovery. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-nvidia-hw-mgr-https-38825a4161a8561b.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes the nvidia hardware manager firmware upgrade support to permit 5 | URLs with an "https" schema. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-nvme-partition-image-handling-b8487133a188fd32.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an error with UEFI based deployments where using a partition image 5 | a NVMe device was previously failing due to the different device name 6 | pattern. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-nvme-software-raid-race-2e0e104de9611228.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes a race on software RAID creation: since the creation of 5 | partitions is asynchronous, we need to wait for all udev events 6 | to be processed before we can use the partitions to create an 7 | md device. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-physical-memory-arm64-957755f6cd91ad85.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes detection of physical memory amount on AArch64 that was caused by 5 | different output of the ``lshw`` utility. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-raid-volume-name-ac9013e7b5cf3d46.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | The use of md_device as the default volume name if the volume name of a RAID 5 | array hasn't been specified caused a 'Not POSIX compatible' error. 6 | This has been fixed by using just the last part of the md_device. 7 | Fixes https://bugs.launchpad.net/ironic-python-agent/+bug/2073406 8 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-raid_device-not-set-8b03688ce83ce22e.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes referencing to raid_device variable before assignment, 5 | is replaced by blk variable. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-rescan-device-7b00c6836b687ce8.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where partitions are not visible due to an incorrect call 5 | when re-reading the partition table during a device rescan. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-rescan-device-raid-29aa1558b036b496.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where partitions are not visible due to an 5 | incorrect call to have the partition table re-read during raid 6 | configuration creation. 7 | 8 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-softraid-name-poisoning-4e934dd4e60830b1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes handling of Software RAID device discovery so RAID device ``Names`` 5 | and ``Events`` field values do not inadvertently cause the command to 6 | return unexpected output. Previously this could cause a deployment to 7 | fail when handling UEFI partitions. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-to-pass-root-uuid-for-whole-disk-image-1c13b70f6b74bce0.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Now correctly returns ``root_uuid`` as part of command status when 5 | provisioning a whole disk image using the ``direct`` deploy interface. See 6 | `bug 1713916 `_ for details. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-uefi-boot-entry-creation-for-aarch64-2b143c5bf189c2f6.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fix UEFI boot entry creation for aarch64 when using diskimage-builder 5 | created whole disk images. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/fix-vfd-mount-for-capitalized-device-name-db7f519e900f4e22.yaml: -------------------------------------------------------------------------------- 1 | fixes: 2 | - This enables virtual media deploy even if virtual floppy device 3 | name is capitalized to "/dev/disk/by-label/IR-VFD-DEV". see 4 | https://bugs.launchpad.net/ironic/+bug/1541167 for details. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/fix_chronyd_time_sync-626a14b66ca37677.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where the NTP time sync at the IPA startup via chronyd is 5 | not immediate (which can break time sensitive components such as the 6 | generation of a TLS certificate). 7 | -------------------------------------------------------------------------------- /releasenotes/notes/fix_efi_uuid_fstab-f2edbee9bfbac64a.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue when the EFI partition UUID is not set and an attempt 5 | to edit /etc/fstab is made. 6 | 7 | -------------------------------------------------------------------------------- /releasenotes/notes/fix_errors_in_erase_devices_express-f425c76b485a875f.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Prevent the UnboundLocalError in erase_devices_express, 5 | for example, on a disk failure. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/fix_partition_cleanup-46491861c930db12.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes a bug where the partitions created during software RAID setup are cleaned 5 | too early and therefore may prevent the proper cleaning of the md superblocks. 6 | Leaving superblocks behind will impact the creation of new md devices later on. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/fixes-agent-lookup-retries-1b4bb90b8e783aca.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes retry logic issues with the Agent Lookup which can result in 5 | the lookup failing prematurely before being completed, typically 6 | resulting in an abrupt end to the agent logging and potentially 7 | weird errors like TypeError being reported on the agent process 8 | standard error output. For more information see 9 | `bug 2007968 `_. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/fixes-centos-fedora-grub2-mkconfig-hang-fe22cde231994044.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where deployments of Fedora or Centos can hang when 5 | using grub2 with the execution of the ``grub2-mkconfig`` command 6 | not returning before the deployment process times out. This is 7 | because ``grub2-mkconfig`` triggers ``os-prober`` which can 8 | take an extended period of time to evaluate additional unrelated 9 | devices for dual-boot scenarios. Since operators are not dual 10 | booting their machines enrolled in ironic, it seems like an 11 | un-necessary scan and has thus been disabled. 12 | -------------------------------------------------------------------------------- /releasenotes/notes/fixes-efibootmgr-character-encoding-19e531ba694824c1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes UEFI NVRAM record handling with efibootmgr so we can accept and 5 | handle UTF-16 encoded data which is to be expected in UEFI NVRAM as 6 | the records are UTF-16 encoded. 7 | - | 8 | Fixes handling of UEFI NVRAM records to allow for unexpected characters 9 | in the response, so it is non-fatal to Ironic. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/fixes-error-handling-of-efibootmgr-not-present-in-ramdisk-f11b4241edcf0e81.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes error handling if efibootmgr is not present in ramdisk. 5 | See `story `_ 6 | for more details. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/full-sync-d2ec6b248a73f04a.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | When synchronizing the disk caches at the end of a deployment, the agent 5 | now also instructs the kernel to drop the virtual memory caches and 6 | tells each block devices to sync its internal cache. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/get-holder-disks-with-nvme-7d5fa75df2fd5904.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where md devices disk holders could not be listed 5 | correctly if they were NVMe drives. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/get-physical-memory-535a32362bcdf83a.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue with retrieving all available physical memory. 5 | For more details see 6 | `story 2005308 `_. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/get_md_components_by_uuid-7f08d423ea9e7c94.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Detects md component devices by their UUID, rather than by scanning the 5 | output of mdadm. This will prevent that devices miss md superblock 6 | cleanup when they are currently not part of an array. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/get_numa_node-eeab34a92739b6f6.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Adds numa_node id when collecting pci device info during inspection. 4 | -------------------------------------------------------------------------------- /releasenotes/notes/handle-configdrive-large-disks-3517e9fcf16c7f39.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Fixes configdrive creation for MBR disks greater than 4 | 2TB. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/handle-fd0-devices-3d1f31c3b34819e8.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes cleaning operations when floppy disk devices are present on the 5 | baremetal node. Floppy disk devices are now explicitly ignored. 6 | other: 7 | - | 8 | The default ``list_all_block_devices`` hardware manager method has been 9 | changed to ignore floppy disk devices, introducing an argument 10 | ``ignore_floppy`` with a default value of ``True``. 11 | A value of ``False`` may be passed to the ``list_all_block_devices`` 12 | method to include such devices. 13 | -------------------------------------------------------------------------------- /releasenotes/notes/handle-partuuid-for-fstab-e0aadea20a056982.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes handling of a Partition UUID being returned instead of a 5 | Partition's UUID when the OS may not return the Partition's UUID in time. 6 | These two fields are typically referred to as PARTUUID and UUID, 7 | respectively. Often these sorts of issues arise under heavy IO load. 8 | We now scan, and identify which "UUID" we identified, and update 9 | a Linux fstab entry appropriately. For more information, please see 10 | `story #2009881 `_. 11 | -------------------------------------------------------------------------------- /releasenotes/notes/handle-ssl-063a91fb7bdcf9b9.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Ironic Python Agent can now access other services 4 | (Ironic, Inspector, image backend) when those are configured with 5 | HTTPS endpoints and use custom server certificates or require 6 | client certificates. 7 | It is possible to add a custom Certificate Authority (CA) file and client 8 | certificate files to the deploy ramdisk during build, 9 | and provide paths to those as corresponding new options 10 | in the ``ironic_python_agent.conf`` configuration file. 11 | Validation of the server certificate can be turned off with the 12 | ``insecure`` config option or via the ``ipa-insecure`` kernel boot 13 | parameter. 14 | This should make it possible to run IPA in CI-like environments that use 15 | HTTPS endpoints with self-signed certificates. 16 | 17 | -------------------------------------------------------------------------------- /releasenotes/notes/heartbeat-jitter-620bbcba591d2894.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Adds random jitter to retried heartbeats after Ironic returns an error. 5 | Previously, heartbeats would be retried after 5 seconds, potentially 6 | causing a thundering herd problem if many nodes fail to heartbeat at 7 | the same time. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/ignore-grub-efi-fail-dcf7eb07f61f4388.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Recent releases of redhat grub2 will always fail when installing to EFI 5 | paths, to encourage a transition to the signed shim bootloader. Partition 6 | image deploys avoid calling grub2-install with the preserve-efi-assets 7 | functions. Deploying whole disk images doesn't require grub2-install. This 8 | leaves whole disk images installed onto softraid devices, which still calls 9 | grub2-install. Running grub2-install is still attempted in this one 10 | remaining case, but any failures are now ignored. -------------------------------------------------------------------------------- /releasenotes/notes/image-checksum-39b2ceef40933c28.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Allows image checksum to be a URL pointing at a file with the image 5 | checksum or several checksums. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/image-download-retries-65ac31fe4328e438.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Provides timeout and retries when establishing a connection to download 5 | an image in the ``standby`` extension. Reduces probability of an image 6 | download getting stuck in the event of network problems. 7 | 8 | The default timeout is 60 seconds and can be set via the 9 | ``ipa-image-download-connection-timeout`` kernel parameter. The default 10 | number of retries is 2 and can be set via the 11 | ``ipa-image-download-connection-retries`` parameter. 12 | -------------------------------------------------------------------------------- /releasenotes/notes/improve-tgtd-status-d17173dc8f67959f.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Makes tgtd ready status detection more robust. 4 | -------------------------------------------------------------------------------- /releasenotes/notes/inject-files-b411369ce6856dac.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds a new deploy step ``deploy.inject_files`` to inject arbitrary files 5 | into the instance. See `the hardware managers documentation 6 | `_ 7 | for details. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/inspect-to-clean-b3616d843775c187.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Speeds up going from inspection to cleaning with fast-track enabled by 5 | caching hardware information between the steps. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/inspect-url-15547d48432cd2b5.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | When the new Ironic built-in inspection is used, 5 | ``ipa-inspection-callback-url`` can now be automatically derived from 6 | ``ipa-api-url``. In this case, inspection will be enabled if the 7 | ``ipa-inspection-collectors`` option is set. 8 | upgrade: 9 | - | 10 | If you currently set the ``ipa-inspection-collectors`` option without 11 | setting ``ipa-inspection-callback-url``, it will now cause inspection 12 | to run. Update your boot configuration to only supply the collectors 13 | when inspection is desired. 14 | -------------------------------------------------------------------------------- /releasenotes/notes/inspection-409-69d5bd6c2a49d2ec.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Inspection is now retried on HTTP 409 (conflict), which can be returned 5 | by the new implementation in Ironic. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/inspection-to-report-disk-by-path-e3fd4c331d200903.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Adds the new field ``by_path`` to disks in the inventory. Its value is 4 | the full device path, in the form ``/dev/disk/by-path/``. 5 | 6 | With ``ironic-lib`` version 2.11 or newer it is possible to use this field 7 | in root device hints. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/inspection-wait-for-ips-223e39b65fef31bd.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - The "has_carrier" flag was added to the network interface information. 4 | fixes: 5 | - Inspection code now waits up to 1 minute for all NICs to get their IP addresses. 6 | Otherwise inspection fails for some users due to race between DIB DHCP code 7 | and IPA startup. See https://bugs.launchpad.net/bugs/1564954 for details. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/inspection-wait-for-ips-v2-146016f758d7010c.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - During inspection wait only for a PXE booting NIC to get its IP by default. 4 | Introduce a new "inspection_dhcp_all_interfaces" option to enable waiting 5 | for all interfaces instead. 6 | - Stop checking the "has_carrier" field when waiting for NIC's to get IP 7 | addresses, as it might be set to "False" when the interface is being 8 | configured. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/inspector-logs-9b7c010c219691d2.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | The ``logs`` inspection collector is now enabled by default, change 5 | ``ipa-inspection-collectors`` to disable. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/inspector-retry-502-2b286e2ccc64c195.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes the post data to inspector to retry in 50X errors. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/instance-info-root-device-02fed0966bb00fb3.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Allows reading the ``root_device`` from ``instance_info``, overriding 5 | the value in ``properties``. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/inventory-conf-29b59ebe97aefbde.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds a new field ``configuration`` to the introspection data collected by 5 | the ``default`` collector. It contains two fields: 6 | 7 | * ``collectors`` - list of the enabled inspection collectors. 8 | * ``managers`` - list of the enabled hardware managers in their priority 9 | order. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/ip6-addresses-1c2b9bcd9a124de7.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Ironic Python Agent now correctly detects its IPv6 address 4 | if communicating with ironic over IPv6. This address is also 5 | wrapped in square brackets if the address being advertised 6 | is IPv6. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/ipa-debug-68c86101b1fdc3d9.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Debug logging can now be enabled by setting "ipa-debug" kernel parameter. 4 | -------------------------------------------------------------------------------- /releasenotes/notes/ipmi-address-channel-b6b8010c41d05c1b.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes incorrect assumption that a valid channel cannot follow an invalid 5 | one in IPMI (`bug 1714944 6 | `_). 7 | -------------------------------------------------------------------------------- /releasenotes/notes/ipmi-cleanup-a4454f6851d81c4d.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | Support for setting IPMI credentials during inspection was removed. This 5 | feature is not supported by ironic-inspector since the Pike release. 6 | - | 7 | The ``ipmi_address`` field is no longer sent as part of the inspection 8 | process. The ``inventory[bmc_address]`` field should be used instead. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/ipv6-bmc-mac-6133fb30c0d4cc5e.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds support for detecting MAC addresses for interfaces with 5 | only a IPv6 address. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/ipv6-listen-85d40e58156e398f.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - If booted into a kernel that supports IPv6, Ironic Python Agent 4 | now listens for connections on both the IPv4 and IPv6 wildcard 5 | addresses. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/ipv6-provision-42e9000f6f6a7a3a.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - If using Linux-IO, ISCSI targets now support deploying over 4 | an IPv6 network if booted into an IPv6 enabled kernel. IPv6 will 5 | be used for deployments for all traffic between ironic and IPA 6 | if IPA is passed an IPv6 address in the Ironic API URL. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/ironic-error-97e76d9ddacff039.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Correctly decodes error messages from ironic API. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/iscsi-detection-on-diskless-hw-f27dcce3aaa35ac2.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Upon initialization of the agent, an attempt to identify and 4 | initialize any configured hardware iSCSI initiators is performed 5 | prior to detecting disks. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/jitter-for-inspection-command-5a226927757a0308.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes risk of potential active node thundering heard by introducing 5 | jitter handling into the ``ironic-collect-introspection-data``. 6 | By default, the jitter will cause the 7 | ``introspection_daemon_post_interval`` configuration parameter based 8 | time value to be honored between in a range of 70% to 120% of the 9 | desired time window. 10 | 11 | Should failures occur after the initial connection and start of the 12 | daemon mode for introspection data collection, the fallback is a maximum 13 | of 400% of the introspection daemon post interval. 14 | -------------------------------------------------------------------------------- /releasenotes/notes/let_crypt_generate_the_salt-99876591325275a1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | security: 3 | - | 4 | The salt was generated using random and the module it's not in compliance 5 | with FIPS 140-2. Now we let the salt be automatically generated by the 6 | crypt function (it will use the strongest method available). 7 | fixes: 8 | - | 9 | The salt now will be automatically generated by the crypt function. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/lib-exc-41ee122eb4a04bc4.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes serializing exceptions originating from ironic-lib. Previously an 5 | attempt to do so would result in a ``TypeError``, for example: 6 | `Object of type 'InstanceDeployFailure' is not JSON serializable`. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/limit-qemu-img-malloc-arena-025ed84115481eae.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes failures with disk image conversions which result in memory 5 | allocation or input/output errors due to memory limitations by limiting 6 | the number of available memory allocation pools to a non-dynamic 7 | reasonable number which should not exceed the available system memory. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/limit-qemu-img-ram-usage-d7b7a16ac5e9c917.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Limits the memory usage of ``qemu-img convert`` command to 1 GiB to 5 | prevent it from causing the host machine to fail due to not enough RAM. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/lldp-error-handling-5b6576b378ef9c3a.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Fix LLDP discovery to not fail completely when an odd number of bytes is 4 | received in an LLDP package. 5 | - Fix raw sockets code to properly propagate exceptions to a caller instead 6 | of silencing them and returning None (causing failures later). 7 | -------------------------------------------------------------------------------- /releasenotes/notes/lldp-loop-fdfa584caf33d847.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Fixed incorrect invocation of "select" which could cause LLDP collection 4 | to hang under certain conditions. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/lldp-raw-a09174cb930bca97.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds a new inspection collector ``lldp`` that collects LLDP information 5 | into the ``lldp_raw`` field. 6 | deprecations: 7 | - | 8 | The LLDP information as part of the general inventory is deprecated. 9 | Use the new ``lldp`` inspection collector to retrieve it. 10 | - | 11 | The ``ipa-collect-lldp`` kernel parameter and the corresponding option are 12 | now deprecated. 13 | -------------------------------------------------------------------------------- /releasenotes/notes/lockdown-dc656fd26f13321f.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds a new API command ``system.lockdown``. When invoked, it stops the API, 5 | the heartbeater and tries to disable all local network interfaces. More 6 | actions may be added in the future to make the agent and the ramdisk 7 | unusable after this command. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/lockout-command-result-a368187515385270.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes a potential security issue where a third party may be able to 5 | retrieve potentially sensitive data in command result output from 6 | the agent. If a request comes in with an ``agent_token`` to the 7 | command results endpoint, the agent will now require all future 8 | calls to leverage the token to retrieve results and validate 9 | that token's validity. This effectively eliminates the possibility 10 | of a malicious entity with access to the agent's API endpoint from 11 | capturing the command results from agent operations. 12 | -------------------------------------------------------------------------------- /releasenotes/notes/log-download-size-57982fa8df336520.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | other: 3 | - | 4 | The agent now logs the size of data transferred when downloading images, 5 | which can be helpful in troubleshooting image download issues. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/log-file-7aaaf31693ddc617.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | The configured log file and/or log directory is now always explicitly 5 | included in the ramdisk logs. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/logs-collector-non-ascii-010339bf256443c8.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Fixes an issue using the "logs" inspection collector 4 | when logs contain non-ascii characters. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/lsblk-all-956c1df808a169bf.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | other: 3 | - | 4 | The ramdisk logs now contain an ``lsblk`` output with all pairs in the new 5 | ``lsblk-full`` file. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/lshw-cb89894be057bdc9.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | The ``lshw`` output no longer pollutes the debug logging, instead 5 | it's now stored as part of the ramdisk logs. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/lshw-for-memory-and-system-info-35c69da067c72b36.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Switched to ``lshw`` for memory configuration and system information collection 5 | when using the default hardware manager. This information can now be retrieved 6 | on both DMI capable and OpenFirmware capable systems. ``dmidecode`` is no longer 7 | used by the default hardware manager. 8 | fixes: 9 | - | 10 | The default hardware manager is now capable of collecting memory configuration 11 | and system information on OpenFirmware (PowerPC) capable systems, in addition 12 | to the already supported DMI (x86 and ARM) capable systems. 13 | upgrade: 14 | - | 15 | ``lshw`` is now a dependency of the default hardware manager. 16 | -------------------------------------------------------------------------------- /releasenotes/notes/lshw-no-memory-bank-size-05ea71987362986e.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | The lshw package version B.02.19.2-5 on CentOS 8.4 and 8.5 contains a `bug 5 | `_ that prevents the 6 | size of individual memory banks from being reported, with the result that 7 | the total memory size would be reported as 0 in some places. The total 8 | memory size is now taken from lshw's total memory size output (which does 9 | not suffer from the same problem) when available. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/manual-introspection-b04b5c25f5e004ac.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds a new CLI command ``ironic-collect-introspection-data`` to enable 5 | manually publishing into the ``baremetal-introspection`` service. 6 | Executing this command on a system unknown to the Bare Metal service 7 | will likely result in the machine becoming registered to Ironic, and 8 | as such this command should be used with caution. 9 | 10 | If the capability to update introspection data for running machines 11 | has been enabled in the Bare Metal introspection service, then an 12 | operator may use this command in the ``active`` or ``rescue`` states 13 | to update introspection data. 14 | -------------------------------------------------------------------------------- /releasenotes/notes/manually-configure-ironic-api-version-517afd0a423036ad.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Deployers in highly-secure environments can now manually set Ironic API 5 | version instead of relying on unauthenticated autodetection via 6 | the ``ipa-ironic-api-version`` on the kernel command line. This is not a 7 | recommended configuration. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/md-restart-9e0d47863a086792.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Rescans partitions on a software RAID device that gets restarted when 5 | installing boot loader. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/mdadm-d5b8c186182620b1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | The ``mdadm`` utility is no longer a hard requirement. It's still required 5 | if software RAID is used (even when not managed by ironic). 6 | -------------------------------------------------------------------------------- /releasenotes/notes/mdns-e020484e64d76edb.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Supports fetching baremetal and baremetal introspection endpoints from 5 | mDNS instead of providing them via kernel parameters or a configuration 6 | file. See `story 2005393 7 | `_ for more details. 8 | upgrade: 9 | - | 10 | When no baremetal API URL is provided (e.g. via the ``ipa-api-url`` kernel 11 | parameter), ironic-python-agent now tries to get the URL using mDNS service 12 | discovery. 13 | -------------------------------------------------------------------------------- /releasenotes/notes/min-ironic-ocata-dff80e567783e87c.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | The minimum supported versions of the ironic API is now 1.31, 5 | corresponding to the latest available in the Ocata release. 6 | All versions before that one are not supported anymore. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/mix-and-match-disk-detection-58db04403ce220a0.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | For a long time block device information originating form lsblk and udev 5 | was handled in a mutually exclusive way during root disk selection. 6 | The new ``mix and match`` approach allows IPA to collect and match 7 | ``disk serial`` and ``wwn`` root device hints against values coming 8 | from both ``lsblk`` and ``udev`` at the same time. The ``mix and match`` 9 | approach is necessary to handle edge cases where the serial and/or wwn 10 | information is different in ``lsblk`` compared to ``udev``. 11 | -------------------------------------------------------------------------------- /releasenotes/notes/mlnx-steps-now-available-for-deploy-4a4226ffaae888f3.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | The Nvidia Mellanox "clean steps" to facilitate firmware updates of 5 | their network devices, are now available as deploy steps and service 6 | steps as well. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/move_swraid_to_efibootmgr-d87c1bfde1661fb5.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Uses ``efibootmgr`` instead of ``grub2-install`` for software RAID. This 5 | fixes an issue with images which include newer versions of 6 | ``grub2-install``, such as CentOS Stream 8, as they refuse bootloader 7 | installations in UEFI boot mode due to the lack of secure boot support. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/multipath-handling-00a5b412d2cf2e4e.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes failures with handling of Multipath IO devices where Active/Passive 5 | storage arrays are in use. Previously, "standby" paths could result in 6 | IO errors causing cleaning to terminate. The agent now explicitly attempts 7 | to handle and account for multipaths based upon the MPIO data available. 8 | This requires the ``multipath`` and ``multipathd`` utility to be present 9 | in the ramdisk. These are supplied by the ``device-mapper-multipath`` or 10 | ``multipath-tools`` packages, and are not required for the agent's use. 11 | - | 12 | Fixes non-ideal behavior when performing cleaning where Active/Active 13 | MPIO devices would ultimately be cleaned once per IO path, instead of 14 | once per backend device. 15 | other: 16 | - | 17 | The agent will now attempt to collect any multipath path information 18 | and upload it to the agent ramdisk, if the tooling is present. 19 | -------------------------------------------------------------------------------- /releasenotes/notes/multipath-serial-615fc925984abbf7.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes discovering WWN/serial numbers for devicemapper devices. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/multipath_error_handling_improvement-1669d0de4bfdbe95.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes the error handling of multipathd service startup/discovery process. 5 | IPA handles both scenario when the multipathd service is already started 6 | and the scenario when the service has not been started and in the second 7 | scenario IPA will try to start the service. IPA is not checking whether 8 | multipathd is running already and not, it will start the multipathd service 9 | even it is already running and expects 0 error code even if the service 10 | is already running. It has been noticed that with certain combinations of 11 | distros and multipathd versions the error code is not 0 when IPA tries 12 | to start multipathd when an instance of multipathd is already running. 13 | When the expected return code is not 0 that causes an exception and that 14 | will cause the multipath device discovery to terminate prematurely and 15 | if the selected root device is a multipath device then IPA won't be 16 | able to provision. This fix discards the exception that is caused by the 17 | non 0 error code returned by the multipathd startup process. In case there 18 | is a genuine issue with the multipath service, that would be caught when 19 | the actual multipath device listing command is executed (multipath -ll). 20 | -------------------------------------------------------------------------------- /releasenotes/notes/multiple-lan-channels-ee32d80150f990bf.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes bug where it was assumed that all BMCs operated on the default LAN 5 | channel. IPA now iterates through all the possible LAN channels for the 6 | IP address and returns 0.0.0.0 if the IPMI interface is not configured. See 7 | https://bugs.launchpad.net/ironic-python-agent/+bug/1702514 8 | for more details. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/name-root-device-hints-0cfc8c90d03c8bf0.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Root device hints extended to support the device name. 4 | -------------------------------------------------------------------------------- /releasenotes/notes/net-speed-8854901e2051bb79.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | The hardware inventory now contains supported network interface speed in 5 | Mbit/s. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/new-agent-api-afbe7391493749be.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Use new Ironic agent API (added in API version 1.22) when it's available. 4 | -------------------------------------------------------------------------------- /releasenotes/notes/new-sync-command-6f5fa55df2fd5903.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Add a new sync() command to the standby extension. When invoked, 4 | the new command is responsible for flushing the file system buffers 5 | to the disk. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/no-bash-for-grub-c38369af8cc7cf26.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Ironic Python Agent no longer requires 'bash' to be present in the user 5 | image when preparing the partition image for local boot, and uses the 6 | default 'sh' interpreter to run 'grub'-related commands instead. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/no-coreos-3345cc69009dead9.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | Images based on CoreOS are no longer supported and built. They were 5 | deprecated in the Stein cycle and an alternative based on diskimage-builder 6 | is being developed. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/no-iscsi-fd21808edbea5ac2.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | Removes support for the ``iscsi`` deploy interface. Please use a ramdisk 5 | from the Wallaby cycle if you need it. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/no-link-local-2e861978c5c7bf30.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Fixes the issue where link-local IP addresses were sometimes used as part 4 | of the callback URL given to ironic. The routable address is used instead. 5 | See `bug 1732692 `_ 6 | for more details. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/no-mac-54616606ee6b844d.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | No longer crashes if MAC address cannot be determined for one of the 5 | network interfaces. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/no-netboot-d034bb1d1d9166c5.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | No longer supports network boot of instances (``boot_option=netboot``). 5 | This feature is dropped from Ironic in the Zed cycle. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/no-retry-disk-space-errors-a24c29b336fd11d9.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fail fast when encountering disk space errors during image 5 | downloads instead of attempting futile retries. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/no-sample-ac11bd0fa27af62a.yaml: -------------------------------------------------------------------------------- 1 | other: 2 | - | 3 | The sample configuration file 4 | ``etc/ironic_python_agent/ironic_python_agent.conf.sample`` is no longer 5 | shipped with the source code. It can be generated locally with:: 6 | 7 | tox -egenconfig 8 | -------------------------------------------------------------------------------- /releasenotes/notes/no-standalone-bb34eae2cc468837.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | It is no longer possible to enable the so called *standalone mode*, in 5 | which the agent does not communicate with ironic. This mode is only 6 | useful for local testing, enabling it on production is always wrong. 7 | The ironic team does not support using ironic-python-agent as a standalone 8 | application outside of the normal workflow. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/no-zram-78cc6583f4f90a9c.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | No longer tries to use zRAM devices for anything. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/old-inspector-data-5e63c9bce72b4fb5.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | other: 3 | - | 4 | Introspection data no longer contains keys used for compatibility with 5 | the old introspection ramdisk. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/only-run-evaluate-hardware-support-once-9ec1ae327b4e03f2.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes bug 2066308, an issue where Ironic Python Agent would call 5 | evaluate_hardware_support multiple times on hardware manager plugins. 6 | Scanning for hardware and disks is time consuming, and caused timeouts 7 | on badly-performing nodes. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/oslo-config-generator-b0f70b9fb7e23997.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | other: 3 | - Ironic Python Agent now uses ``oslo-config-generator`` to create the 4 | sample configuration file. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/parallel-erase-disk-devices-09ea33d5443aead0.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Supports parallel disk device erasure. This is controlled by ironic's 5 | ``[deploy]disk_erasure_concurrency`` configuration option. 6 | other: 7 | - | 8 | The ``HardwareManager.erase_block_device`` method is now called 9 | concurrently when parallel disk device erasure is used. It must be 10 | implemented in a thread-safe way. 11 | -------------------------------------------------------------------------------- /releasenotes/notes/partition_check_read_only_base_device-5bc15ac2f034aca9.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where metadata erasure cleaning fails for partitions 5 | because the read-only file isn't found, while it is available at the 6 | base device. Adds a check for the base device file on failure. See 7 | `story 2008696 `_. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/permit-pre-hashed-rescue-passwords-4275f6e697533cec.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | security: 3 | - | 4 | Enables pre-hashed passwords to be supplied to the ``rescue`` extension. 5 | See `story 2006777 `_ 6 | for more information. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/pint-0.5-816aaf3a4f6d4a6e.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes the ``numa-topology`` inspection collector to be compatible with 5 | Pint < 0.5.2. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/poll-mode-063bd36b2b18bffb.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds a Poll extension which provides the ability to retrieve hardware 5 | information as well as set node data from API. This feature is required 6 | for poll mode deployment driven by ironic. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/prefix-lldp-timeout-50acc656313d8dd2.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Every other Ironic python agent kernel parameter is prefixed with "ipa-". 4 | This patch allows users to use the old "lldp-timeout" parameter or the 5 | new "ipa-lldp-timeout" parameter. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/prepare-image-49744276cef719d5.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes the ``write_image`` deploy step to actually check and return any 5 | errors during its execution. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/preserve-efi-folder-contents-ea1e278b3093ec55.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes the agent's EFI boot handling such that EFI assets from a partition 5 | image are preserved and used instead of overridden. This should permit 6 | operators to use Secure Boot with partition images IF the assets are 7 | already present in the partition image. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/prevent-deletion-of-shared-disk-filesystems-4c17c7666d2fe3bc.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Previously when the ``ironic-python-agent`` would undergo erasure of block 5 | devices during cleaning, it would automatically attempt to erase the 6 | contents of any "Shared Device" clustered filesystems which may be in use 7 | by distinct multiple machines over a storage fabric. In particular 8 | IBM GPFS, Red Hat Global File System 2, and VmWare Virtual Machine File 9 | System (VMFS), are now identified and cleaning is halted. This is important 10 | because should an active cluster be using the this disk, cleaning could 11 | potentially cause the cluster to go down forcing restoration from backups. 12 | Ideally, infrastructure operators should check their environment's storage 13 | configuration and un-map any clustered filesystems from being visible to 14 | Ironic nodes, unless explicitly needed and expected. Please see the 15 | Ironic-Python-Agent troubleshooting documentation for more information. 16 | issues: 17 | - | 18 | Logic to guard VMFS filesystems from being destroyed *may* not recognize 19 | VMFS extents. Operators with examples of partitioning for extent usage 20 | are encouraged to contact the Ironic community. 21 | -------------------------------------------------------------------------------- /releasenotes/notes/prevent-needless-iscsi-cleanup-f8d602c0abc7e8ba.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue with the ironic-python-agent where we would call to 5 | setup the bootloader, which is necessary with software raid, but also 6 | attempt to clean up iSCSI. This can cause issues when using the ``direct`` 7 | ``deploy_interface``. Now the agent will only clean up iSCSI connections 8 | if iSCSI was explicitly started. For more information, please see 9 | `story 2007937 `_. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/prevent-restart-after-rescue-2cdd9cb03c0efb1b.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Prevents IPA from restarting on tenant networks during rescue 5 | operations by adding proper lockdown. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/prioritize-lsblk-device-serials-8cae406ca5164a01.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | When detecting a serial number of a block device, the agent now tries 5 | to use lsblk first and only falls back to udev if lsblk does not return 6 | a serial number. Based on experience it looks like lsblk might be a better 7 | source of truth than udev in regerard to serial number information. 8 | 9 | -------------------------------------------------------------------------------- /releasenotes/notes/qemu-img-ooo-write-721b8a0057ab7b8a.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Permits out-of-order writes when converting whole disk images to improve 5 | performance. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/qemu-write-zeros-2edbf3152c57e2b6.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | IPA instructs qemu-img to write image zeros to disk. 5 | Doing this will cause it not to zero out the entire 6 | block device which can be very costly on a slow HDD. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/raid-esp-size-2c322adb2d3b9ce7.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | The size of the ESP partition created for software RAID has been increased 5 | from 128 MiB to 550 MiB. This change is in line with the recent 6 | `diskimage-builder change 7 | `_ 8 | as well as the `guidance from the author of gdisk 9 | `_. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/raid-hints-604f9ffdd86432eb.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Target devices for software RAID can now be specified in the form of 5 | device hints (same as for root devices) in the ``physical_disks`` 6 | parameter of a logical disk configuration. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/raid5-6-support-0807597c3633a26c.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds support to allow selection of RAID ``5`` and RAID ``6`` 5 | protection levels for software RAID support. This may only be 6 | the secondary volume, as these volume types of software RAID 7 | volumes cannot be used to directly boot an operating system. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/readd_missing_devs-2ed85805388b6e42.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Upon the creation of Software RAID devices, component devices are 5 | sometimes kicked out immediately (for no apparent reason). This 6 | fix re-adds devices in such cases in order to prevent the component 7 | to be missing next time the device is assembled, which, for instance 8 | may prevent the UEFI ESPs to be installed properly. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/rebuild_on_esp_raid-33f359bdf5ccaa09.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue with rebuilding instances on Software RAID with 5 | RAIDed ESP partitions. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/relax-checksum-feeding-11044ae02b411a07.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where md5 checksum is still required in the image 5 | information when os_hash_algo and os_hash_value are present. The 6 | ``checksum`` field is now optional, while ``os_hash_algo`` and 7 | ``os_hash_value`` fields must be set if the ``checksum`` field is 8 | not provided. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/remove-agent-token-required-808e99b83b4456a1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | security: 3 | - | 4 | The ``agent_token_required`` configuration option has been removed. 5 | This was a knob to help ease the upgrade process by enabling operators 6 | to express if their environment was requiring an agent token. This was 7 | key to help navigate possible upgrade cases, however that was for the 8 | migration *to* the Victoria release, and such an upgrade is outside 9 | of the version support matrix of Ironic. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/remove-lldp-timeout-ea481dbb01a39522.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | The kernel parameter ``lldp-timeout`` (deprecated during the Newton 5 | development cycle) has been removed, please use ``ipa-lldp-timeout`` 6 | instead. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/remove-py38-15fc164a4a08b764.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | Support for Python 3.8 has been removed. Now the minimum python version 5 | supported is 3.9 . 6 | -------------------------------------------------------------------------------- /releasenotes/notes/remove-switch_port_descr-switch_chassis_descr-40f2bb37b5f1fdd1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | Two reserved fields, ``switch_port_descr`` and 5 | ``switch_chassis_descr``, were deprecated in 6 | Newton cycle and now are removed. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/remove-sysrq-2c2804930180f408.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Stop using SYSRQ when performing the in-band reboot or power off 4 | because it has a similar effect to a hardware reset button/power 5 | switch and can be problematic on some hardware types. Instead, 6 | reboot/power off the node via the "poweroff" and "reboot" commands 7 | (soft power action). 8 | -------------------------------------------------------------------------------- /releasenotes/notes/remove-vendor-passthru-eda3519c322eb4e2.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - Ironic Python Agent no longer supports Ironic API lookup and heartbeat 4 | actions via agent vendor passthru methods, 5 | and uses only the new, top-level lookup and heartbeat endpoints of 6 | Ironic API v1.22 (introduced in Newton release, Ironic version 6.1.0). 7 | 8 | This effectively means that Ironic Python Agent becomes incompatible 9 | with Ironic API < 1.22 (Ironic version 6.0.0 or older, 10 | integrated OpenStack release Mitaka or older). 11 | -------------------------------------------------------------------------------- /releasenotes/notes/report-intf-bus-and-driver-63ed0277b372c1d1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds support to collect pci address and driver information for interfaces. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/rescan-before-checking-uefi-64597c937880134d.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where the agent was failing to rescan the device deployed 5 | upon before checking uefi contents. This would occur with an iSCSI 6 | based deployment, as partition management operations are performed by 7 | the conductor, and not locally. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/rescan-device-after-mkfs-3f9d52a2e3b6fff3.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Adds device rescan operation after partitioning the root device to ensure 5 | that updated UUIDs are reflected correctly 6 | -------------------------------------------------------------------------------- /releasenotes/notes/rescue-dhcp_network-for-tinyipa-a14de5fae38a5dce.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds DHCP network support for TinyIPA. This support is required for 5 | rescue feature when used with TinyIPA. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/respect-listen-directives-94fb863c5b692c07.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Since the Ussuri release, IPA has ignored the listen_host and listen_port 5 | directives. This fixes the behavior and restores those configuration 6 | values to working status. 7 | https://storyboard.openstack.org/#!/story/2008016 8 | -------------------------------------------------------------------------------- /releasenotes/notes/rework-ata-secure-erase-c6684962ef078281.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where the secure erase cleaning step would fail 5 | if a drive was left in the security-enabled state. This could 6 | occur if a previous attempt to perform a secure erase had failed 7 | e.g if there was a power failure mid-way through the cleaning 8 | process. See `Story 2001762 9 | `_ 10 | and `Story 2001763 11 | `_ 12 | for details. 13 | -------------------------------------------------------------------------------- /releasenotes/notes/root-device-hints-rotational-67e6e61074c26561.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Extend the root device hints to identify whether a disk is rotational 4 | or not. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/sector_size-b2c0a07086012c17.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | ``logical_sectors`` and ``physical_sectors`` sizes are now captured for each 5 | hardware info ``disks`` entry, and also logged for ``lsblk`` calls. This 6 | will be increasingly useful as storage devices with 4096 byte sector sizes 7 | become more common. -------------------------------------------------------------------------------- /releasenotes/notes/set-clock-prior-to-poweroff-af6ec210aad8b45a.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds a feature where IPA will utilize a ``[DEFAULT]ntp_server`` or 5 | ``ipa-ntp-server`` kernel command line argument to cause the agent 6 | to attempt to sync the clock to the NTP source. The agent also attempts 7 | to sync the software clock to the NTP time source, and assert an update 8 | to the hardware clock prior to powering the machine off. Please note, 9 | if your system clock is set to local time as opposed to UTC, 10 | this may result in undesirable behavior. 11 | -------------------------------------------------------------------------------- /releasenotes/notes/several-urls-9c3b8c14338b06ba.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Supports several comma-separated URLs for ``ipa-api-url`` and 5 | ``ipa-inspection-callback-url``. The URLs are probed in the provided 6 | order until one does not return a connection error. The primary use case 7 | it to support deploying nodes with only one IP stack from an Ironic 8 | installation that has both stacks. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/skip-lookup-and-heartbeat-if-apiurl-not-configured-5ae8b04ae1e74673.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - If ipa-api-url is not configured in pxe parameters, skip lookup and heartbeat 4 | to avoid ConnectionError when IPA starts. See https://bugs.launchpad.net/bugs/1643966 5 | for details. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/skips-bootloader-install-35c463195aa61800.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where wholedisk images are requested for deployment and 5 | the bootloader is overridden. IPA now explicitly looks for the boot 6 | partition, and examines the contents if the disk appears to be MBR 7 | bootable. If override/skip bootloader installation does not apply if 8 | UEFI or PREP boot partitions are present on the disk. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/sleep-ebe58fbe07d30219.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Add a configurable (and disabled by default) sleep before IPA does any 4 | actions. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/softraid-bootable-with-uefi-aa22e6cbaf1ea747.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds UEFI boot support for Software RAID, and for partition table 5 | creation based upon boot mode in use. 6 | upgrade: 7 | - | 8 | The type of the partition table created for Software RAID is now based 9 | upon the boot mode in use (GPT for UEFI or if explicitly passed via the 10 | instance's capabilities or the node's properties, otherwise MSDOS). 11 | The amount of reserved space on the drives now also depends on the boot 12 | mode (128MiB for UEFI/GPT, 8MiB for BIOS/GPT, and one sector otherwise). -------------------------------------------------------------------------------- /releasenotes/notes/softraid-creation-on-nvme-a2fd4c531d200904.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Adds support for creating software RAID on NVMe drives. 4 | -------------------------------------------------------------------------------- /releasenotes/notes/softraid-partitioning-refactor-104b817c3bdc73e3.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Fixes size conversion when creating software RAID with ``size_gb`` 4 | provided. From the `RAID documentation 5 | `_ 6 | ``size_gb`` unit is GiB but parted defaults to MB. 7 | - Fixes creating software RAID when several logical drives have a size 8 | specified (i.e not 'MAX'). See `story 2006352 9 | `_. 10 | - Fixes creating software RAID when a logical drive with size 'MAX' is not 11 | the last in the list of logical drives. 12 | -------------------------------------------------------------------------------- /releasenotes/notes/softraid-zap-superblocks-anywhere.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Zap superblocks from all block devices, as an attempt to erase any 5 | softraid hint from devices when calling delete_configuration, including 6 | from drives that are no more members of any raid. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/software-raid-4a88e6c5af9ea742.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds support for software RAID via the generic hardware manager. By 5 | means of the target_raid_config a single RAID-1 or one RAID-1 plus 6 | one RAID-N can be configured (where N can be 0, 1, and 1+0). The 7 | RAID is created/deleted during manual cleaning. Note that this 8 | initial implementation will use all available devices for the setup 9 | of the software RAID device(s). -------------------------------------------------------------------------------- /releasenotes/notes/software-raid-raid-ESPs-25a2aa117b99620a.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Mirrors the previously disconnected EFI system partitions (ESPs) in UEFI 5 | software RAID setups. Disconnected ESPs can lead to nodes booting with 6 | outdated kernel parameters or the UEFI firmware not finding bootable 7 | kernels at all. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/software-raid-use-label-as-rootfs-uuid-d9a3827180f1a238.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | For Software RAID, the IPA will use partition LABEL along with UUID and PARTUUID 5 | passed from the conductor to identify the root partition. The root file system 6 | LABEL can be set as value of the ``rootfs_uuid`` image metadata property. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/software_raid_use_rootfs_uuid-9149cc0c8638d5d5.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | For Software RAID, the IPA will no longer assume that the root file system 5 | is in the first partition of the deployed image. Instead, the IPA will use 6 | the UUID passed from the conductor to identify the root partition. Before 7 | upgrades, the root file system UUID needs hence to be set as part of the 8 | node's ``driver_internal_info`` or as ``rootfs_uuid`` image metadata. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/start_passing_agent_version_to_ironic-6fa8670ae0e7eb38.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Now passes an ``agent_version`` field to the Bare Metal service as part of 5 | the heartbeat request if the Bare Metal API version is 1.36 or higher. 6 | This provides the Bare Metal service with the information required to 7 | determine what agent features are available, so that the Bare Metal service 8 | can be upgraded to a new version before the agent is upgraded, whilst 9 | ensuring the Bare Metal service only requests the agent features that are 10 | available to it. 11 | -------------------------------------------------------------------------------- /releasenotes/notes/stream-raw-images-d2e245aaed991d86.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Adds support for streaming raw images directly onto 4 | the disk. This avoids writing the image to a tmpfs 5 | partition before writing it to disk, which also enables 6 | using images larger than the usable amount of RAM on 7 | the machine IPA runs on. Pass `stream_raw_images=True` 8 | to the `prepare_image` command to enable this; it is 9 | disabled by default. 10 | fixes: 11 | - Raw images larger than available of RAM may now be used 12 | by passing `stream_raw_images=True` to the `prepare_image` 13 | command; these will be streamed directly to disk. 14 | -------------------------------------------------------------------------------- /releasenotes/notes/streaming-partition-images-cdeb260ef8f90012.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds support for streaming raw partition images onto target partition 5 | without caching them in memory. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/streaming-uuid-fdf136a7745fbb3d.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes incorrect root partition UUID after streaming a raw partition 5 | image. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/support-4096-sector-size-490adc8ed256092d.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Adds support for disks with 4096 sector size when cleaning disk metadata. 5 | Previously, only 512 sector size disks were supported. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/support-bootloader-csv-file-use-c815b520c600cd98.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds the capability into the agent to read and act upon bootloader CSV 5 | files which serve as authoritative indicators of what bootloader to load 6 | instead of leaning towards utilizing the default. 7 | fixes: 8 | - | 9 | Fixes nodes failing after deployment completes due to issues in the Grub2 10 | EFI loader entry addition where a ``BOOT.CSV`` file provides the 11 | authoritative pointer to the bootloader to be used for booting the OS. The 12 | base issue with Grub2 is that it would update the UEFI bootloader NVRAM 13 | entries with whatever is present in a vendor specific ``BOOT.CSV`` or 14 | ``BOOTX64.CSV`` file. In some cases, a baremetal machine *can* crash when 15 | this occurs. More information can be found at 16 | `story 2008962 `_. 17 | issues: 18 | - | 19 | If multiple bootloader CSV files are present on the EFI filesystem, the 20 | first CSV file discovered will be utilized. The Ironic team considers 21 | multiple files to be a defect in the image being deployed. This may be 22 | changed in the future. 23 | -------------------------------------------------------------------------------- /releasenotes/notes/support-collecting-ipv6-address-dd819d543f851a63.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Adds support to collect the default IPv6 address for interfaces. With 4 | different networking environment, the address could be a link-local 5 | address, ULA or something else. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/support-image-proxy-e2987a6589375451.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Adds support for setting proxy info for downloading 4 | images. This is controlled by the `proxies` and `no_proxy` 5 | keys in the `image_info` dict of the `prepare_image` 6 | command. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/support-linux-io-6bbd7ff1f0d70a0e.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - IPA now supports Linux-IO as an alternative to tgtd. 4 | The iSCSI extension will try to use Linux-IO first, 5 | and fall back to tgtd if Linux-IO is not found or 6 | cannot be used. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/support-lldp-in-inventory-4ab6e45ccd35dace.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Add support for LLDP data in the returned inventory when option 4 | collect_lldp is set to True. Each interface returned in the inventory that 5 | receives an LLDP packet will contain the whole LLDP packet represented as a 6 | list of TLVs in the field 'lldp'. 7 | upgrade: 8 | - Deprecated reserved fields switch_port_descr and switch_chassis_descr in 9 | favor of returning the whole LLDP packet for each interface so that IPA 10 | processing of this data remains generic and full processing can be 11 | customised server side instead of having to create custom ramdisks. These 12 | fields will be removed in Ocata. 13 | -------------------------------------------------------------------------------- /releasenotes/notes/support-prep-partitions-5e273572ab7ce018.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | If a PReP boot partition is created, and the machine being deployed to is 5 | of ppc64le architecture, the grub2 bootloader will be installed directly 6 | there. This enables booting partition images locally on ppc64* hardware. 7 | 8 | Using this feature requires ``ironic-lib`` version 2.14 as support to 9 | create the PReP partition was introduced there. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/suse-tinyipa-support-20acecd6d7b20952.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Support for zypper has been added to the TinyIPA install-deps script 4 | in order to support building TinyIPA on SUSE. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/sw-raid-assemble-9c20fe967f73d1dd.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Tries to assemble software RAID automatically on start up to avoid problems 5 | with ramdisks that don't do it automatically (like tinyipa). 6 | -------------------------------------------------------------------------------- /releasenotes/notes/timeout_on_file_download-ed77918318316075.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes failure to detect a hung file download connection in the 5 | event that the kernel has not rapidly detected that the remote 6 | server has hung up the socket. This can happen when there is 7 | intermittent and transient connectivity issues such as those 8 | that can occur due to LACP failure response hold-downs timers 9 | in switching fabrics. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/tinycore-ipv6-1b620c61402b5720.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes the missing ipv6 module for TinyCore based IPA images which are used 5 | in CI testing. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/tinyipa-python3-default-b8434793e17465db.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | prelude: > 3 | Starting with this release, the Ironic Python Agent images used in the CI 4 | (tinyipa) run with Python 3 by default. 5 | other: 6 | - Change the Python default version used to build and run the Ironic 7 | Python Agent in the Tiny Core based image to 3.6. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/tinyipa-rescue-dhcp-multi-tenant-b32bda7bf2b12679.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes bug where TinyIPA fails to acquire IP address when 5 | in RESCUE state and in multi-tenant environment. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/tinyipa-ssh-e8a3a01a3f3ff5f4.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | other: 3 | - When building the TinyIPA ramdisk, it is now possible to enable SSH 4 | access to it. 5 | Use ``ENABLE_SSH`` and ``SSH_PUBLIC_KEY`` environment variables 6 | for that (see TinyIPA's README for more details). 7 | -------------------------------------------------------------------------------- /releasenotes/notes/udev-settle-f75db34db990ad68.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Ensure block devices are detected by the host OS before listing them. 4 | -------------------------------------------------------------------------------- /releasenotes/notes/udevadm-settle-9d3e5f1f20211857.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Adds a call to "udevadm settle" in write_image.sh. 5 | After GPT and MBR are destroyed systemd-udevd gets triggered 6 | which may hold /dev/sda open preventing qemu-img from writing 7 | its image. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/uefi-esp-660fc2c650e6af92.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | No longer tries to use GRUB2 for configuring boot for whole disk images 5 | with an EFI partition present but only marked as ``boot`` (not ``esp``). 6 | -------------------------------------------------------------------------------- /releasenotes/notes/uefi-fallback-266c647f6aff58fd.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - When writing a partition image, IPA now 4 | installs grub to the UEFI fallback path (e.g. ``EFI/BOOT/BOOTX64.EFI``). 5 | The fallback path is used to boot the bare metal node if the NVRAM is 6 | reset. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/uefi-images-38c8536db189ffc1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Provides a more specific error message if a UEFI-incompatible image 5 | is used in the UEFI mode. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/understand-node-conflict-is-locked-2ea21dd45abfe4f7.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes, or at least lessens the case where a running Ironic agent can stack 5 | up numerous lookup requests against an Ironic deployment when a node is 6 | locked. In particular, this is because the lookup also drives generation of 7 | the agent token, which requires the conductor to allocate a worker, and 8 | generate the token, and return the result to the API client. 9 | Ironic's retry logic will now wait up to ``60`` seconds, and if an HTTP 10 | Conflict (409) message is received, the agent will automatically pause 11 | lookup operations for thirty seconds as opposed continue to attempt 12 | lookups which could create more work for the Ironic deployment 13 | needlessly. 14 | -------------------------------------------------------------------------------- /releasenotes/notes/up-qemuimg-mem-1536183a02b3a235.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Increase memory usage limit for ``qemu-img convert`` command to 2 GiB. 5 | See `Story 2008667 6 | `_ 7 | for details. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/usb-autodiscovery-ab5a4a40ba096bb8.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - Add attached USB device auto discovery. The information is 4 | retrieived from `lshw` tool and store in introspection data result. 5 | 6 | -------------------------------------------------------------------------------- /releasenotes/notes/use-latest-coreos-87f826d26b46548d.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - The CoreOS image builder now uses the latest CoreOS 4 | stable version when building images. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/use-system-random-00b0721c8ebd0c5a.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | other: 3 | - System random is now used where applicable, rather 4 | than the default python random library. 5 | -------------------------------------------------------------------------------- /releasenotes/notes/vmedia-copy-6a58f3183b166c42.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | other: 3 | - | 4 | Agent configuration files found on attached virtual media or config drive 5 | devices are now copied to the ramdisk and loaded on start up. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/wait-for-interfaces-before-lookup-9bf38852b2f176a1.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - Ensures the node look up is attempted with valid interfaces information 4 | to avoid exception log messages in the conductor log. IPA tries to 5 | retrieve interfaces information every 5 seconds until either at least 6 | one of the interfaces is up or 60 seconds is lapsed. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/wait-root-device-504b517c3aec73e2.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | If root device hints are provided on the node, wait for the root device 5 | instead of the first disk. This fixes deployment when the target disk takes 6 | time to load. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/whole-disk-grub-0b1b8b9c44e31d28.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Avoids a traceback when using ``install_bootloader`` with whole disk 5 | images. If the root UUID cannot be detected, don't try to call grub. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/zero-size-78d3be2ac8fd59c2.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Devices with size 0 are now ignored when collecting inventory. Some 5 | hardware represents virtual floppy devices this way, see e.g. 6 | https://www.dell.com/community/Systems-Management-General/How-to-disable-iDRAC-Virtual-CD/td-p/4734424 7 | -------------------------------------------------------------------------------- /releasenotes/source/2023.1.rst: -------------------------------------------------------------------------------- 1 | =========================================== 2 | 2023.1 Series (9.2.0 - 9.4.x) Release Notes 3 | =========================================== 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/2023.1 7 | -------------------------------------------------------------------------------- /releasenotes/source/2023.2.rst: -------------------------------------------------------------------------------- 1 | =========================================== 2 | 2023.2 Series (9.5.0 - 9.7.x) Release Notes 3 | =========================================== 4 | 5 | .. release-notes:: 6 | :branch: stable/2023.2 7 | -------------------------------------------------------------------------------- /releasenotes/source/2024.1.rst: -------------------------------------------------------------------------------- 1 | ============================================ 2 | 2024.1 Series (9.8.0 - 9.11.x) Release Notes 3 | ============================================ 4 | 5 | .. release-notes:: 6 | :branch: stable/2024.1 7 | -------------------------------------------------------------------------------- /releasenotes/source/2024.2.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | 2024.2 Series Release Notes 3 | =========================== 4 | 5 | .. release-notes:: 6 | :branch: stable/2024.2 7 | -------------------------------------------------------------------------------- /releasenotes/source/2025.1.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | 2025.1 Series Release Notes 3 | =========================== 4 | 5 | .. release-notes:: 6 | :branch: stable/2025.1 7 | -------------------------------------------------------------------------------- /releasenotes/source/_static/.placeholder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/releasenotes/source/_static/.placeholder -------------------------------------------------------------------------------- /releasenotes/source/_templates/.placeholder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/ironic-python-agent/2e35dfc7bc0a4188d223748b4c9111945abe126f/releasenotes/source/_templates/.placeholder -------------------------------------------------------------------------------- /releasenotes/source/index.rst: -------------------------------------------------------------------------------- 1 | ================================= 2 | Ironic Python Agent Release Notes 3 | ================================= 4 | 5 | .. toctree:: 6 | :maxdepth: 1 7 | 8 | unreleased 9 | 2025.1 10 | 2024.2 11 | 2024.1 12 | 2023.2 13 | 2023.1 14 | zed 15 | yoga 16 | xena 17 | wallaby 18 | victoria 19 | ussuri 20 | train 21 | stein 22 | rocky 23 | queens 24 | pike 25 | ocata 26 | newton 27 | mitaka 28 | liberty 29 | -------------------------------------------------------------------------------- /releasenotes/source/liberty.rst: -------------------------------------------------------------------------------- 1 | ============================================ 2 | Liberty Series (1.0.0 - 1.0.5) Release Notes 3 | ============================================ 4 | 5 | .. release-notes:: 6 | :branch: origin/stable/liberty 7 | -------------------------------------------------------------------------------- /releasenotes/source/mitaka.rst: -------------------------------------------------------------------------------- 1 | =========================================== 2 | Mitaka Series (1.1.0 - 1.2.x) Release Notes 3 | =========================================== 4 | 5 | .. release-notes:: 6 | :branch: origin/stable/mitaka 7 | -------------------------------------------------------------------------------- /releasenotes/source/newton.rst: -------------------------------------------------------------------------------- 1 | =========================================== 2 | Newton Series (1.3.0 - 1.5.x) Release Notes 3 | =========================================== 4 | 5 | .. release-notes:: 6 | :branch: origin/stable/newton 7 | -------------------------------------------------------------------------------- /releasenotes/source/ocata.rst: -------------------------------------------------------------------------------- 1 | ========================================== 2 | Ocata Series (2.0.0 - 2.0.x) Release Notes 3 | ========================================== 4 | 5 | .. release-notes:: 6 | :branch: origin/stable/ocata 7 | -------------------------------------------------------------------------------- /releasenotes/source/pike.rst: -------------------------------------------------------------------------------- 1 | ========================================== 2 | Pike Series (2.1.0 - 2.2.x) Release Notes 3 | ========================================== 4 | 5 | .. release-notes:: 6 | :branch: stable/pike 7 | -------------------------------------------------------------------------------- /releasenotes/source/queens.rst: -------------------------------------------------------------------------------- 1 | ============================================= 2 | Queens Series (3.0.0 - 3.2.x) Release Notes 3 | ============================================= 4 | 5 | .. release-notes:: 6 | :branch: stable/queens 7 | -------------------------------------------------------------------------------- /releasenotes/source/rocky.rst: -------------------------------------------------------------------------------- 1 | ========================================== 2 | Rocky Series (3.3.0 - 3.3.x) Release Notes 3 | ========================================== 4 | 5 | .. release-notes:: 6 | :branch: stable/rocky 7 | -------------------------------------------------------------------------------- /releasenotes/source/stein.rst: -------------------------------------------------------------------------------- 1 | ========================================== 2 | Stein Series (3.4.0 - 3.6.x) Release Notes 3 | ========================================== 4 | 5 | .. release-notes:: 6 | :branch: stable/stein 7 | -------------------------------------------------------------------------------- /releasenotes/source/train.rst: -------------------------------------------------------------------------------- 1 | ========================================== 2 | Train Series (3.7.0 - 5.0.x) Release Notes 3 | ========================================== 4 | 5 | .. release-notes:: 6 | :branch: stable/train 7 | -------------------------------------------------------------------------------- /releasenotes/source/unreleased.rst: -------------------------------------------------------------------------------- 1 | ============================ 2 | Current Series Release Notes 3 | ============================ 4 | 5 | .. release-notes:: 6 | -------------------------------------------------------------------------------- /releasenotes/source/ussuri.rst: -------------------------------------------------------------------------------- 1 | =========================================== 2 | Ussuri Series Release Notes (6.0.0 - 6.1.x) 3 | =========================================== 4 | 5 | .. release-notes:: 6 | :branch: stable/ussuri 7 | -------------------------------------------------------------------------------- /releasenotes/source/victoria.rst: -------------------------------------------------------------------------------- 1 | ============================================= 2 | Victoria Series (6.2.0 - 6.4.x) Release Notes 3 | ============================================= 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/victoria 7 | -------------------------------------------------------------------------------- /releasenotes/source/wallaby.rst: -------------------------------------------------------------------------------- 1 | ============================================ 2 | Wallaby Series (6.5.0 - 7.0.x) Release Notes 3 | ============================================ 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/wallaby 7 | -------------------------------------------------------------------------------- /releasenotes/source/xena.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Xena Series (8.0.0 - 8.2.x) Release Notes 3 | ========================================= 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/xena 7 | -------------------------------------------------------------------------------- /releasenotes/source/yoga.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Yoga Series (8.3.0 - 8.5.x) Release Notes 3 | ========================================= 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/yoga 7 | -------------------------------------------------------------------------------- /releasenotes/source/zed.rst: -------------------------------------------------------------------------------- 1 | ======================================== 2 | Zed Series (8.6.0 - 9.1.x) Release Notes 3 | ======================================== 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/zed 7 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | pbr>=6.0.0 # Apache-2.0 2 | oslo.config>=9.7.1 # Apache-2.0 3 | oslo.concurrency>=7.1.0 # Apache-2.0 4 | oslo.log>=7.1.0 # Apache-2.0 5 | oslo.service>=4.1.1 # Apache-2.0 6 | oslo.utils>=8.2.0 # Apache-2.0 7 | Pint>=0.5 # BSD 8 | psutil>=3.2.2 # BSD 9 | pyudev>=0.18 # LGPLv2.1+ 10 | requests>=2.14.2 # Apache-2.0 11 | stevedore>=1.20.0 # Apache-2.0 12 | tenacity>=6.2.0 # Apache-2.0 13 | Werkzeug>=2.0.0 # BSD License 14 | cryptography>=2.3 # BSD/Apache-2.0 15 | tooz>=2.7.2 # Apache-2.0 16 | zeroconf>=0.24.0 # LGPL 17 | cheroot>=10.0.1 # BSD 18 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2013 Hewlett-Packard Development Company, L.P. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 12 | # implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | 16 | import setuptools 17 | 18 | setuptools.setup( 19 | setup_requires=['pbr>=6.0.0'], 20 | py_modules=[], 21 | pbr=True) 22 | -------------------------------------------------------------------------------- /test-requirements.txt: -------------------------------------------------------------------------------- 1 | coverage>=4.0 # Apache-2.0 2 | testtools>=2.2.0 # MIT 3 | oslotest>=3.2.0 # Apache-2.0 4 | stestr>=1.0.0 # Apache-2.0 5 | bandit>=1.1.0,<2.0.0 # Apache-2.0 6 | 7 | -------------------------------------------------------------------------------- /tools/config/check_uptodate.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | PROJECT_NAME=${PROJECT_NAME:-ironic_python_agent} 4 | CFGFILE_NAME=${PROJECT_NAME}.conf.sample 5 | OSLO_CFGFILE_OPTION=${OSLO_CFGFILE_OPTION:-tools/config/ipa-config-generator.conf} 6 | 7 | if [ -e etc/${PROJECT_NAME}/${CFGFILE_NAME} ]; then 8 | CFGFILE=etc/${PROJECT_NAME}/${CFGFILE_NAME} 9 | elif [ -e etc/${CFGFILE_NAME} ]; then 10 | CFGFILE=etc/${CFGFILE_NAME} 11 | else 12 | echo "${0##*/}: can not find config file" 13 | exit 1 14 | fi 15 | 16 | TEMPDIR=`mktemp -d /tmp/${PROJECT_NAME}.XXXXXX` 17 | trap "rm -rf $TEMPDIR" EXIT 18 | 19 | oslo-config-generator --config-file=${OSLO_CFGFILE_OPTION} --output-file ${TEMPDIR}/${CFGFILE_NAME} 20 | if [ $? != 0 ]; then 21 | echo "oslo-config-generator failed to create a sample config file ${TEMPDIR}/${CFGFILE_NAME} with --config-file ${OSLO_CFGFILE_OPTION}" 22 | exit 1 23 | fi 24 | 25 | if ! diff -u ${TEMPDIR}/${CFGFILE_NAME} ${CFGFILE}; then 26 | echo "${0##*/}: ${PROJECT_NAME}.conf.sample is not up to date." 27 | echo "${0##*/}: Please run oslo-config-generator --config-file=${OSLO_CFGFILE_OPTION}" 28 | exit 1 29 | fi 30 | -------------------------------------------------------------------------------- /tools/config/ipa-config-generator.conf: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | output_file = etc/ironic_python_agent/ironic_python_agent.conf.sample 3 | wrap_width = 62 4 | namespace = ironic-python-agent 5 | namespace = oslo.log 6 | -------------------------------------------------------------------------------- /tools/run_bashate.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 4 | # not use this file except in compliance with the License. You may obtain 5 | # a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12 | # License for the specific language governing permissions and limitations 13 | # under the License. 14 | 15 | # Ignoring E003(Indent not multiple of 4) 16 | # Ignoring E006(Line longer than 79 characters) 17 | 18 | find "$@" -not \( -type d -name .?\* -prune \) \ 19 | -not \( -type d -name tinyipabuild -prune \) \ 20 | -not \( -type d -name tinyipafinal -prune \) \ 21 | -type f \ 22 | \( \ 23 | -name \*.sh \ 24 | \) \ 25 | -print0 | xargs -0 bashate -v -iE003,E006 -eE005,E042 26 | -------------------------------------------------------------------------------- /tools/with_venv.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | tools_path=${tools_path:-$(dirname $0)} 3 | venv_path=${venv_path:-${tools_path}} 4 | venv_dir=${venv_name:-/../.venv} 5 | TOOLS=${tools_path} 6 | VENV=${venv:-${venv_path}/${venv_dir}} 7 | source ${VENV}/bin/activate && "$@" 8 | -------------------------------------------------------------------------------- /zuul.d/project.yaml: -------------------------------------------------------------------------------- 1 | - project: 2 | templates: 3 | - check-requirements 4 | - openstack-cover-jobs 5 | - openstack-python3-jobs 6 | - openstack-python3-jobs-arm64 7 | - publish-openstack-docs-pti 8 | - release-notes-jobs-python3 9 | check: 10 | jobs: 11 | - openstack-tox-functional 12 | - ipa-tox-bandit 13 | # NOTE(iurygregory) Only run this two jobs since we are testing 14 | # wholedisk + partition on tempest 15 | - ipa-tempest-bios-ipmi-direct-src 16 | - ipa-tempest-uefi-redfish-vmedia-src 17 | - metalsmith-integration-ipa-src-uefi 18 | - ironic-standalone-ipa-src 19 | # NOTE(dtantsur): non-voting because IPA source code is very unlikely 20 | # to break them. They rather serve as a canary for broken POST jobs. 21 | - ironic-python-agent-check-image-dib-centos9: 22 | voting: false 23 | # Non-voting jobs 24 | - ipa-tempest-ironic-inspector-src: 25 | voting: false 26 | gate: 27 | jobs: 28 | - openstack-tox-functional 29 | - ipa-tox-bandit 30 | - ipa-tempest-bios-ipmi-direct-src 31 | - ipa-tempest-uefi-redfish-vmedia-src 32 | - metalsmith-integration-ipa-src-uefi 33 | - ironic-standalone-ipa-src 34 | post: 35 | jobs: 36 | - ironic-python-agent-build-image-dib-centos9 37 | --------------------------------------------------------------------------------