Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ repos:
^ironic_python_agent/tests/unit/test_efi_utils.py$|
)
- repo: https://opendev.org/openstack/hacking
rev: 6.1.0
rev: 7.0.0
hooks:
- id: hacking
additional_dependencies: []
Expand Down
2 changes: 2 additions & 0 deletions ironic_python_agent/tests/unit/extensions/test_standby.py
Original file line number Diff line number Diff line change
Expand Up @@ -1747,6 +1747,7 @@ def test_execute_bootc_install(
instance_info=fake_instance_info,
pull_secret='secret',
configdrive='config!')
res.join()
dispatch_mock.assert_called_once_with('get_os_install_device',
permit_refresh=True)
config_drive_mock.assert_called_once_with('local', '/dev/fake',
Expand Down Expand Up @@ -1816,6 +1817,7 @@ def test_execute_bootc_install_minimal(
instance_info=fake_instance_info,
pull_secret=None,
configdrive=None)
res.join()
dispatch_mock.assert_called_once_with('get_os_install_device',
permit_refresh=True)
config_drive_mock.assert_not_called()
Expand Down
4 changes: 3 additions & 1 deletion ironic_python_agent/tests/unit/test_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -775,7 +775,9 @@ def test__wait_for_interface(self, mock_dispatch, mock_sleep, mock_time):
@mock.patch.object(hardware, 'dispatch_to_managers', autospec=True)
def test__wait_for_interface_expired(self, mock_dispatch, mock_sleep,
mock_time):
mock_time.side_effect = [10, 11, 20, 25, 30]
# Provide enough time values for the test logic plus any logging calls
import itertools
mock_time.side_effect = itertools.cycle([10, 11, 20, 25, 30])
mock_dispatch.side_effect = [[], [], [self.sample_nw_iface], {}]
expected_sleep_calls = [mock.call(agent.NETWORK_WAIT_RETRY)] * 2
expected_dispatch_calls = [mock.call("list_network_interfaces")] * 3
Expand Down
17 changes: 11 additions & 6 deletions ironic_python_agent/tests/unit/test_inspector.py
Original file line number Diff line number Diff line change
Expand Up @@ -657,15 +657,19 @@ def test_boot_only(self, mocked_sleep, mocked_dispatch):
self.assertEqual(2, mocked_dispatch.call_count)

@mock.patch.object(time, 'sleep', autospec=True)
@mock.patch.object(time, 'time_ns', autospec=True,
side_effect=[1000000000, 1100000000])
@mock.patch.object(time, 'time', autospec=True,
side_effect=[1.0, 1.1, 3.1, 3.2])
@mock.patch.object(time, 'time_ns', autospec=True)
@mock.patch.object(time, 'time', autospec=True)
def test_timeout(self, mocked_time, mocked_time_ns, mocked_sleep,
mocked_dispatch):
CONF.set_override('inspection_dhcp_all_interfaces', True)
CONF.set_override('inspection_dhcp_wait_timeout', 1)

# Use itertools.cycle to provide infinite values for any logging calls
import itertools
mocked_time.side_effect = itertools.cycle([1.0, 1.1, 3.1, 3.2])
mocked_time_ns.side_effect = itertools.cycle([1000000000,
1100000000])

mocked_dispatch.return_value = [
hardware.NetworkInterface(name='em0', mac_addr='abcd',
ipv4_address=None),
Expand All @@ -677,9 +681,10 @@ def test_timeout(self, mocked_time, mocked_time_ns, mocked_sleep,
mocked_dispatch.assert_called_with('list_network_interfaces')
mocked_sleep.assert_called_once_with(inspector._DHCP_RETRY_INTERVAL)
# time.time() was called 3 times explicitly in wait_for_dhcp(),
# and 1 in LOG.warning() Python 3.13 uses time.time_ns for logging
# Python 3.13+ uses time.time_ns for logging which varies by logging
# level and coverage configuration, so we cannot assert exact counts
total_time_calls = mocked_time.call_count + mocked_time_ns.call_count
self.assertEqual(4, total_time_calls)
self.assertGreaterEqual(total_time_calls, 3)

def test_disabled(self, mocked_dispatch):
CONF.set_override('inspection_dhcp_wait_timeout', 0)
Expand Down
79 changes: 79 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,80 @@
requires = ["pbr>=6.0.0", "setuptools>=64.0.0"]
build-backend = "pbr.build"

[project]
name = "ironic-python-agent"
description = "Ironic Python Agent Ramdisk"
authors = [
{name = "OpenStack", email = "openstack-discuss@lists.openstack.org"},
]
license = {text = "Apache-2.0"}
readme = {file = "README.rst", content-type = "text/x-rst"}
requires-python = ">=3.10"
classifiers = [
"Environment :: OpenStack",
"Intended Audience :: System Administrators",
"Intended Audience :: Information Technology",
"Operating System :: OS Independent",
"Programming Language :: Python",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
]
dynamic = ["version", "dependencies"]

[project.urls]
Homepage = "https://docs.openstack.org/ironic-python-agent/"

[project.optional-dependencies]
burnin-network-kazoo = [
"kazoo>=2.8.0",
]

[project.entry-points."oslo.config.opts"]
ironic-python-agent = "ironic_python_agent.config:list_opts"
ironic-python-agent-mdns = "ironic_python_agent.mdns:list_opts"

[project.entry-points."ironic_python_agent.extensions"]
standby = "ironic_python_agent.extensions.standby:StandbyExtension"
clean = "ironic_python_agent.extensions.clean:CleanExtension"
deploy = "ironic_python_agent.extensions.deploy:DeployExtension"
flow = "ironic_python_agent.extensions.flow:FlowExtension"
image = "ironic_python_agent.extensions.image:ImageExtension"
log = "ironic_python_agent.extensions.log:LogExtension"
rescue = "ironic_python_agent.extensions.rescue:RescueExtension"
poll = "ironic_python_agent.extensions.poll:PollExtension"
service = "ironic_python_agent.extensions.service:ServiceExtension"
system = "ironic_python_agent.extensions.system:SystemExtension"

[project.entry-points."ironic_python_agent.hardware_managers"]
generic = "ironic_python_agent.hardware:GenericHardwareManager"
mlnx = "ironic_python_agent.hardware_managers.mlnx:MellanoxDeviceHardwareManager"
cna = "ironic_python_agent.hardware_managers.cna:IntelCnaHardwareManager"
container = "ironic_python_agent.hardware_managers.container:ContainerHardwareManager"

[project.entry-points."ironic_python_agent.inspector.collectors"]
default = "ironic_python_agent.inspector:collect_default"
logs = "ironic_python_agent.inspector:collect_logs"
extra-hardware = "ironic_python_agent.inspector:collect_extra_hardware"
pci-devices = "ironic_python_agent.inspector:collect_pci_devices_info"
numa-topology = "ironic_python_agent.numa_inspector:collect_numa_topology_info"
dmi-decode = "ironic_python_agent.dmi_inspector:collect_dmidecode_info"
lldp = "ironic_python_agent.inspector:collect_lldp"
usb-devices = "ironic_python_agent.inspector:collect_usb_devices"

[project.scripts]
ironic-python-agent = "ironic_python_agent.cmd.agent:run"
ironic-collect-introspection-data = "ironic_python_agent.cmd.inspect:run"

[tool.pbr]
autodoc_index_modules = true

[tool.setuptools]
packages = ["ironic_python_agent"]

[tool.ruff]
line-length = 79

Expand All @@ -12,3 +86,8 @@ select = [
"G", # flake8-logging-format
"LOG", # flake8-logging
]

[tool.codespell]
quiet-level = 4
ignore-words-list = "cna,assertin,burnin"
skip = "./releasenotes/build,./venv,./doc/build"
78 changes: 3 additions & 75 deletions setup.cfg
Original file line number Diff line number Diff line change
@@ -1,77 +1,5 @@
# All package metadata has been migrated to pyproject.toml
# This file is kept minimal for PBR compatibility

[metadata]
name = ironic-python-agent
description_file =
README.rst
author = OpenStack
author_email = openstack-discuss@lists.openstack.org
home_page = https://docs.openstack.org/ironic-python-agent/
summary = Ironic Python Agent Ramdisk
license = Apache-2
python_requires = >=3.10
classifier =
Environment :: OpenStack
Intended Audience :: System Administrators
Intended Audience :: Information Technology
License :: OSI Approved :: Apache Software License
Operating System :: OS Independent
Programming Language :: Python
Programming Language :: Python :: Implementation :: CPython
Programming Language :: Python :: 3 :: Only
Programming Language :: Python :: 3
Programming Language :: Python :: 3.10
Programming Language :: Python :: 3.11
Programming Language :: Python :: 3.12

[files]
packages =
ironic_python_agent

[entry_points]
oslo.config.opts =
ironic-python-agent = ironic_python_agent.config:list_opts
ironic-python-agent-mdns = ironic_python_agent.mdns:list_opts

console_scripts =
ironic-python-agent = ironic_python_agent.cmd.agent:run
ironic-collect-introspection-data = ironic_python_agent.cmd.inspect:run

ironic_python_agent.extensions =
standby = ironic_python_agent.extensions.standby:StandbyExtension
clean = ironic_python_agent.extensions.clean:CleanExtension
deploy = ironic_python_agent.extensions.deploy:DeployExtension
flow = ironic_python_agent.extensions.flow:FlowExtension
image = ironic_python_agent.extensions.image:ImageExtension
log = ironic_python_agent.extensions.log:LogExtension
rescue = ironic_python_agent.extensions.rescue:RescueExtension
poll = ironic_python_agent.extensions.poll:PollExtension
service = ironic_python_agent.extensions.service:ServiceExtension
system = ironic_python_agent.extensions.system:SystemExtension

ironic_python_agent.hardware_managers =
generic = ironic_python_agent.hardware:GenericHardwareManager
mlnx = ironic_python_agent.hardware_managers.mlnx:MellanoxDeviceHardwareManager
cna = ironic_python_agent.hardware_managers.cna:IntelCnaHardwareManager
container = ironic_python_agent.hardware_managers.container:ContainerHardwareManager

ironic_python_agent.inspector.collectors =
default = ironic_python_agent.inspector:collect_default
logs = ironic_python_agent.inspector:collect_logs
extra-hardware = ironic_python_agent.inspector:collect_extra_hardware
pci-devices = ironic_python_agent.inspector:collect_pci_devices_info
numa-topology = ironic_python_agent.numa_inspector:collect_numa_topology_info
dmi-decode = ironic_python_agent.dmi_inspector:collect_dmidecode_info
lldp = ironic_python_agent.inspector:collect_lldp
usb-devices = ironic_python_agent.inspector:collect_usb_devices

[extras]
burnin-network-kazoo =
kazoo>=2.8.0 # Apache-2.0

[codespell]
quiet-level = 4
# Words to ignore:
# cna: Intel CNA card
# assertin: valid method in testing
# burnin: name of our burn in methods
ignore-words-list = cna,assertin,burnin
skip = ./releasenotes/build,./venv,./doc/build