content: [build-system]
  requires = ["pbr>=6.1.1"]
  build-backend = "pbr.build"
  
  [project]
  name = "ironic"
  description = "OpenStack Bare Metal Provisioning"
  authors = [
      {name = "OpenStack", email = "openstack-discuss@lists.openstack.org"},
  ]
  readme = {file = "README.rst", content-type = "text/x-rst"}
  license = {text = "Apache-2.0"}
  dynamic = ["version", "dependencies"]
  requires-python = ">=3.10"
  classifiers = [
    "Development Status :: 5 - Production/Stable",
    "Environment :: OpenStack",
    "Intended Audience :: Information Technology",
    "Intended Audience :: System Administrators",
    "License :: OSI Approved :: Apache Software License",
    "Operating System :: POSIX :: Linux",
    "Programming Language :: Python",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Programming Language :: Python :: 3.13",
  ]
  
  [project.urls]
  Homepage = "https://docs.openstack.org/ironic"
  Repository = "https://opendev.org/openstack/ironic"
  Bugs = "https://bugs.launchpad.net/ironic"
  
  [project.entry-points."ironic.console.container"]
  systemd = "ironic.console.container.systemd:SystemdConsoleContainer"
  fake = "ironic.console.container.fake:FakeConsoleContainer"
  
  # TODO(stephenfin): Remove the oslo.db call that requires this. It's unnecessary
  [project.entry-points."ironic.database.migration_backend"]
  sqlalchemy = "ironic.db.sqlalchemy.migration"
  
  [project.entry-points."ironic.dhcp"]
  dnsmasq = "ironic.dhcp.dnsmasq:DnsmasqDHCPApi"
  neutron = "ironic.dhcp.neutron:NeutronDHCPApi"
  none = "ironic.dhcp.none:NoneDHCPApi"
  
  [project.entry-points."ironic.hardware.interfaces.bios"]
  fake = "ironic.drivers.modules.fake:FakeBIOS"
  idrac-redfish = "ironic.drivers.modules.drac.bios:DracRedfishBIOS"
  ilo = "ironic.drivers.modules.ilo.bios:IloBIOS"
  irmc = "ironic.drivers.modules.irmc.bios:IRMCBIOS"
  no-bios = "ironic.drivers.modules.noop:NoBIOS"
  redfish = "ironic.drivers.modules.redfish.bios:RedfishBIOS"
  
  [project.entry-points."ironic.hardware.interfaces.boot"]
  fake = "ironic.drivers.modules.fake:FakeBoot"
  idrac-redfish-virtual-media = "ironic.drivers.modules.drac.boot:DracRedfishVirtualMediaBoot"
  ilo-pxe = "ironic.drivers.modules.ilo.boot:IloPXEBoot"
  ilo-ipxe = "ironic.drivers.modules.ilo.boot:IloiPXEBoot"
  ilo-virtual-media = "ironic.drivers.modules.ilo.boot:IloVirtualMediaBoot"
  ilo-uefi-https = "ironic.drivers.modules.ilo.boot:IloUefiHttpsBoot"
  ipxe = "ironic.drivers.modules.ipxe:iPXEBoot"
  irmc-pxe = "ironic.drivers.modules.irmc.boot:IRMCPXEBoot"
  irmc-virtual-media = "ironic.drivers.modules.irmc.boot:IRMCVirtualMediaBoot"
  pxe = "ironic.drivers.modules.pxe:PXEBoot"
  redfish-virtual-media = "ironic.drivers.modules.redfish.boot:RedfishVirtualMediaBoot"
  redfish-https = "ironic.drivers.modules.redfish.boot:RedfishHttpsBoot"
  http = "ironic.drivers.modules.pxe:HttpBoot"
  http-ipxe = "ironic.drivers.modules.ipxe:iPXEHttpBoot"
  
  [project.entry-points."ironic.hardware.interfaces.console"]
  fake = "ironic.drivers.modules.fake:FakeConsole"
  fake-graphical = "ironic.drivers.modules.fake:FakeGraphicalConsole"
  ilo = "ironic.drivers.modules.ilo.console:IloConsoleInterface"
  ipmitool-shellinabox = "ironic.drivers.modules.ipmitool:IPMIShellinaboxConsole"
  ipmitool-socat = "ironic.drivers.modules.ipmitool:IPMISocatConsole"
  no-console = "ironic.drivers.modules.noop:NoConsole"
  redfish-graphical = "ironic.drivers.modules.redfish.graphical_console:RedfishGraphicalConsole"
  
  [project.entry-points."ironic.hardware.interfaces.deploy"]
  anaconda = "ironic.drivers.modules.pxe:PXEAnacondaDeploy"
  ansible = "ironic.drivers.modules.ansible.deploy:AnsibleDeploy"
  bootc = "ironic.drivers.modules.agent:BootcAgentDeploy"
  custom-agent = "ironic.drivers.modules.agent:CustomAgentDeploy"
  direct = "ironic.drivers.modules.agent:AgentDeploy"
  fake = "ironic.drivers.modules.fake:FakeDeploy"
  ramdisk = "ironic.drivers.modules.ramdisk:RamdiskDeploy"
  
  [project.entry-points."ironic.hardware.interfaces.firmware"]
  fake = "ironic.drivers.modules.fake:FakeFirmware"
  no-firmware = "ironic.drivers.modules.noop:NoFirmware"
  redfish = "ironic.drivers.modules.redfish.firmware:RedfishFirmware"
  
  [project.entry-points."ironic.hardware.interfaces.inspect"]
  agent = "ironic.drivers.modules.inspector:AgentInspect"
  fake = "ironic.drivers.modules.fake:FakeInspect"
  idrac-redfish = "ironic.drivers.modules.drac.inspect:DracRedfishInspect"
  ilo = "ironic.drivers.modules.ilo.inspect:IloInspect"
  inspector = "ironic.drivers.modules.inspector:Inspector"
  irmc = "ironic.drivers.modules.irmc.inspect:IRMCInspect"
  no-inspect = "ironic.drivers.modules.noop:NoInspect"
  redfish = "ironic.drivers.modules.redfish.inspect:RedfishInspect"
  
  [project.entry-points."ironic.hardware.interfaces.management"]
  fake = "ironic.drivers.modules.fake:FakeManagement"
  idrac-redfish = "ironic.drivers.modules.drac.management:DracRedfishManagement"
  ilo = "ironic.drivers.modules.ilo.management:IloManagement"
  ilo5 = "ironic.drivers.modules.ilo.management:Ilo5Management"
  intel-ipmitool = "ironic.drivers.modules.intel_ipmi.management:IntelIPMIManagement"
  ipmitool = "ironic.drivers.modules.ipmitool:IPMIManagement"
  irmc = "ironic.drivers.modules.irmc.management:IRMCManagement"
  noop = "ironic.drivers.modules.noop_mgmt:NoopManagement"
  redfish = "ironic.drivers.modules.redfish.management:RedfishManagement"
  
  [project.entry-points."ironic.hardware.interfaces.network"]
  flat = "ironic.drivers.modules.network.flat:FlatNetwork"
  neutron = "ironic.drivers.modules.network.neutron:NeutronNetwork"
  noop = "ironic.drivers.modules.network.noop:NoopNetwork"
  
  [project.entry-points."ironic.hardware.interfaces.power"]
  agent = "ironic.drivers.modules.agent_power:AgentPower"
  fake = "ironic.drivers.modules.fake:FakePower"
  idrac-redfish = "ironic.drivers.modules.drac.power:DracRedfishPower"
  ilo = "ironic.drivers.modules.ilo.power:IloPower"
  ipmitool = "ironic.drivers.modules.ipmitool:IPMIPower"
  irmc = "ironic.drivers.modules.irmc.power:IRMCPower"
  redfish = "ironic.drivers.modules.redfish.power:RedfishPower"
  snmp = "ironic.drivers.modules.snmp:SNMPPower"
  
  [project.entry-points."ironic.hardware.interfaces.raid"]
  agent = "ironic.drivers.modules.agent:AgentRAID"
  fake = "ironic.drivers.modules.fake:FakeRAID"
  idrac-redfish = "ironic.drivers.modules.drac.raid:DracRedfishRAID"
  ilo5 = "ironic.drivers.modules.ilo.raid:Ilo5RAID"
  irmc = "ironic.drivers.modules.irmc.raid:IRMCRAID"
  no-raid = "ironic.drivers.modules.noop:NoRAID"
  redfish = "ironic.drivers.modules.redfish.raid:RedfishRAID"
  
  [project.entry-points."ironic.hardware.interfaces.rescue"]
  agent = "ironic.drivers.modules.agent:AgentRescue"
  fake = "ironic.drivers.modules.fake:FakeRescue"
  no-rescue = "ironic.drivers.modules.noop:NoRescue"
  
  [project.entry-points."ironic.hardware.interfaces.storage"]
  fake = "ironic.drivers.modules.fake:FakeStorage"
  noop = "ironic.drivers.modules.storage.noop:NoopStorage"
  cinder = "ironic.drivers.modules.storage.cinder:CinderStorage"
  external = "ironic.drivers.modules.storage.external:ExternalStorage"
  
  [project.entry-points."ironic.hardware.interfaces.vendor"]
  fake = "ironic.drivers.modules.fake:FakeVendorB"
  idrac-redfish = "ironic.drivers.modules.drac.vendor_passthru:DracRedfishVendorPassthru"
  ilo = "ironic.drivers.modules.ilo.vendor:VendorPassthru"
  irmc = "ironic.drivers.modules.irmc.vendor:IRMCVendorPassthru"
  ipmitool = "ironic.drivers.modules.ipmitool:VendorPassthru"
  no-vendor = "ironic.drivers.modules.noop:NoVendor"
  redfish = "ironic.drivers.modules.redfish.vendor:RedfishVendorPassthru"
  
  [project.entry-points."ironic.hardware.types"]
  fake-hardware = "ironic.drivers.fake_hardware:FakeHardware"
  idrac = "ironic.drivers.drac:IDRACHardware"
  ilo = "ironic.drivers.ilo:IloHardware"
  ilo5 = "ironic.drivers.ilo:Ilo5Hardware"
  intel-ipmi = "ironic.drivers.intel_ipmi:IntelIPMIHardware"
  ipmi = "ironic.drivers.ipmi:IPMIHardware"
  irmc = "ironic.drivers.irmc:IRMCHardware"
  manual-management = "ironic.drivers.generic:ManualManagementHardware"
  redfish = "ironic.drivers.redfish:RedfishHardware"
  snmp = "ironic.drivers.snmp:SNMPHardware"
  
  [project.entry-points."ironic.inspection.hooks"]
  ramdisk-error = "ironic.drivers.modules.inspector.hooks.ramdisk_error:RamdiskErrorHook"
  validate-interfaces = "ironic.drivers.modules.inspector.hooks.validate_interfaces:ValidateInterfacesHook"
  ports = "ironic.drivers.modules.inspector.hooks.ports:PortsHook"
  architecture = "ironic.drivers.modules.inspector.hooks.architecture:ArchitectureHook"
  accelerators = " ironic.drivers.modules.inspector.hooks.accelerators:AcceleratorsHook"
  boot-mode = "ironic.drivers.modules.inspector.hooks.boot_mode:BootModeHook"
  cpu-capabilities = "ironic.drivers.modules.inspector.hooks.cpu_capabilities:CPUCapabilitiesHook"
  extra-hardware = "ironic.drivers.modules.inspector.hooks.extra_hardware:ExtraHardwareHook"
  memory = "ironic.drivers.modules.inspector.hooks.memory:MemoryHook"
  pci-devices = "ironic.drivers.modules.inspector.hooks.pci_devices:PciDevicesHook"
  physical-network = "ironic.drivers.modules.inspector.hooks.physical_network:PhysicalNetworkHook"
  raid-device = "ironic.drivers.modules.inspector.hooks.raid_device:RaidDeviceHook"
  root-device = "ironic.drivers.modules.inspector.hooks.root_device:RootDeviceHook"
  local-link-connection = "ironic.drivers.modules.inspector.hooks.local_link_connection:LocalLinkConnectionHook"
  parse-lldp = "ironic.drivers.modules.inspector.hooks.parse_lldp:ParseLLDPHook"
  
  [project.entry-points."oslo.config.opts"]
  ironic = "ironic.conf.opts:list_opts"
  
  [project.entry-points."oslo.config.opts.defaults"]
  ironic = "ironic.conf.opts:update_opt_defaults"
  
  [project.entry-points."oslo.policy.enforcer"]
  ironic = "ironic.common.policy:get_oslo_policy_enforcer"
  
  [project.entry-points."oslo.policy.policies"]
  "ironic.api" = "ironic.common.policy:list_policies"
  
  [project.scripts]
  ironic = "ironic.command.singleprocess:main"
  ironic-api = "ironic.command.api:main"
  ironic-dbsync = "ironic.command.dbsync:main"
  ironic-conductor = "ironic.command.conductor:main"
  ironic-novncproxy = "ironic.command.novncproxy:main"
  ironic-status = "ironic.command.status:main"
  ironic-pxe-filter = "ironic.command.pxe_filter:main"
  
  [project.optional-dependencies]
  guru_meditation_reports = [
      "oslo.reports>=1.18.0", # Apache-2.0
  ]
  i18n = [
      "oslo.i18n>=3.20.0", # Apache-2.0
  ]
  devstack = [
      "virtualbmc>=1.4.0", # Apache-2.0
  ]
  
  [tool.codespell]
  quiet-level = 4
  # Words to ignore:
  # selectin: arg string
  # exept: variable
  # taks: decorator variable
  # ser: short for serialize
  # CNA: Computer Network Administrator
  # MyRAID: class name
  # assertIn: used in unit testing
  # checkin: variable
  # authenticatin: misspelled in the real-world output data we use as a test fixture
  # burnin: documentation referencing actual method name
  ignore-words-list = "selectin,exept,taks,ser,wit,cna,myraid,dum,assertin,checkin,authenticatin,burnin"
  skip = "AUTHORS,ChangeLog,*.pyc,*.inv,*.svg,*.png,*.sample,./doc/build/*,./api-ref/build/*,./releasenotes/build/*,./api-ref/build/*,./build/*"
  
  [tool.setuptools]
  packages = [
      "ironic"
  ]
  
  [tool.setuptools.data-files]
  "share/ironic/vnc-container" = [
      "tools/vnc-container/Containerfile",
      "tools/vnc-container/README.rst",
  ]
  "share/ironic/vnc-container/bin" = [
      "tools/vnc-container/bin/*",
  ]
  "share/ironic/vnc-container/drivers/fake/" = [
      "tools/vnc-container/drivers/fake/*",
  ]
  
  [tool.doc8]
  ignore = ["D001"]
  
  [tool.ruff]
  line-length = 79
  
  [tool.ruff.lint]
  select = [
      "E",        # pycodestyle (error)
      "F",        # pyflakes
      "G",        # flake8-logging-format
      "LOG",      # flake8-logging
  ]
  
  [tool.ruff.lint.per-file-ignores]
  "ironic/tests/**/*.py" = [
      "E402",     # module-import-not-at-top-of-file
  ]
  "ironic/drivers/modules/drac/raid.py" = [
      "G003",     # Logging statement uses `+`
  ]
  