ironic-5.1.2/0000755000567000056710000000000012732316670014150 5ustar jenkinsjenkins00000000000000ironic-5.1.2/.mailmap0000644000567000056710000000022412732316044015562 0ustar jenkinsjenkins00000000000000# Format is: # # Joe Gordon ironic-5.1.2/setup.cfg0000644000567000056710000001035612732316670015776 0ustar jenkinsjenkins00000000000000[metadata] name = ironic summary = OpenStack Bare Metal Provisioning description-file = README.rst author = OpenStack author-email = openstack-dev@lists.openstack.org home-page = http://docs.openstack.org/developer/ironic/ classifier = 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 :: 2 Programming Language :: Python :: 2.7 [files] packages = ironic ironic_tempest_plugin [entry_points] console_scripts = ironic-api = ironic.cmd.api:main ironic-dbsync = ironic.cmd.dbsync:main ironic-conductor = ironic.cmd.conductor:main ironic-rootwrap = oslo_rootwrap.cmd:main ironic.dhcp = neutron = ironic.dhcp.neutron:NeutronDHCPApi none = ironic.dhcp.none:NoneDHCPApi ironic.drivers = agent_amt = ironic.drivers.agent:AgentAndAMTDriver agent_iboot = ironic.drivers.agent:AgentAndIBootDriver agent_ilo = ironic.drivers.ilo:IloVirtualMediaAgentDriver agent_ipmitool = ironic.drivers.agent:AgentAndIPMIToolDriver agent_irmc = ironic.drivers.irmc:IRMCVirtualMediaAgentDriver agent_pxe_oneview = ironic.drivers.oneview:AgentPXEOneViewDriver agent_pyghmi = ironic.drivers.agent:AgentAndIPMINativeDriver agent_ssh = ironic.drivers.agent:AgentAndSSHDriver agent_vbox = ironic.drivers.agent:AgentAndVirtualBoxDriver agent_ucs = ironic.drivers.agent:AgentAndUcsDriver agent_wol = ironic.drivers.agent:AgentAndWakeOnLanDriver fake = ironic.drivers.fake:FakeDriver fake_agent = ironic.drivers.fake:FakeAgentDriver fake_inspector = ironic.drivers.fake:FakeIPMIToolInspectorDriver fake_ipmitool = ironic.drivers.fake:FakeIPMIToolDriver fake_ipminative = ironic.drivers.fake:FakeIPMINativeDriver fake_ssh = ironic.drivers.fake:FakeSSHDriver fake_pxe = ironic.drivers.fake:FakePXEDriver fake_seamicro = ironic.drivers.fake:FakeSeaMicroDriver fake_iboot = ironic.drivers.fake:FakeIBootDriver fake_ilo = ironic.drivers.fake:FakeIloDriver fake_drac = ironic.drivers.fake:FakeDracDriver fake_snmp = ironic.drivers.fake:FakeSNMPDriver fake_irmc = ironic.drivers.fake:FakeIRMCDriver fake_vbox = ironic.drivers.fake:FakeVirtualBoxDriver fake_amt = ironic.drivers.fake:FakeAMTDriver fake_msftocs = ironic.drivers.fake:FakeMSFTOCSDriver fake_ucs = ironic.drivers.fake:FakeUcsDriver fake_cimc = ironic.drivers.fake:FakeCIMCDriver fake_wol = ironic.drivers.fake:FakeWakeOnLanDriver fake_oneview = ironic.drivers.fake:FakeOneViewDriver iscsi_ilo = ironic.drivers.ilo:IloVirtualMediaIscsiDriver iscsi_irmc = ironic.drivers.irmc:IRMCVirtualMediaIscsiDriver iscsi_pxe_oneview = ironic.drivers.oneview:ISCSIPXEOneViewDriver pxe_ipmitool = ironic.drivers.pxe:PXEAndIPMIToolDriver pxe_ipminative = ironic.drivers.pxe:PXEAndIPMINativeDriver pxe_ssh = ironic.drivers.pxe:PXEAndSSHDriver pxe_vbox = ironic.drivers.pxe:PXEAndVirtualBoxDriver pxe_seamicro = ironic.drivers.pxe:PXEAndSeaMicroDriver pxe_iboot = ironic.drivers.pxe:PXEAndIBootDriver pxe_ilo = ironic.drivers.pxe:PXEAndIloDriver pxe_drac = ironic.drivers.drac:PXEDracDriver pxe_snmp = ironic.drivers.pxe:PXEAndSNMPDriver pxe_irmc = ironic.drivers.pxe:PXEAndIRMCDriver pxe_amt = ironic.drivers.pxe:PXEAndAMTDriver pxe_msftocs = ironic.drivers.pxe:PXEAndMSFTOCSDriver pxe_ucs = ironic.drivers.pxe:PXEAndUcsDriver pxe_wol = ironic.drivers.pxe:PXEAndWakeOnLanDriver pxe_iscsi_cimc = ironic.drivers.pxe:PXEAndCIMCDriver pxe_agent_cimc = ironic.drivers.agent:AgentAndCIMCDriver ironic.database.migration_backend = sqlalchemy = ironic.db.sqlalchemy.migration tempest.test_plugins = ironic_tests = ironic_tempest_plugin.plugin:IronicTempestPlugin [pbr] autodoc_index_modules = True autodoc_exclude_modules = ironic.db.sqlalchemy.alembic.env ironic.db.sqlalchemy.alembic.versions.* [build_sphinx] all_files = 1 build-dir = doc/build source-dir = doc/source [egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 [compile_catalog] directory = ironic/locale domain = ironic [update_catalog] domain = ironic output_dir = ironic/locale input_file = ironic/locale/ironic.pot [extract_messages] keywords = _ gettext ngettext l_ lazy_gettext mapping_file = babel.cfg output_file = ironic/locale/ironic.pot [wheel] universal = 1 ironic-5.1.2/test-requirements.txt0000644000567000056710000000164012732316050020402 0ustar jenkinsjenkins00000000000000# The order of packages is significant, because pip processes them in the order # of appearance. Changing the order has an impact on the overall integration # process, which may cause wedges in the gate later. hacking<0.11,>=0.10.0 coverage>=3.6 # Apache-2.0 doc8 # Apache-2.0 fixtures<2.0,>=1.3.1 # Apache-2.0/BSD mock>=1.2 # BSD Babel!=2.3.0,!=2.3.1,!=2.3.2,!=2.3.3,>=1.3 # BSD PyMySQL>=0.6.2 # MIT License iso8601>=0.1.9 # MIT oslotest>=1.10.0 # Apache-2.0 psycopg2>=2.5 # LGPL/ZPL python-ironicclient>=1.1.0 # Apache-2.0 python-subunit>=0.0.18 # Apache-2.0/BSD testtools>=1.4.0 # MIT os-testr>=0.4.1 # Apache-2.0 testresources>=0.2.4 # Apache-2.0/BSD testscenarios>=0.4 # Apache-2.0/BSD WebTest>=2.0 # MIT bashate>=0.2 # Apache-2.0 # Doc requirements sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2 # BSD sphinxcontrib-pecanwsme>=0.8 # Apache-2.0 sphinxcontrib-seqdiag # BSD oslosphinx!=3.4.0,>=2.5.0 # Apache-2.0 reno>=0.1.1 # Apache2 ironic-5.1.2/driver-requirements.txt0000644000567000056710000000241512732316044020722 0ustar jenkinsjenkins00000000000000# This file lists all python libraries which are utilized by drivers, # but not listed in global-requirements. # It is intended to help package maintainers to discover additional # python projects they should package as optional dependencies for Ironic. # These are available on pypi proliantutils>=2.1.7 pyghmi>=0.8.0 pysnmp python-ironic-inspector-client python-oneviewclient<3.0.0,>=2.0.2 python-scciclient>=0.3.0 python-seamicroclient>=0.4.0 UcsSdk==0.8.2.2 python-dracclient>=0.0.5 # The amt driver imports a python module called "pywsman", but this does not # exist on pypi. # It is installed by the openwsman-python (on RH) or python-openwsman (on deb) # package, from https://github.com/Openwsman/openwsman/blob/master/bindings/python/Makefile.am#L29 # There is *also* a "wsman" module on pypi ... but I think that's the wrong one. # The iboot driver does not seem to have any available packages or pip modules, # but the source is available here: # https://github.com/darkip/python-iboot # 'pxe_vbox' and 'agent_vbox' drivers require pyremotevbox library. # Refer documentation on how to install and configure this: # http://docs.openstack.org/developer/ironic/drivers/vbox.html pyremotevbox>=0.5.0 # The CIMC drivers use the Cisco IMC SDK version 0.7.2 or greater ImcSdk>=0.7.2 ironic-5.1.2/releasenotes/0000755000567000056710000000000012732316670016641 5ustar jenkinsjenkins00000000000000ironic-5.1.2/releasenotes/notes/0000755000567000056710000000000012732316670017771 5ustar jenkinsjenkins00000000000000ironic-5.1.2/releasenotes/notes/drac-missing-lookup-3ad98e918e1a852a.yaml0000644000567000056710000000021112732316044026755 0ustar jenkinsjenkins00000000000000--- fixes: - Add missing "lookup" method to the pxe_drac driver vendor interface enabling it to be deployed using the IPA ramdisk. ironic-5.1.2/releasenotes/notes/radosgw-temp-url-b04aac50698b4461.yaml0000644000567000056710000000021312732316044026202 0ustar jenkinsjenkins00000000000000--- features: - Adds support for using Glance with a Ceph backend via the RADOS Gateway Swift API, with the Agent deploy driver. ironic-5.1.2/releasenotes/notes/bug-1506657-3bcb4ef46623124d.yaml0000644000567000056710000000100012732316044024455 0ustar jenkinsjenkins00000000000000--- upgrade: - Adds a new configuration option, hash_ring_reset_interval, to control how often the conductor's view of the hash ring is reset. This has a default of 180 seconds, the same as the default for the sync_local_state periodic task that used to handle this reset. critical: - Fixes a bug where the conductor's view of the hash ring was never refreshed if the sync_local_state periodic task was disabled. For more info, see https://bugs.launchpad.net/ironic/+bug/1506657. ironic-5.1.2/releasenotes/notes/add-oneview-driver-96088bf470b16c34.yaml0000644000567000056710000000020612732316044026423 0ustar jenkinsjenkins00000000000000--- features: - Adds `agent_pxe_oneview` and `iscsi_pxe_oneview` drivers for integration with the HP OneView Management System. ironic-5.1.2/releasenotes/notes/ssh-console-58721af6830f8892.yaml0000644000567000056710000000011012732316044025112 0ustar jenkinsjenkins00000000000000--- features: - Adds ShellinaboxConsole support for virsh SSH driver. ironic-5.1.2/releasenotes/notes/fix-cve-2016-4985-b62abae577025365.yaml0000644000567000056710000000124512732316050025335 0ustar jenkinsjenkins00000000000000--- security: - A critical security vulnerability (CVE-2016-4985) was fixed in this release. Previously, a client with network access to the ironic-api service was able to bypass Keystone authentication and retrieve all information about any Node registered with Ironic, if they knew (or were able to guess) the MAC address of a network card belonging to that Node, by sending a crafted POST request to the /v1/drivers/$DRIVER_NAME/vendor_passthru resource. Ironic's policy.json configuration is now respected when responding to this request such that, if passwords should be masked for other requests, they are also masked for this request. ironic-5.1.2/releasenotes/notes/fix-cleaning-spawn-error-60b60281f3be51c2.yaml0000644000567000056710000000022712732316044027613 0ustar jenkinsjenkins00000000000000--- fixes: - Fix issues with error handling when spawning a new thread to continue cleaning. See https://bugs.launchpad.net/ironic/+bug/1539118. ironic-5.1.2/releasenotes/notes/add-ipv6-pxe-support-8fb51c355cc977c4.yaml0000644000567000056710000000021512732316044027013 0ustar jenkinsjenkins00000000000000--- features: - Adds experimental support for IPv6 PXE booting. This is configurable via the [pxe]ip_version configuration option. ironic-5.1.2/releasenotes/notes/name-root-device-hints-a1484ea01e399065.yaml0000644000567000056710000000011112732316044027175 0ustar jenkinsjenkins00000000000000--- features: - Root device hints extended to support the device name. ironic-5.1.2/releasenotes/notes/5.0-release-afb1fbbe595b6bc8.yaml0000644000567000056710000000033712732316044025311 0ustar jenkinsjenkins00000000000000--- prelude: > This release adds support for manual cleaning and RAID configuration. Operators may now manually run clean steps, including setting up RAID on a node, while a node is in the manageable state. ironic-5.1.2/releasenotes/notes/ilo-firmware-update-manual-clean-step-e6763dc6dc0d441b.yaml0000644000567000056710000000021412732316044032321 0ustar jenkinsjenkins00000000000000--- features: - iLO drivers now provide out-of-band firmware update as a manual cleaning step, for supported hardware components. ironic-5.1.2/releasenotes/notes/futurist-e9c55699f479f97a.yaml0000644000567000056710000000132312732316044024735 0ustar jenkinsjenkins00000000000000--- prelude: > This release features switch to Oslo Futurist library for asynchronous thread execution and periodic tasks. Main benefit is that periodic tasks are now executed truly in parallel, and not sequentially in one green thread. upgrade: - Configuration option "workers_pool_size" can no longer be less or equal to 2. Please set it to greater value (the default is 100) before update. deprecations: - Configuration option "periodic_interval" is deprecated. - Using "driver_periodic_task" decorator is deprecated. Please update your out-of-tree drivers to use "periodics.periodic" decorator from Futurist library. fixes: - Periodic tasks are no longer executed all in one thread. ironic-5.1.2/releasenotes/notes/release-4.3.0-cc531ab7190f8a00.yaml0000644000567000056710000000016312732316044025127 0ustar jenkinsjenkins00000000000000--- prelude: > Ironic's 4.3.0 release brings a number of new features, driver enhancements, and bug fixes. ironic-5.1.2/releasenotes/notes/root-api-version-info-9dd6cadd3d3d4bbe.yaml0000644000567000056710000000045012732316044027610 0ustar jenkinsjenkins00000000000000--- features: - | The API root endpoint (GET /) now returns version information for the server; specifically: * min_version - minimum API version supported by the server; * version - maximum API version supported by the server; * status - version status, "CURRENT" for v1. ironic-5.1.2/releasenotes/notes/update-irmc-set-boot-device-fd50d9dce42aaa89.yaml0000644000567000056710000000027312732316044030512 0ustar jenkinsjenkins00000000000000--- fixes: - This forces iRMC vmedia boot from remotely connected (redirected) CD/DVD instead of default CD/DVD. See https://bugs.launchpad.net/ironic/+bug/1561852 for details. ironic-5.1.2/releasenotes/notes/manual-clean-4cc2437be1aea69a.yaml0000644000567000056710000000031712732316044025554 0ustar jenkinsjenkins00000000000000--- features: - Adds support for manual cleaning. This is available with API version 1.15. For more information, see http://docs.openstack.org/developer/ironic/deploy/cleaning.html#manual-cleaning ironic-5.1.2/releasenotes/notes/fix-api-access-logs-68b9ca4f411f339c.yaml0000644000567000056710000000021012732316044026621 0ustar jenkinsjenkins00000000000000--- fixes: - API service once again records HTTP access logs. See https://bugs.launchpad.net/ironic/+bug/1536828 for details. ironic-5.1.2/releasenotes/notes/list-nodes-by-driver-a1ab9f2b73f652f8.yaml0000644000567000056710000000012512732316044027130 0ustar jenkinsjenkins00000000000000--- features: - Add support for filtering nodes using the same driver via the API. ironic-5.1.2/releasenotes/notes/clear-target-stable-states-4545602d7aed9898.yaml0000644000567000056710000000023712732316044030073 0ustar jenkinsjenkins00000000000000--- fixes: - Ensure node's target_provision_state is cleared when the node is moved to a stable state, indicating that the state transition is done. ironic-5.1.2/releasenotes/notes/boot-ipxe-inc-workaround-548e10d1d6616752.yaml0000644000567000056710000000026712732316044027521 0ustar jenkinsjenkins00000000000000--- fixes: - Make boot.ipxe fallback to its previous behavior on *really* old iPXE ROMs where 'inc' command is not available at all, see https://launchpad.net/bugs/1507738. ironic-5.1.2/releasenotes/notes/ilo-license-activate-manual-clean-step-84d335998d708b49.yaml0000644000567000056710000000015712732316044032204 0ustar jenkinsjenkins00000000000000--- features: - Support for activation of iLO Advanced license as a manual cleaning step in iLO drivers. ironic-5.1.2/releasenotes/notes/drac-migrate-to-dracclient-2bd8a6d1dd3fdc69.yaml0000644000567000056710000000126612732316044030402 0ustar jenkinsjenkins00000000000000--- fixes: - DRAC driver migrated from ``pywsman`` to ``python-dracclient`` fixing the driver lockup issue caused by the python interpreter not handling signals when execution handed to the c library. - Fixes an issue with setting the boot device multiple times without a reboot in the DRAC driver by setting the boot device only before power management operations. upgrade: - Dependency for DRAC driver changed from ``pywsman`` to ``python-dracclient`` with version >= 0.0.5. Exceptions thrown by the driver and return values of the ``set_bios_config``, ``commit_bios_config`` and ``abandon_bios_config`` methods changed on the vendor-passthru interface. ironic-5.1.2/releasenotes/notes/update-python-scciclient-required-version-71398d5d5e1c0bf8.yaml0000644000567000056710000000043012732316044033311 0ustar jenkinsjenkins00000000000000--- upgrade: - Updated python-scciclient required version number for iRMC driver to 0.3.0 which fixed the bug '#1518999' and '#1519000'. fixes: - Updated python-scciclient required version number for iRMC driver to 0.3.0 which fixed the bug '#1518999' and '#1519000'. ironic-5.1.2/releasenotes/notes/ilo-automated-cleaning-fails-14ee438de3dd8690.yaml0000644000567000056710000000035612732316044030520 0ustar jenkinsjenkins00000000000000--- fixes: - Fixes issue where automated cleaning fails for iLO drivers. Automated cleaning fails for iLO driver if iLO is in System POST state. iLO does not allow setting of boot device when it is in System POST state. ironic-5.1.2/releasenotes/notes/pass-region-to-swiftclient-c8c8bf1020f62ebc.yaml0000644000567000056710000000034412732316044030417 0ustar jenkinsjenkins00000000000000--- fixes: - Fixes a bug where the keystone_authtoken/region_name wasn't passed to Swift when instantiating its client, in a multi-region environment this is needed so the client can choose the correct swift endpoint. ironic-5.1.2/releasenotes/notes/wwn-extension-root-device-hints-de40ca1444ba4888.yaml0000644000567000056710000000014212732316044031245 0ustar jenkinsjenkins00000000000000--- features: - Adds root device hints for `wwn_with_extension` and `wwn_vendor_extension`. ironic-5.1.2/releasenotes/notes/ipxe-and-uefi-7722bd5db71df02c.yaml0000644000567000056710000000007412732316044025573 0ustar jenkinsjenkins00000000000000--- features: - Adds support for using iPXE in UEFI mode. ironic-5.1.2/releasenotes/notes/oob-power-off-7bbdf5947ed24bf8.yaml0000644000567000056710000000057312732316044025730 0ustar jenkinsjenkins00000000000000--- fixes: - Fixes a problem where some hardware/firmware (specially faulty ones) won't come back online after an in-band ACPI soft power off by adding a new driver property called "deploy_forces_oob_reboot" that can be set to the nodes being deployed by the IPA ramdisk. If the value of this property is True, Ironic will power cycle the node via out-of-band. ironic-5.1.2/releasenotes/notes/ilo-boot-interface-92831b78c5614733.yaml0000644000567000056710000000010312732316044026251 0ustar jenkinsjenkins00000000000000--- other: - iLO drivers are now based on the new BootInterface. ironic-5.1.2/releasenotes/notes/validate-node-properties-73509ee40f409ca2.yaml0000644000567000056710000000023512732316044027712 0ustar jenkinsjenkins00000000000000--- fixes: - The `cpus`, `local_gb`, and `memory_mb` properties of a node are now validated at input time to ensure they are non-negative numbers. ironic-5.1.2/releasenotes/notes/ipxe-uefi-f5be11c7b0606a84.yaml0000644000567000056710000000025412732316044024752 0ustar jenkinsjenkins00000000000000--- fixes: - Fixes bug where ironic reboots the node with deploy image instead of the user image during second reboot in uefi boot mode when ipxe is enabled. ironic-5.1.2/releasenotes/notes/fix-ipxe-template-for-whole-disk-image-943da0311ca7aeb5.yaml0000644000567000056710000000024312732316044032400 0ustar jenkinsjenkins00000000000000--- fixes: - Fixes an issue with the provided iPXE template where whole disk images could not be booted. See https://bugs.launchpad.net/ironic/+bug/1524403. ironic-5.1.2/releasenotes/notes/get-supported-boot-devices-manadatory-task-0462fc072d6ea517.yaml0000644000567000056710000000032212732316044033255 0ustar jenkinsjenkins00000000000000--- upgrade: - The `task` parameter to `ManagementInterface.get_supported_boot_devices` was previously deprecated as optional, and is now mandatory for all implementations of ManagementInterface. ironic-5.1.2/releasenotes/notes/notimplementederror-misspell-276a181afd652cf6.yaml0000644000567000056710000000042112732316044031007 0ustar jenkinsjenkins00000000000000--- fixes: - In conductor/rpcapi.py, object_backport_version(), object_action() and object_class_action_versions() misspell NotImplementedError with NotImplemented which returns nothing useful to users. See https://bugs.launchpad.net/ironic/+bug/1524163. ironic-5.1.2/releasenotes/notes/snmp-reboot-delay-d18ee3f6c6fc0998.yaml0000644000567000056710000000037712732316044026537 0ustar jenkinsjenkins00000000000000--- upgrade: - Adds a configuration option for the Iboot driver, [iboot]reboot_delay, to allow adding a pause between power off and power on. fixes: - Fixes an issue where some SNMP power controllers will not power back on after a deploy. ironic-5.1.2/releasenotes/notes/opentack-baremetal-request-id-daa72b785eaaaa8d.yaml0000644000567000056710000000013112732316044031170 0ustar jenkinsjenkins00000000000000--- features: - Append request_id as ``Openstack-Request-Id`` header to the response. ironic-5.1.2/releasenotes/notes/node-name-remove-720aa8007f2f8b75.yaml0000644000567000056710000000015112732316044026136 0ustar jenkinsjenkins00000000000000--- fixes: - Fixes an issue that prevented the node name to be removed as part of the node update. ironic-5.1.2/releasenotes/notes/amt-driver-wake-up-0880ed85476968be.yaml0000644000567000056710000000110112732316044026364 0ustar jenkinsjenkins00000000000000--- upgrade: - Adds a config [amt]awake_interval for the interval to wake up the AMT interface for a node. This should correspond to the IdleTimeout config option on the AMT interface. Setting to 0 will disable waking the AMT interface, just like setting IdleTimeout=0 on the AMT interface will disable the AMT interface from sleeping when idle. fixes: - Fixes an issue with talking to a sleeping AMT interface by waking up the interface before sending commands, if needed. This is configured with the [amt]awake_interval config option. ironic-5.1.2/releasenotes/notes/ipa-streams-raw-images-1010327b0dad763c.yaml0000644000567000056710000000122312732316044027236 0ustar jenkinsjenkins00000000000000--- features: - The Agent deploy driver now streams raw images directly to disk (instead of staging in memory) by default. upgrade: - The Agent deploy driver now streams raw images directly to disk (instead of staging in memory) by default; this can be turned off by setting the [agent]stream_raw_images configuration option to False. Streaming may be undesirable if the disk the image is being written is significantly slower than the network. fixes: - Because the agent deploy driver now streams raw images directly to disk, images larger than the RAM available to the deploy ramdisk will no longer fail to deploy. ironic-5.1.2/releasenotes/notes/add-agent-proxy-support-790e629634ca2eb7.yaml0000644000567000056710000000217112732316044027532 0ustar jenkinsjenkins00000000000000--- features: - Pass proxy information from agent driver to IPA ramdisk, so that images can be cached on the proxy server. issues: - When using caching proxy with ``agent_*`` drivers, caching the image on the proxy server might involve increasing [glance]swift_temp_url_duration config option value. This way, the cached entry will be valid for a period of time long enough to see the benefits of caching. Large temporary URL duration might become a security issue in some cases. upgrade: - Adds a [glance]swift_temp_url_cache_enabled configuration option to enable Swift temporary URL caching. It is only useful if the caching proxy is used. Also adds [glance]swift_temp_url_expected_download_start_delay, which is used to check if the Swift temporary URL duration is long enough to let the image download to start, and, if temporary URL caching is enabled, to determine if a cached entry will be still valid when download starts. The value of [glance]swift_temp_url_expected_download_start_delay must be less than the value for the [glance]swift_temp_url_duration configuration option.ironic-5.1.2/releasenotes/notes/fix-clean-steps-not-running-0d065cb022bc0419.yaml0000644000567000056710000000056712732316044030246 0ustar jenkinsjenkins00000000000000--- prelude: > A major bug was fixed where clean steps do not run. critical: - This fixes a bug where Ironic skipped all clean steps, which may leave the previous tenant's data on disk available to new users. security: - This fixes a bug where Ironic skipped all clean steps, which may leave the previous tenant's data on disk available to new users. ironic-5.1.2/releasenotes/notes/automated_clean_config-0170c95ae210f953.yaml0000644000567000056710000000027012732316044027367 0ustar jenkinsjenkins00000000000000--- deprecations: - The [conductor]/clean_nodes config is deprecated and will be removed in the Newton cycle. It has been replaced by the [conductor]/automated_clean config. ironic-5.1.2/releasenotes/notes/no-downward-sql-migration-52279e875cd8b7a3.yaml0000644000567000056710000000033112732316044030043 0ustar jenkinsjenkins00000000000000--- features: - Database migrations downgrade support was removed. More info about database migration/rollback could be found here http://docs.openstack.org/openstack-ops/content/ops_upgrades-roll-back.html ironic-5.1.2/releasenotes/notes/disk-label-capability-d36d126e0ad36dca.yaml0000644000567000056710000000026312732316044027341 0ustar jenkinsjenkins00000000000000--- features: - Add support for a new capability called 'disk_label' to allow operators to choose the disk label that will be used when Ironic is partitioning the disk. ironic-5.1.2/releasenotes/notes/irmc-boot-interface-8c2e26affd1ebfc4.yaml0000644000567000056710000000010412732316044027211 0ustar jenkinsjenkins00000000000000--- other: - iRMC drivers are now based on the new BootInterface. ironic-5.1.2/releasenotes/notes/refactor-ironic-lib-22939896d8d46a77.yaml0000644000567000056710000000127712732316044026537 0ustar jenkinsjenkins00000000000000--- upgrade: - | Adds new configuration [ironic_lib]root_helper, to specify the command that is prefixed to commands that are run as root. Defaults to using the rootwrap config file at /etc/ironic/rootwrap.conf. - | Moves these configuration options from [deploy] group to the new [disk_utils] group: efi_system_partition_size, dd_block_size and iscsi_verify_attempts. deprecations: - | The following configuration options have been moved to the [disk_utils] group; they are deprecated from the [deploy] group: efi_system_partition_size, dd_block_size and iscsi_verify_attempts. other: - Code related to disk partitioning was moved to ironic-lib. ironic-5.1.2/releasenotes/notes/.placeholder0000644000567000056710000000000012732316044022235 0ustar jenkinsjenkins00000000000000ironic-5.1.2/releasenotes/notes/add-ssl-support-4547801eedba5942.yaml0000644000567000056710000000022012732316044026042 0ustar jenkinsjenkins00000000000000--- features: - The ironic-api service now supports SSL when running the service directly (as opposed to behind mod_wsgi or similar). ironic-5.1.2/releasenotes/notes/xenserver-ssh-driver-398084fe91ac56f1.yaml0000644000567000056710000000011612732316044027123 0ustar jenkinsjenkins00000000000000--- features: - Adds support to the SSH power driver for XenServer VMs. ironic-5.1.2/releasenotes/notes/disk-label-fix-7580de913835ff44.yaml0000644000567000056710000000020012732316044025526 0ustar jenkinsjenkins00000000000000--- fixes: - Fixes the bug where the user specified disk_label is ignored for the agent drivers for partition images. ironic-5.1.2/releasenotes/notes/fix-sync-power-state-last-error-65fa42bad8e38c3b.yaml0000644000567000056710000000020312732316044031317 0ustar jenkinsjenkins00000000000000--- fixes: - Fixes an issue where `node.last_error` did not show the actual issue when the periodic power state sync failed. ironic-5.1.2/releasenotes/notes/iscsi-inband-cleaning-bff87aac16e5d488.yaml0000644000567000056710000000021212732316044027354 0ustar jenkinsjenkins00000000000000--- features: - Adds support for in-band clean steps in the iSCSI deploy driver, when using ironic-python-agent as the ramdisk. ironic-5.1.2/releasenotes/notes/agent_partition_image-48a03700f41a3980.yaml0000644000567000056710000000012112732316044027157 0ustar jenkinsjenkins00000000000000--- features: - Adds support for partition images for agent based drivers. ironic-5.1.2/releasenotes/notes/fix-ipxe-macro-4ae8bc4fe82e8f19.yaml0000644000567000056710000000016712732316044026076 0ustar jenkinsjenkins00000000000000--- fixes: - Fixes an issue where iPXE may try to boot from the wrong MAC address, resulting in deploy failures. ironic-5.1.2/releasenotes/notes/agent-wol-driver-4116f64907d0db9c.yaml0000644000567000056710000000020112732316044026166 0ustar jenkinsjenkins00000000000000--- features: - Adds an `agent_wol` driver that combines the Agent deploy interface with the Wake-On-LAN power driver. ironic-5.1.2/releasenotes/notes/debug-no-api-tracebacks-a8a0caddc9676b06.yaml0000644000567000056710000000034412732316044027572 0ustar jenkinsjenkins00000000000000--- upgrade: - Adds a config option 'debug_tracebacks_in_api' to allow the API service to return tracebacks in API responses in an error condition. fixes: - No longer returns tracebacks for API errors in debug mode. ironic-5.1.2/releasenotes/notes/add-choice-to-some-options-9fb327c48e6bfda1.yaml0000644000567000056710000000155412732316044030271 0ustar jenkinsjenkins00000000000000--- upgrade: - | Add ``choices`` parameter to config options. Invalid values will be rejected when first accessing them, which can happen in the middle of deployment. ================================= ================ Option Choices ================================= ================ [DEFAULT]/auth_strategy keystone, noauth [glance]/auth_strategy keystone, noauth [glance]/glance_protocol http, https [neutron]/auth_strategy keystone, noauth [amt]/protocol http, https [irmc]/remote_image_share_type CIFS, NFS [irmc]/port 443, 80 [irmc]/auth_method basic, digest [irmc]/sensor_method ipmitool, scci ================================= ================ ironic-5.1.2/releasenotes/notes/add-agent-iboot-0a4b5471c6ace461.yaml0000644000567000056710000000017012732316044026006 0ustar jenkinsjenkins00000000000000--- features: - Adds an `agent_iboot` driver to allow use of the Iboot power driver with the Agent deploy driver. ironic-5.1.2/releasenotes/notes/ipxe_timeout_parameter-03fc3c76c520fac2.yaml0000644000567000056710000000016712732316044027711 0ustar jenkinsjenkins00000000000000--- features: - Add the ability to adjust ipxe timeout during image downloading, default is still unlimited (0). ironic-5.1.2/releasenotes/notes/fix-mac-address-48060f9e2847a38c.yaml0000644000567000056710000000011712732316044025705 0ustar jenkinsjenkins00000000000000--- fixes: - This fixes InvalidMAC exception of iRMC out-of-band inspection. ironic-5.1.2/releasenotes/notes/bug-1518374-decd73fd82c2eb94.yaml0000644000567000056710000000017112732316044024722 0ustar jenkinsjenkins00000000000000--- critical: - Fixes an issue where the next cleaning for a node would hang if the previous cleaning was aborted. ironic-5.1.2/releasenotes/notes/disable-clean-step-reset-ilo-1869a6e08f39901c.yaml0000644000567000056710000000034612732316044030300 0ustar jenkinsjenkins00000000000000--- fixes: - Disables default execution of clean step 'reset_ilo' during automated cleaning. Resetting of iLO is not required during every invocation of automated cleaning. If required, operator can enable the same. ironic-5.1.2/releasenotes/notes/Add-port-option-support-to-ipmitool-e125d07fe13c53e7.yaml0000644000567000056710000000025512732316044032031 0ustar jenkinsjenkins00000000000000--- features: - Add support for ipmitool's port (-p) option. This allows ipmitool support for operators that do not use the default port (623) as their IPMI port. ironic-5.1.2/releasenotes/notes/dhcp-provider-clean-dhcp-9352717903d6047e.yaml0000644000567000056710000000024112732316044027334 0ustar jenkinsjenkins00000000000000--- other: - Adds a `clean_dhcp_opts` method to the DHCP provider base class, to give DHCP providers a method to clean up DHCP reservations if needed. ironic-5.1.2/releasenotes/notes/inspector-for-cisco-bffe1d1af7aec677.yaml0000644000567000056710000000011012732316044027251 0ustar jenkinsjenkins00000000000000--- features: - Enabled Inspector Inspection for CIMC and UCS drivers ironic-5.1.2/releasenotes/notes/inspection-agent-drivers-cad619ec8a4874b1.yaml0000644000567000056710000000014012732316044030066 0ustar jenkinsjenkins00000000000000--- features: - Adds inspection support for the `agent_ipmitool` and `agent_ssh` drivers. ironic-5.1.2/releasenotes/notes/fix-ipmitool-console-empty-password-a8edc5e2a1a7daf6.yaml0000644000567000056710000000014312732316044032433 0ustar jenkinsjenkins00000000000000--- fixes: - Fixes an issue where ipmitool console did not work with an empty IPMI password. ironic-5.1.2/releasenotes/notes/bug-1548086-ed88646061b88faf.yaml0000644000567000056710000000070012732316044024513 0ustar jenkinsjenkins00000000000000--- features: - Adds support to pass a optional CA certificate using [glance]glance_cafile configuration option to validate the SSL certificate served by glance for secured https communication between Glance and Ironic. upgrade: - Adds a [glance]glance_cafile configuration option to pass a optional certificate for secured https communication. It is used when [glance]glance_api_insecure configuration option is set to False. ironic-5.1.2/releasenotes/notes/fix-agent-ilo-temp-image-cleanup-711429d0e67807ae.yaml0000644000567000056710000000021512732316044031041 0ustar jenkinsjenkins00000000000000--- fixes: - Fixes an issue where the `agent_ilo` driver did not correctly clean up temporary files created during the deploy process. ironic-5.1.2/releasenotes/notes/fix-ipmi-numeric-password-75e080aa8bdfb9a2.yaml0000644000567000056710000000020612732316044030242 0ustar jenkinsjenkins00000000000000--- fixes: - Fixes an issue where ironic could not communicate with IPMI endpoints when the password consisted of only numbers. ironic-5.1.2/releasenotes/notes/irmc-oob-inspection-6d072c60f6c88ecb.yaml0000644000567000056710000000011012732316044027022 0ustar jenkinsjenkins00000000000000--- features: - Adds out-of-band inspection support for iRMC drivers. ironic-5.1.2/releasenotes/source/0000755000567000056710000000000012732316670020141 5ustar jenkinsjenkins00000000000000ironic-5.1.2/releasenotes/source/index.rst0000644000567000056710000000076412732316050022001 0ustar jenkinsjenkins00000000000000===================== Ironic Release Notes ===================== .. toctree:: :maxdepth: 1 Current (4.3.0 - unreleased) Mitaka (4.3.0 - unreleased) Liberty (4.0.0 - 4.2.x) Kilo (2015.1) Juno (2014.2) Icehouse (2014.1) .. toctree:: :hidden: unreleased ironic-5.1.2/releasenotes/source/current-series.rst0000644000567000056710000000015312732316044023637 0ustar jenkinsjenkins00000000000000============================ Current Series Release Notes ============================ .. release-notes:: ironic-5.1.2/releasenotes/source/conf.py0000644000567000056710000002156012732316044021437 0ustar jenkinsjenkins00000000000000# -*- coding: utf-8 -*- # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. # Ironic Release Notes documentation build configuration file, created by # sphinx-quickstart on Tue Nov 3 17:40:50 2015. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.insert(0, os.path.abspath('.')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'oslosphinx', 'reno.sphinxext', ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Ironic Release Notes' copyright = u'2015, Ironic Developers' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. from ironic.version import version_info as ironic_version # The full version, including alpha/beta/rc tags. release = ironic_version.version_string_with_vcs() # The short X.Y version. version = ironic_version.canonical_version_string() # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [] # The reST default role (used for this markup: `text`) to use for all # documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. # keep_warnings = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. # html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'IronicReleaseNotesdoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # 'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ('index', 'IronicReleaseNotes.tex', u'Ironic Release Notes Documentation', u'Ironic Developers', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'ironicreleasenotes', u'Ironic Release Notes Documentation', [u'Ironic Developers'], 1) ] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'IronicReleaseNotes', u'Ironic Release Notes Documentation', u'Ironic Developers', 'IronicReleaseNotes', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. # texinfo_no_detailmenu = False ironic-5.1.2/releasenotes/source/liberty.rst0000644000567000056710000002020712732316044022341 0ustar jenkinsjenkins00000000000000============================ Liberty Series Release Notes ============================ .. release-notes:: :branch: origin/stable/liberty .. _V4-2-1: 4.2.1 ===== This release is a patch release on top of 4.2.0, as part of the stable Liberty series. Full details are available on Launchpad: https://launchpad.net/ironic/liberty/4.2.1. * Import Japanese translations - our first major translation addition! * Fix a couple of locale issues with deployments, when running on a system using the Japanese locale .. _V4-2-0: 4.2.0 ===== This release is proposed as the stable Liberty release for Ironic, and brings with it some bug fixes and small features. Full release details are available on Launchpad: https://launchpad.net/ironic/liberty/4.2.0. * Deprecated the bash ramdisk The older bash ramdisk built by diskimage-builder is now deprecated and support will be removed at the beginning of the "N" development cycle. Users should migrate to a ramdisk running ironic-python-agent, which now also supports the pxe_* drivers that the bash ramdisk was responsible for. For more info on building an ironic-python-agent ramdisk, see: http://docs.openstack.org/developer/ironic/deploy/install-guide.html#building-or-downloading-a-deploy-ramdisk-image * Raised API version to 1.14 * 1.12 allows setting RAID properties for a node; however support for putting this configuration on a node is not yet implemented for in-tree drivers; this will be added in a future release. * 1.13 adds a new 'abort' verb to the provision state API. This may be used to abort cleaning for nodes in the CLEANWAIT state. * 1.14 makes the following endpoints discoverable in the API: * /v1/nodes//states * /v1/drivers//properties * Implemented a new Boot interface for drivers This change enhances the driver interface for driver authors, and should not affect users of Ironic, by splitting control of booting a server from the DeployInterface. The BootInterface is responsible for booting an image on a server, while the DeployInterface is responsible for deploying a tenant image to a server. This has been implemented in most in-tree drivers, and is a backwards-compatible change for out-of-tree drivers. The following in-tree drivers will be updated in a forth-coming release: * agent_ilo * agent_irmc * iscsi_ilo * iscsi_irmc * Implemented a new RAID interface for drivers This change enhances the driver interface for driver authors. Drivers may begin implementing this interface to support RAID configuration for nodes. This is not yet implemented for any in-tree drivers. * Image size is now checked before deployment with agent drivers The agent must download the tenant image in full before writing it to disk. As such, the server being deployed must have enough RAM for running the agent and storing the image. This is now checked before Ironic tells the agent to deploy an image. An optional config [agent]memory_consumed_by_agent is provided. When Ironic does this check, this config option may be set to factor in the amount of RAM to reserve for running the agent. * Added Cisco IMC driver This driver supports managing Cisco UCS C-series servers through the CIMC API, rather than IPMI. Documentation is available at: http://docs.openstack.org/developer/ironic/drivers/cimc.html * iLO virtual media drivers can work without Swift iLO virtual media drivers (iscsi_ilo and agent_ilo) can work standalone without Swift, by configuring an HTTP(S) server for hosting the deploy/boot images. A web server needs to be running on every conductor node and needs to be configured in ironic.conf. iLO driver documentation is available at: http://docs.openstack.org/developer/ironic/drivers/ilo.html Known issues ~~~~~~~~~~~~ * Out of tree drivers may be broken by this release. The AgentDeploy and ISCSIDeploy (formerly known as PXEDeploy) classes now depend on drivers to utilize an instance of a BootInterface. For drivers that exist out of tree, that use these deploy classes, an error will be thrown during deployment. There is a simple fix. For drivers that expect these deploy classes to handle PXE booting, one can add the following code to the driver's `__init__` method:: from ironic.drivers.modules import pxe class YourDriver(...): def __init__(self): # ... self.boot = pxe.PXEBoot() A driver that handles booting itself (for example, a driver that implements booting from virtual media) should use the following to make calls to the boot interface a no-op:: from ironic.drivers.modules import fake class YourDriver(...) def __init__(self): # ... self.boot = fake.FakeBoot() Additionally, as mentioned before, `ironic.drivers.modules.pxe.PXEDeploy` has moved to `ironic.drivers.modules.iscsi_deploy.ISCSIDeploy`, which will break drivers that use this class. The Ironic team apologizes profusely for this inconvenience. .. _V4-1-0: 4.1.0 ===== This brings some bug fixes and small features on top of Ironic 4.0.0. Major changes are listed below, and full release details are available on Launchpad: https://launchpad.net/ironic/liberty/4.1.0. * Added CORS support The Ironic API now has support for CORS requests, that may be used by, for example, web browser-based clients. This is configured in the [cors] section of ironic.conf. * Removed deprecated 'admin_api' policy rule * Deprecated the 'parallel' option to periodic task decorator .. _V4-0-0: 4.0.0 First semver release ============================ This is the first semver-versioned release of Ironic, created during the OpenStack "Liberty" development cycle. It marks a pivot in our versioning schema from date-based versioning; the previous released version was 2015.1. Full release details are available on Launchpad: https://launchpad.net/ironic/liberty/4.0.0. * Raised API version to 1.11 - v1.7 exposes a new 'clean_step' property on the Node resource. - v1.8 and v1.9 improve query and filter support - v1.10 fixes Node logical names to support all `RFC 3986`_ unreserved characters - v1.11 changes the default state of newly created Nodes from AVAILABLE to ENROLL * Support for the new ENROLL workflow during Node creation Previously, all Nodes were created in the "available" provision state - before management credentials were validated, hardware was burned in, etc. This could lead to workloads being scheduled to Nodes that were not yet ready for it. Beginning with API v1.11, newly created Nodes begin in the ENROLL state, and must be "managed" and "provided" before they are made available for provisioning. API clients must be updated to handle the new workflow when they begin sending the X-OpenStack-Ironic-API-Version header with a value >= 1.11. * Migrations from Nova "baremetal" have been removed After a deprecation period, the scripts and support for migrating from the old Nova "baremetal" driver to the new Nova "ironic" driver have been removed from Ironic's tree. * Removal of deprecated vendor driver methods A new @passthru decorator was introduced to the driver API in a previous release. In this release, support for vendor_passthru and driver_vendor_passthru methods has been removed. All in-tree drivers have been updated. Any out of tree drivers which did not update to the @passthru decorator during the previous release will need to do so to be compatible with this release. * Introduce new BootInterface to the Driver API Drivers may optionally add a new BootInterface. This is merely a refactoring of the Driver API to support future improvements. * Several hardware drivers have been added or enhanced - Add OCS Driver - Add UCS Driver - Add Wake-On-Lan Power Driver - ipmitool driver supports IPMI v1.5 - Add support to SNMP driver for "APC MasterSwitchPlus" series PDU's - pxe_ilo driver now supports UEFI Secure Boot (previous releases of the iLO driver only supported this for agent_ilo and iscsi_ilo) - Add Virtual Media support to iRMC Driver - Add BIOS config to DRAC Driver - PXE drivers now support GRUB2 .. _`RFC 3986`: https://www.ietf.org/rfc/rfc3986.txt ironic-5.1.2/releasenotes/source/_templates/0000755000567000056710000000000012732316670022276 5ustar jenkinsjenkins00000000000000ironic-5.1.2/releasenotes/source/_templates/.placeholder0000644000567000056710000000000012732316044024542 0ustar jenkinsjenkins00000000000000ironic-5.1.2/releasenotes/source/mitaka.rst0000644000567000056710000000021312732316050022125 0ustar jenkinsjenkins00000000000000============================ Mitaka Series Release Notes ============================ .. release-notes:: :branch: origin/stable/mitaka ironic-5.1.2/releasenotes/source/unreleased.rst0000644000567000056710000000004012732316044023007 0ustar jenkinsjenkins00000000000000.. include:: current-series.rst ironic-5.1.2/releasenotes/source/_static/0000755000567000056710000000000012732316670021567 5ustar jenkinsjenkins00000000000000ironic-5.1.2/releasenotes/source/_static/.placeholder0000644000567000056710000000000012732316044024033 0ustar jenkinsjenkins00000000000000ironic-5.1.2/AUTHORS0000644000567000056710000002525512732316667015237 0ustar jenkinsjenkins00000000000000119Vik Adam Gandelman Alberto Planas Alessandro Pilotti Alex Meade Alexander Gordeev Alexis Lee Ana Krivokapic Andreas Jaeger Andreas Jaeger Andrew Bogott Andrey Kurilin Angus Thomas Anita Kuno Anne Gentle Anson Y.W Anton Arefiev Anusha Ramineni Anusha Ramineni Aparna Arata Notsu Armando Migliaccio Artem Rozumenko Bernard Van De Walle Bertrand Lallau Bob Ball Boris Pavlovic Brian Elliott Brian Waldon Bruno Cornec Béla Vancsics Caio Oliveira Cameron.C Chang Bo Guo ChangBo Guo(gcb) Chris Behrens Chris Dearborn Chris Jones Chris Krelle Chris Krelle Chris Krelle Chris St. Pierre Christian Berendt Chuck Short Claudiu Belu Clif Houck Dan Prince Dan Smith Dan Smith Daryl Walleck Davanum Srinivas Davanum Srinivas David Hewson David Kang David McNally David Shrewsbury Davide Guerri Debayan Ray Derek Higgins Devananda van der Veen Dima Shulyak Dirk Mueller Dmitry Nikishov Dmitry Tantsur Dmitry Tantsur DongCan Dongdong Zhou Doug Hellmann Edwin Zhai Ellen Hui Emilien Macchi Erhan Ekici Eric Guo Eric Windisch Faizan Barmawer Fang Jinxing Fengqian Gao Gabriel Assis Bezerra Ghe Rivero Ghe Rivero Ghe Rivero Gonéri Le Bouder Gregory Haynes Grzegorz Grasza Hadi Bannazadeh Hans Lindgren Haomeng, Wang Harshada Mangesh Kakad He Yongli Hironori Shiina Hugo Nicodemos IWAMOTO Toshihiro Ihar Hrachyshka Ilya Pekelny Imre Farkas Ionut Balutoiu Jacek Tomasiak James E. Blair James Slagle Jason Kölker Jay Faulkner Jeremy Stanley Jesse Andrews Jim Rollenhagen Jing Sun Joe Gordon Johannes Erdfelt John Garbutt John L. Villalovos John Trowbridge Josh Gachnang Joshua Harlow Joshua Harlow Julia Kreger Julien Danjou Junya Akahira KATO Tomoyuki Kan Ken Igarashi Kun Huang Kurt Taylor Kurt Taylor Kyle Stevenson Laura Moore Lenny Verkhovsky Lilia Lilia Sampaio Lin Tan Lin Tan Lucas Alvares Gomes Marco Morais Marcus Rafael Mario Villaplana Mark Atwood Mark Goddard Mark McDonagh Mark McLoughlin Mark Silence Martin Kletzander Martyn Taylor Mathieu GagneÌ Mathieu Mitchell Matt Joyce Matt Keeann Matt Wagner Matthew Gilliard Matthew Treinish Mauro S. M. Rodrigues Max Lobur Max Lobur Michael Davies Michael Kerrin Michael Krotscheck Michael Still Michael Turek Michey Mehta michey.mehta@hp.com Mike Turek Mikhail Durnosvistov Mikyung Kang Miles Gould Mitsuhiro SHIGEMATSU Mitsuhiro SHIGEMATSU Monty Taylor Motohiro OTSUKA Motohiro Otsuka Naohiro Tamura Nguyen Hung Phuong Nisha Agarwal Om Kumar OndÅ™ej Nový Pablo Fernando Cargnelutti Pavlo Shchelokovskyy Peeyush Gupta Peng Yong Phil Day Pádraig Brady Rafi Khardalian Rakesh H S Ramakrishnan G Rick Harris Robert Collins Robert Collins Rohan Kanade Rohan Kanade Roman Bogorodskiy Roman Dashevsky Roman Podoliaka Roman Prykhodchenko Roman Prykhodchenko Ruby Loo Russell Bryant Russell Haering SHIGEMATSU Mitsuhiro Sam Betts Sana Khan Sandhya Balakrishnan Sandy Walsh Sanjay Kumar Singh Sascha Peilicke Sascha Peilicke Satoru Moriya Sean Dague Sean Dague Serge Kovaleff Sergey Lukjanov Sergey Lupersolsky Sergey Lupersolsky Sergey Nikitin Sergey Vilgelm Shane Wang Shilla Saebi Shinn'ya Hoshino Shivanand Tendulker Shuangtai Tian Shuichiro MAKIGAKI Shuquan Huang Sinval Vieira Sirushti Murugesan Srinivasa Acharya Stanislaw Pitucha Steven Dake Steven Hardy Stig Telfer Tan Lin Thiago Paiva Thierry Carrez Tom Fifield Tony Breeds Tushar Kalra Vic Howard Victor Lowther Victor Sergeyev Vikas Jain Vinay B S Vishvananda Ishaya Vladyslav Drok Wang Wei Wanghua Wei Du Xian Dong, Meng Xian Dong, Meng Xiaobin Qu Yatin Kumbhare Yuiko Takada Yun Mao Yuriy Taraday Yuriy Zveryanskyy Yushiro FURUKAWA Zhang Yang Zhao Lei Zhenguo Niu Zhenguo Niu Zhenzan Zhou ZhiQiang Fan ZhiQiang Fan Zhongyue Luo Zhongyue Luo baiyuan chenghang chenglch dekehn divakar-padiyar-nandavar dparalen gaoxiaoyong ghanshyam houming-wang jiangfei jiangwt100 jinxingfang jxiaobin lei-zhang-99cloud linggao lvdongbing max_lobur ryo.kurahashi saripurigopi sjing sonu.kumar stephane tanlin vishal mahajan vmud213 vsaienko whaom whitekid yangxurong yunhong jiang zouyee ironic-5.1.2/CONTRIBUTING.rst0000644000567000056710000000051112732316044016601 0ustar jenkinsjenkins00000000000000If you would like to contribute to the development of OpenStack, you must follow the steps documented at: http://docs.openstack.org/infra/manual/developers.html#development-workflow Pull requests submitted through GitHub will be ignored. Bugs should be filed on Launchpad, not GitHub: https://bugs.launchpad.net/ironic ironic-5.1.2/ironic.egg-info/0000755000567000056710000000000012732316670017125 5ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic.egg-info/not-zip-safe0000644000567000056710000000000112732316454021353 0ustar jenkinsjenkins00000000000000 ironic-5.1.2/ironic.egg-info/entry_points.txt0000644000567000056710000000577712732316667022451 0ustar jenkinsjenkins00000000000000[console_scripts] ironic-api = ironic.cmd.api:main ironic-conductor = ironic.cmd.conductor:main ironic-dbsync = ironic.cmd.dbsync:main ironic-rootwrap = oslo_rootwrap.cmd:main [ironic.database.migration_backend] sqlalchemy = ironic.db.sqlalchemy.migration [ironic.dhcp] neutron = ironic.dhcp.neutron:NeutronDHCPApi none = ironic.dhcp.none:NoneDHCPApi [ironic.drivers] agent_amt = ironic.drivers.agent:AgentAndAMTDriver agent_iboot = ironic.drivers.agent:AgentAndIBootDriver agent_ilo = ironic.drivers.ilo:IloVirtualMediaAgentDriver agent_ipmitool = ironic.drivers.agent:AgentAndIPMIToolDriver agent_irmc = ironic.drivers.irmc:IRMCVirtualMediaAgentDriver agent_pxe_oneview = ironic.drivers.oneview:AgentPXEOneViewDriver agent_pyghmi = ironic.drivers.agent:AgentAndIPMINativeDriver agent_ssh = ironic.drivers.agent:AgentAndSSHDriver agent_ucs = ironic.drivers.agent:AgentAndUcsDriver agent_vbox = ironic.drivers.agent:AgentAndVirtualBoxDriver agent_wol = ironic.drivers.agent:AgentAndWakeOnLanDriver fake = ironic.drivers.fake:FakeDriver fake_agent = ironic.drivers.fake:FakeAgentDriver fake_amt = ironic.drivers.fake:FakeAMTDriver fake_cimc = ironic.drivers.fake:FakeCIMCDriver fake_drac = ironic.drivers.fake:FakeDracDriver fake_iboot = ironic.drivers.fake:FakeIBootDriver fake_ilo = ironic.drivers.fake:FakeIloDriver fake_inspector = ironic.drivers.fake:FakeIPMIToolInspectorDriver fake_ipminative = ironic.drivers.fake:FakeIPMINativeDriver fake_ipmitool = ironic.drivers.fake:FakeIPMIToolDriver fake_irmc = ironic.drivers.fake:FakeIRMCDriver fake_msftocs = ironic.drivers.fake:FakeMSFTOCSDriver fake_oneview = ironic.drivers.fake:FakeOneViewDriver fake_pxe = ironic.drivers.fake:FakePXEDriver fake_seamicro = ironic.drivers.fake:FakeSeaMicroDriver fake_snmp = ironic.drivers.fake:FakeSNMPDriver fake_ssh = ironic.drivers.fake:FakeSSHDriver fake_ucs = ironic.drivers.fake:FakeUcsDriver fake_vbox = ironic.drivers.fake:FakeVirtualBoxDriver fake_wol = ironic.drivers.fake:FakeWakeOnLanDriver iscsi_ilo = ironic.drivers.ilo:IloVirtualMediaIscsiDriver iscsi_irmc = ironic.drivers.irmc:IRMCVirtualMediaIscsiDriver iscsi_pxe_oneview = ironic.drivers.oneview:ISCSIPXEOneViewDriver pxe_agent_cimc = ironic.drivers.agent:AgentAndCIMCDriver pxe_amt = ironic.drivers.pxe:PXEAndAMTDriver pxe_drac = ironic.drivers.drac:PXEDracDriver pxe_iboot = ironic.drivers.pxe:PXEAndIBootDriver pxe_ilo = ironic.drivers.pxe:PXEAndIloDriver pxe_ipminative = ironic.drivers.pxe:PXEAndIPMINativeDriver pxe_ipmitool = ironic.drivers.pxe:PXEAndIPMIToolDriver pxe_irmc = ironic.drivers.pxe:PXEAndIRMCDriver pxe_iscsi_cimc = ironic.drivers.pxe:PXEAndCIMCDriver pxe_msftocs = ironic.drivers.pxe:PXEAndMSFTOCSDriver pxe_seamicro = ironic.drivers.pxe:PXEAndSeaMicroDriver pxe_snmp = ironic.drivers.pxe:PXEAndSNMPDriver pxe_ssh = ironic.drivers.pxe:PXEAndSSHDriver pxe_ucs = ironic.drivers.pxe:PXEAndUcsDriver pxe_vbox = ironic.drivers.pxe:PXEAndVirtualBoxDriver pxe_wol = ironic.drivers.pxe:PXEAndWakeOnLanDriver [tempest.test_plugins] ironic_tests = ironic_tempest_plugin.plugin:IronicTempestPlugin ironic-5.1.2/ironic.egg-info/pbr.json0000644000567000056710000000005612732316667020612 0ustar jenkinsjenkins00000000000000{"is_release": true, "git_version": "affec22"}ironic-5.1.2/ironic.egg-info/SOURCES.txt0000644000567000056710000005700012732316670021013 0ustar jenkinsjenkins00000000000000.mailmap .testr.conf AUTHORS CONTRIBUTING.rst ChangeLog LICENSE README.rst RELEASE-NOTES Vagrantfile babel.cfg driver-requirements.txt requirements.txt setup.cfg setup.py test-requirements.txt tox.ini vagrant.yaml devstack/plugin.sh devstack/settings devstack/files/apache-ironic.template devstack/files/debs/ironic devstack/files/hooks/qemu devstack/files/rpms/ironic devstack/lib/ironic devstack/tools/ironic/scripts/cleanup-node.sh devstack/tools/ironic/scripts/configure-vm.py devstack/tools/ironic/scripts/create-node.sh devstack/tools/ironic/scripts/setup-network.sh devstack/tools/ironic/templates/brbm.xml devstack/tools/ironic/templates/tftpd-xinetd.template devstack/tools/ironic/templates/vm.xml devstack/upgrade/settings devstack/upgrade/shutdown.sh devstack/upgrade/upgrade.sh doc/source/conf.py doc/source/index.rst doc/source/cmds/ironic-dbsync.rst doc/source/deploy/cleaning.rst doc/source/deploy/drivers.rst doc/source/deploy/install-guide.rst doc/source/deploy/radosgw.rst doc/source/deploy/raid.rst doc/source/deploy/troubleshooting.rst doc/source/deploy/upgrade-guide.rst doc/source/deploy/user-guide.rst doc/source/dev/architecture.rst doc/source/dev/code-contribution-guide.rst doc/source/dev/contributing.rst doc/source/dev/dev-quickstart.rst doc/source/dev/drivers.rst doc/source/dev/faq.rst doc/source/dev/states.rst doc/source/dev/vendor-passthru.rst doc/source/drivers/amt.rst doc/source/drivers/cimc.rst doc/source/drivers/iboot.rst doc/source/drivers/ilo.rst doc/source/drivers/ipa.rst doc/source/drivers/ipmitool.rst doc/source/drivers/irmc.rst doc/source/drivers/oneview.rst doc/source/drivers/seamicro.rst doc/source/drivers/snmp.rst doc/source/drivers/ucs.rst doc/source/drivers/vbox.rst doc/source/drivers/wol.rst doc/source/drivers/xenserver.rst doc/source/images/conceptual_architecture.png doc/source/images/deployment_architecture_2.png doc/source/images/deployment_steps.png doc/source/images/logical_architecture.png doc/source/images/states.svg doc/source/images_src/deployment_steps.svg doc/source/releasenotes/index.rst doc/source/webapi/v1.rst etc/apache2/ironic etc/ironic/ironic.conf.sample etc/ironic/policy.json etc/ironic/rootwrap.conf etc/ironic/rootwrap.d/ironic-images.filters etc/ironic/rootwrap.d/ironic-lib.filters etc/ironic/rootwrap.d/ironic-utils.filters ironic/__init__.py ironic/netconf.py ironic/version.py ironic.egg-info/PKG-INFO ironic.egg-info/SOURCES.txt ironic.egg-info/dependency_links.txt ironic.egg-info/entry_points.txt ironic.egg-info/not-zip-safe ironic.egg-info/pbr.json ironic.egg-info/requires.txt ironic.egg-info/top_level.txt ironic/api/__init__.py ironic/api/acl.py ironic/api/app.py ironic/api/app.wsgi ironic/api/config.py ironic/api/expose.py ironic/api/hooks.py ironic/api/controllers/__init__.py ironic/api/controllers/base.py ironic/api/controllers/link.py ironic/api/controllers/root.py ironic/api/controllers/v1/__init__.py ironic/api/controllers/v1/chassis.py ironic/api/controllers/v1/collection.py ironic/api/controllers/v1/driver.py ironic/api/controllers/v1/node.py ironic/api/controllers/v1/port.py ironic/api/controllers/v1/state.py ironic/api/controllers/v1/types.py ironic/api/controllers/v1/utils.py ironic/api/controllers/v1/versions.py ironic/api/middleware/__init__.py ironic/api/middleware/auth_token.py ironic/api/middleware/parsable_error.py ironic/cmd/__init__.py ironic/cmd/api.py ironic/cmd/conductor.py ironic/cmd/dbsync.py ironic/common/__init__.py ironic/common/boot_devices.py ironic/common/config.py ironic/common/context.py ironic/common/dhcp_factory.py ironic/common/driver_factory.py ironic/common/exception.py ironic/common/fsm.py ironic/common/grub_conf.template ironic/common/hash_ring.py ironic/common/i18n.py ironic/common/image_service.py ironic/common/images.py ironic/common/isolinux_config.template ironic/common/keystone.py ironic/common/network.py ironic/common/paths.py ironic/common/policy.py ironic/common/pxe_utils.py ironic/common/raid.py ironic/common/rpc.py ironic/common/safe_utils.py ironic/common/service.py ironic/common/states.py ironic/common/swift.py ironic/common/utils.py ironic/common/config_generator/__init__.py ironic/common/config_generator/generator.py ironic/common/glance_service/__init__.py ironic/common/glance_service/base_image_service.py ironic/common/glance_service/service.py ironic/common/glance_service/service_utils.py ironic/common/glance_service/v1/__init__.py ironic/common/glance_service/v1/image_service.py ironic/common/glance_service/v2/__init__.py ironic/common/glance_service/v2/image_service.py ironic/conductor/__init__.py ironic/conductor/base_manager.py ironic/conductor/manager.py ironic/conductor/rpcapi.py ironic/conductor/task_manager.py ironic/conductor/utils.py ironic/db/__init__.py ironic/db/api.py ironic/db/migration.py ironic/db/sqlalchemy/__init__.py ironic/db/sqlalchemy/alembic.ini ironic/db/sqlalchemy/api.py ironic/db/sqlalchemy/migration.py ironic/db/sqlalchemy/models.py ironic/db/sqlalchemy/alembic/README ironic/db/sqlalchemy/alembic/env.py ironic/db/sqlalchemy/alembic/script.py.mako ironic/db/sqlalchemy/alembic/versions/1e1d5ace7dc6_add_inspection_started_at_and_.py ironic/db/sqlalchemy/alembic/versions/21b331f883ef_add_provision_updated_at.py ironic/db/sqlalchemy/alembic/versions/242cc6a923b3_add_node_maintenance_reason.py ironic/db/sqlalchemy/alembic/versions/2581ebaf0cb2_initial_migration.py ironic/db/sqlalchemy/alembic/versions/2fb93ffd2af1_increase_node_name_length.py ironic/db/sqlalchemy/alembic/versions/31baaf680d2b_add_node_instance_info.py ironic/db/sqlalchemy/alembic/versions/3ae36a5f5131_add_logical_name.py ironic/db/sqlalchemy/alembic/versions/3bea56f25597_add_unique_constraint_to_instance_uuid.py ironic/db/sqlalchemy/alembic/versions/3cb628139ea4_nodes_add_console_enabled.py ironic/db/sqlalchemy/alembic/versions/487deb87cc9d_add_conductor_affinity_and_online.py ironic/db/sqlalchemy/alembic/versions/48d6c242bb9b_add_node_tags.py ironic/db/sqlalchemy/alembic/versions/4f399b21ae71_add_node_clean_step.py ironic/db/sqlalchemy/alembic/versions/516faf1bb9b1_resizing_column_nodes_driver.py ironic/db/sqlalchemy/alembic/versions/5674c57409b9_replace_nostate_with_available.py ironic/db/sqlalchemy/alembic/versions/5ea1b0d310e_added_port_group_table_and_altered_ports.py ironic/db/sqlalchemy/alembic/versions/789acc877671_add_raid_config.py ironic/db/sqlalchemy/alembic/versions/bb59b63f55a_add_node_driver_internal_info.py ironic/db/sqlalchemy/alembic/versions/f6fdb920c182_set_pxe_enabled_true.py ironic/dhcp/__init__.py ironic/dhcp/base.py ironic/dhcp/neutron.py ironic/dhcp/none.py ironic/drivers/__init__.py ironic/drivers/agent.py ironic/drivers/base.py ironic/drivers/drac.py ironic/drivers/fake.py ironic/drivers/ilo.py ironic/drivers/irmc.py ironic/drivers/oneview.py ironic/drivers/pxe.py ironic/drivers/raid_config_schema.json ironic/drivers/utils.py ironic/drivers/modules/__init__.py ironic/drivers/modules/agent.py ironic/drivers/modules/agent_base_vendor.py ironic/drivers/modules/agent_client.py ironic/drivers/modules/agent_config.template ironic/drivers/modules/boot.ipxe ironic/drivers/modules/console_utils.py ironic/drivers/modules/deploy_utils.py ironic/drivers/modules/elilo_efi_pxe_config.template ironic/drivers/modules/fake.py ironic/drivers/modules/iboot.py ironic/drivers/modules/image_cache.py ironic/drivers/modules/inspector.py ironic/drivers/modules/ipminative.py ironic/drivers/modules/ipmitool.py ironic/drivers/modules/ipxe_config.template ironic/drivers/modules/iscsi_deploy.py ironic/drivers/modules/master_grub_cfg.txt ironic/drivers/modules/pxe.py ironic/drivers/modules/pxe_config.template ironic/drivers/modules/pxe_grub_config.template ironic/drivers/modules/seamicro.py ironic/drivers/modules/snmp.py ironic/drivers/modules/ssh.py ironic/drivers/modules/virtualbox.py ironic/drivers/modules/wol.py ironic/drivers/modules/amt/__init__.py ironic/drivers/modules/amt/common.py ironic/drivers/modules/amt/management.py ironic/drivers/modules/amt/power.py ironic/drivers/modules/amt/resource_uris.py ironic/drivers/modules/amt/vendor.py ironic/drivers/modules/cimc/__init__.py ironic/drivers/modules/cimc/common.py ironic/drivers/modules/cimc/management.py ironic/drivers/modules/cimc/power.py ironic/drivers/modules/drac/__init__.py ironic/drivers/modules/drac/bios.py ironic/drivers/modules/drac/common.py ironic/drivers/modules/drac/job.py ironic/drivers/modules/drac/management.py ironic/drivers/modules/drac/power.py ironic/drivers/modules/drac/vendor_passthru.py ironic/drivers/modules/ilo/__init__.py ironic/drivers/modules/ilo/boot.py ironic/drivers/modules/ilo/common.py ironic/drivers/modules/ilo/console.py ironic/drivers/modules/ilo/deploy.py ironic/drivers/modules/ilo/firmware_processor.py ironic/drivers/modules/ilo/inspect.py ironic/drivers/modules/ilo/management.py ironic/drivers/modules/ilo/power.py ironic/drivers/modules/ilo/vendor.py ironic/drivers/modules/irmc/__init__.py ironic/drivers/modules/irmc/boot.py ironic/drivers/modules/irmc/common.py ironic/drivers/modules/irmc/inspect.py ironic/drivers/modules/irmc/management.py ironic/drivers/modules/irmc/power.py ironic/drivers/modules/msftocs/__init__.py ironic/drivers/modules/msftocs/common.py ironic/drivers/modules/msftocs/management.py ironic/drivers/modules/msftocs/msftocsclient.py ironic/drivers/modules/msftocs/power.py ironic/drivers/modules/oneview/__init__.py ironic/drivers/modules/oneview/common.py ironic/drivers/modules/oneview/management.py ironic/drivers/modules/oneview/power.py ironic/drivers/modules/oneview/vendor.py ironic/drivers/modules/ucs/__init__.py ironic/drivers/modules/ucs/helper.py ironic/drivers/modules/ucs/management.py ironic/drivers/modules/ucs/power.py ironic/locale/ironic-log-critical.pot ironic/locale/ironic-log-error.pot ironic/locale/ironic-log-info.pot ironic/locale/ironic-log-warning.pot ironic/locale/ironic.pot ironic/locale/fr/LC_MESSAGES/ironic-log-critical.po ironic/locale/ja/LC_MESSAGES/ironic-log-critical.po ironic/locale/ja/LC_MESSAGES/ironic.po ironic/locale/ko_KR/LC_MESSAGES/ironic-log-critical.po ironic/locale/pt_BR/LC_MESSAGES/ironic-log-critical.po ironic/nova/__init__.py ironic/nova/compute/__init__.py ironic/nova/compute/manager.py ironic/objects/__init__.py ironic/objects/base.py ironic/objects/chassis.py ironic/objects/conductor.py ironic/objects/fields.py ironic/objects/node.py ironic/objects/port.py ironic/objects/portgroup.py ironic/tests/__init__.py ironic/tests/base.py ironic/tests/functional/__init__.py ironic/tests/unit/__init__.py ironic/tests/unit/fake_policy.py ironic/tests/unit/policy_fixture.py ironic/tests/unit/raid_constants.py ironic/tests/unit/stubs.py ironic/tests/unit/api/__init__.py ironic/tests/unit/api/base.py ironic/tests/unit/api/test_acl.py ironic/tests/unit/api/test_base.py ironic/tests/unit/api/test_hooks.py ironic/tests/unit/api/test_middleware.py ironic/tests/unit/api/test_root.py ironic/tests/unit/api/utils.py ironic/tests/unit/api/v1/__init__.py ironic/tests/unit/api/v1/test_chassis.py ironic/tests/unit/api/v1/test_drivers.py ironic/tests/unit/api/v1/test_nodes.py ironic/tests/unit/api/v1/test_ports.py ironic/tests/unit/api/v1/test_root.py ironic/tests/unit/api/v1/test_types.py ironic/tests/unit/api/v1/test_utils.py ironic/tests/unit/api/v1/test_versions.py ironic/tests/unit/cmd/__init__.py ironic/tests/unit/cmd/test_dbsync.py ironic/tests/unit/common/__init__.py ironic/tests/unit/common/test_driver_factory.py ironic/tests/unit/common/test_exception.py ironic/tests/unit/common/test_fsm.py ironic/tests/unit/common/test_glance_service.py ironic/tests/unit/common/test_hash_ring.py ironic/tests/unit/common/test_image_service.py ironic/tests/unit/common/test_images.py ironic/tests/unit/common/test_keystone.py ironic/tests/unit/common/test_network.py ironic/tests/unit/common/test_policy.py ironic/tests/unit/common/test_pxe_utils.py ironic/tests/unit/common/test_raid.py ironic/tests/unit/common/test_rpc.py ironic/tests/unit/common/test_service.py ironic/tests/unit/common/test_states.py ironic/tests/unit/common/test_swift.py ironic/tests/unit/common/test_utils.py ironic/tests/unit/conductor/__init__.py ironic/tests/unit/conductor/mgr_utils.py ironic/tests/unit/conductor/test__mgr_utils.py ironic/tests/unit/conductor/test_base_manager.py ironic/tests/unit/conductor/test_manager.py ironic/tests/unit/conductor/test_rpcapi.py ironic/tests/unit/conductor/test_task_manager.py ironic/tests/unit/conductor/test_utils.py ironic/tests/unit/db/__init__.py ironic/tests/unit/db/base.py ironic/tests/unit/db/test_chassis.py ironic/tests/unit/db/test_conductor.py ironic/tests/unit/db/test_node_tags.py ironic/tests/unit/db/test_nodes.py ironic/tests/unit/db/test_portgroups.py ironic/tests/unit/db/test_ports.py ironic/tests/unit/db/utils.py ironic/tests/unit/db/sqlalchemy/__init__.py ironic/tests/unit/db/sqlalchemy/test_migrations.py ironic/tests/unit/db/sqlalchemy/test_types.py ironic/tests/unit/dhcp/__init__.py ironic/tests/unit/dhcp/test_factory.py ironic/tests/unit/dhcp/test_neutron.py ironic/tests/unit/drivers/__init__.py ironic/tests/unit/drivers/agent_pxe_config.template ironic/tests/unit/drivers/elilo_efi_pxe_config.template ironic/tests/unit/drivers/ipxe_config.template ironic/tests/unit/drivers/ipxe_config_timeout.template ironic/tests/unit/drivers/ipxe_uefi_config.template ironic/tests/unit/drivers/pxe_config.template ironic/tests/unit/drivers/pxe_grub_config.template ironic/tests/unit/drivers/test_agent.py ironic/tests/unit/drivers/test_base.py ironic/tests/unit/drivers/test_fake.py ironic/tests/unit/drivers/test_irmc.py ironic/tests/unit/drivers/test_pxe.py ironic/tests/unit/drivers/test_utils.py ironic/tests/unit/drivers/third_party_driver_mock_specs.py ironic/tests/unit/drivers/third_party_driver_mocks.py ironic/tests/unit/drivers/modules/__init__.py ironic/tests/unit/drivers/modules/test_agent.py ironic/tests/unit/drivers/modules/test_agent_base_vendor.py ironic/tests/unit/drivers/modules/test_agent_client.py ironic/tests/unit/drivers/modules/test_console_utils.py ironic/tests/unit/drivers/modules/test_deploy_utils.py ironic/tests/unit/drivers/modules/test_iboot.py ironic/tests/unit/drivers/modules/test_image_cache.py ironic/tests/unit/drivers/modules/test_inspector.py ironic/tests/unit/drivers/modules/test_ipminative.py ironic/tests/unit/drivers/modules/test_ipmitool.py ironic/tests/unit/drivers/modules/test_iscsi_deploy.py ironic/tests/unit/drivers/modules/test_pxe.py ironic/tests/unit/drivers/modules/test_seamicro.py ironic/tests/unit/drivers/modules/test_snmp.py ironic/tests/unit/drivers/modules/test_ssh.py ironic/tests/unit/drivers/modules/test_virtualbox.py ironic/tests/unit/drivers/modules/test_wol.py ironic/tests/unit/drivers/modules/amt/__init__.py ironic/tests/unit/drivers/modules/amt/test_common.py ironic/tests/unit/drivers/modules/amt/test_management.py ironic/tests/unit/drivers/modules/amt/test_power.py ironic/tests/unit/drivers/modules/amt/test_vendor.py ironic/tests/unit/drivers/modules/amt/utils.py ironic/tests/unit/drivers/modules/cimc/__init__.py ironic/tests/unit/drivers/modules/cimc/test_common.py ironic/tests/unit/drivers/modules/cimc/test_management.py ironic/tests/unit/drivers/modules/cimc/test_power.py ironic/tests/unit/drivers/modules/drac/__init__.py ironic/tests/unit/drivers/modules/drac/bios_wsman_mock.py ironic/tests/unit/drivers/modules/drac/test_bios.py ironic/tests/unit/drivers/modules/drac/test_common.py ironic/tests/unit/drivers/modules/drac/test_job.py ironic/tests/unit/drivers/modules/drac/test_management.py ironic/tests/unit/drivers/modules/drac/test_power.py ironic/tests/unit/drivers/modules/ilo/__init__.py ironic/tests/unit/drivers/modules/ilo/test_boot.py ironic/tests/unit/drivers/modules/ilo/test_common.py ironic/tests/unit/drivers/modules/ilo/test_console.py ironic/tests/unit/drivers/modules/ilo/test_deploy.py ironic/tests/unit/drivers/modules/ilo/test_firmware_processor.py ironic/tests/unit/drivers/modules/ilo/test_inspect.py ironic/tests/unit/drivers/modules/ilo/test_management.py ironic/tests/unit/drivers/modules/ilo/test_power.py ironic/tests/unit/drivers/modules/ilo/test_vendor.py ironic/tests/unit/drivers/modules/irmc/__init__.py ironic/tests/unit/drivers/modules/irmc/fake_sensors_data_ng.xml ironic/tests/unit/drivers/modules/irmc/fake_sensors_data_ok.xml ironic/tests/unit/drivers/modules/irmc/test_boot.py ironic/tests/unit/drivers/modules/irmc/test_common.py ironic/tests/unit/drivers/modules/irmc/test_inspect.py ironic/tests/unit/drivers/modules/irmc/test_management.py ironic/tests/unit/drivers/modules/irmc/test_power.py ironic/tests/unit/drivers/modules/msftocs/__init__.py ironic/tests/unit/drivers/modules/msftocs/test_common.py ironic/tests/unit/drivers/modules/msftocs/test_management.py ironic/tests/unit/drivers/modules/msftocs/test_msftocsclient.py ironic/tests/unit/drivers/modules/msftocs/test_power.py ironic/tests/unit/drivers/modules/oneview/__init__.py ironic/tests/unit/drivers/modules/oneview/test_common.py ironic/tests/unit/drivers/modules/oneview/test_management.py ironic/tests/unit/drivers/modules/oneview/test_power.py ironic/tests/unit/drivers/modules/oneview/test_vendor.py ironic/tests/unit/drivers/modules/ucs/__init__.py ironic/tests/unit/drivers/modules/ucs/test_helper.py ironic/tests/unit/drivers/modules/ucs/test_management.py ironic/tests/unit/drivers/modules/ucs/test_power.py ironic/tests/unit/objects/__init__.py ironic/tests/unit/objects/test_chassis.py ironic/tests/unit/objects/test_conductor.py ironic/tests/unit/objects/test_fields.py ironic/tests/unit/objects/test_node.py ironic/tests/unit/objects/test_objects.py ironic/tests/unit/objects/test_port.py ironic/tests/unit/objects/test_portgroup.py ironic/tests/unit/objects/utils.py ironic_tempest_plugin/README.rst ironic_tempest_plugin/__init__.py ironic_tempest_plugin/clients.py ironic_tempest_plugin/config.py ironic_tempest_plugin/plugin.py ironic_tempest_plugin/common/__init__.py ironic_tempest_plugin/common/waiters.py ironic_tempest_plugin/services/__init__.py ironic_tempest_plugin/services/baremetal/__init__.py ironic_tempest_plugin/services/baremetal/base.py ironic_tempest_plugin/services/baremetal/v1/__init__.py ironic_tempest_plugin/services/baremetal/v1/json/__init__.py ironic_tempest_plugin/services/baremetal/v1/json/baremetal_client.py ironic_tempest_plugin/tests/__init__.py ironic_tempest_plugin/tests/api/__init__.py ironic_tempest_plugin/tests/api/admin/__init__.py ironic_tempest_plugin/tests/api/admin/base.py ironic_tempest_plugin/tests/api/admin/test_api_discovery.py ironic_tempest_plugin/tests/api/admin/test_chassis.py ironic_tempest_plugin/tests/api/admin/test_drivers.py ironic_tempest_plugin/tests/api/admin/test_nodes.py ironic_tempest_plugin/tests/api/admin/test_nodestates.py ironic_tempest_plugin/tests/api/admin/test_ports.py ironic_tempest_plugin/tests/api/admin/test_ports_negative.py ironic_tempest_plugin/tests/scenario/__init__.py ironic_tempest_plugin/tests/scenario/baremetal_manager.py ironic_tempest_plugin/tests/scenario/test_baremetal_basic_ops.py releasenotes/notes/.placeholder releasenotes/notes/5.0-release-afb1fbbe595b6bc8.yaml releasenotes/notes/Add-port-option-support-to-ipmitool-e125d07fe13c53e7.yaml releasenotes/notes/add-agent-iboot-0a4b5471c6ace461.yaml releasenotes/notes/add-agent-proxy-support-790e629634ca2eb7.yaml releasenotes/notes/add-choice-to-some-options-9fb327c48e6bfda1.yaml releasenotes/notes/add-ipv6-pxe-support-8fb51c355cc977c4.yaml releasenotes/notes/add-oneview-driver-96088bf470b16c34.yaml releasenotes/notes/add-ssl-support-4547801eedba5942.yaml releasenotes/notes/agent-wol-driver-4116f64907d0db9c.yaml releasenotes/notes/agent_partition_image-48a03700f41a3980.yaml releasenotes/notes/amt-driver-wake-up-0880ed85476968be.yaml releasenotes/notes/automated_clean_config-0170c95ae210f953.yaml releasenotes/notes/boot-ipxe-inc-workaround-548e10d1d6616752.yaml releasenotes/notes/bug-1506657-3bcb4ef46623124d.yaml releasenotes/notes/bug-1518374-decd73fd82c2eb94.yaml releasenotes/notes/bug-1548086-ed88646061b88faf.yaml releasenotes/notes/clear-target-stable-states-4545602d7aed9898.yaml releasenotes/notes/debug-no-api-tracebacks-a8a0caddc9676b06.yaml releasenotes/notes/dhcp-provider-clean-dhcp-9352717903d6047e.yaml releasenotes/notes/disable-clean-step-reset-ilo-1869a6e08f39901c.yaml releasenotes/notes/disk-label-capability-d36d126e0ad36dca.yaml releasenotes/notes/disk-label-fix-7580de913835ff44.yaml releasenotes/notes/drac-migrate-to-dracclient-2bd8a6d1dd3fdc69.yaml releasenotes/notes/drac-missing-lookup-3ad98e918e1a852a.yaml releasenotes/notes/fix-agent-ilo-temp-image-cleanup-711429d0e67807ae.yaml releasenotes/notes/fix-api-access-logs-68b9ca4f411f339c.yaml releasenotes/notes/fix-clean-steps-not-running-0d065cb022bc0419.yaml releasenotes/notes/fix-cleaning-spawn-error-60b60281f3be51c2.yaml releasenotes/notes/fix-cve-2016-4985-b62abae577025365.yaml releasenotes/notes/fix-ipmi-numeric-password-75e080aa8bdfb9a2.yaml releasenotes/notes/fix-ipmitool-console-empty-password-a8edc5e2a1a7daf6.yaml releasenotes/notes/fix-ipxe-macro-4ae8bc4fe82e8f19.yaml releasenotes/notes/fix-ipxe-template-for-whole-disk-image-943da0311ca7aeb5.yaml releasenotes/notes/fix-mac-address-48060f9e2847a38c.yaml releasenotes/notes/fix-sync-power-state-last-error-65fa42bad8e38c3b.yaml releasenotes/notes/futurist-e9c55699f479f97a.yaml releasenotes/notes/get-supported-boot-devices-manadatory-task-0462fc072d6ea517.yaml releasenotes/notes/ilo-automated-cleaning-fails-14ee438de3dd8690.yaml releasenotes/notes/ilo-boot-interface-92831b78c5614733.yaml releasenotes/notes/ilo-firmware-update-manual-clean-step-e6763dc6dc0d441b.yaml releasenotes/notes/ilo-license-activate-manual-clean-step-84d335998d708b49.yaml releasenotes/notes/inspection-agent-drivers-cad619ec8a4874b1.yaml releasenotes/notes/inspector-for-cisco-bffe1d1af7aec677.yaml releasenotes/notes/ipa-streams-raw-images-1010327b0dad763c.yaml releasenotes/notes/ipxe-and-uefi-7722bd5db71df02c.yaml releasenotes/notes/ipxe-uefi-f5be11c7b0606a84.yaml releasenotes/notes/ipxe_timeout_parameter-03fc3c76c520fac2.yaml releasenotes/notes/irmc-boot-interface-8c2e26affd1ebfc4.yaml releasenotes/notes/irmc-oob-inspection-6d072c60f6c88ecb.yaml releasenotes/notes/iscsi-inband-cleaning-bff87aac16e5d488.yaml releasenotes/notes/list-nodes-by-driver-a1ab9f2b73f652f8.yaml releasenotes/notes/manual-clean-4cc2437be1aea69a.yaml releasenotes/notes/name-root-device-hints-a1484ea01e399065.yaml releasenotes/notes/no-downward-sql-migration-52279e875cd8b7a3.yaml releasenotes/notes/node-name-remove-720aa8007f2f8b75.yaml releasenotes/notes/notimplementederror-misspell-276a181afd652cf6.yaml releasenotes/notes/oob-power-off-7bbdf5947ed24bf8.yaml releasenotes/notes/opentack-baremetal-request-id-daa72b785eaaaa8d.yaml releasenotes/notes/pass-region-to-swiftclient-c8c8bf1020f62ebc.yaml releasenotes/notes/radosgw-temp-url-b04aac50698b4461.yaml releasenotes/notes/refactor-ironic-lib-22939896d8d46a77.yaml releasenotes/notes/release-4.3.0-cc531ab7190f8a00.yaml releasenotes/notes/root-api-version-info-9dd6cadd3d3d4bbe.yaml releasenotes/notes/snmp-reboot-delay-d18ee3f6c6fc0998.yaml releasenotes/notes/ssh-console-58721af6830f8892.yaml releasenotes/notes/update-irmc-set-boot-device-fd50d9dce42aaa89.yaml releasenotes/notes/update-python-scciclient-required-version-71398d5d5e1c0bf8.yaml releasenotes/notes/validate-node-properties-73509ee40f409ca2.yaml releasenotes/notes/wwn-extension-root-device-hints-de40ca1444ba4888.yaml releasenotes/notes/xenserver-ssh-driver-398084fe91ac56f1.yaml releasenotes/source/conf.py releasenotes/source/current-series.rst releasenotes/source/index.rst releasenotes/source/liberty.rst releasenotes/source/mitaka.rst releasenotes/source/unreleased.rst releasenotes/source/_static/.placeholder releasenotes/source/_templates/.placeholder tools/__init__.py tools/flake8wrap.sh tools/run_bashate.sh tools/states_to_dot.py tools/with_venv.sh tools/config/check_uptodate.sh tools/config/generate_sample.sh tools/config/oslo.config.generator.rcironic-5.1.2/ironic.egg-info/requires.txt0000644000567000056710000000157612732316667021544 0ustar jenkinsjenkins00000000000000pbr>=1.6 SQLAlchemy<1.1.0,>=1.0.10 alembic>=0.8.0 automaton>=0.5.0 eventlet!=0.18.3,>=0.18.2 WebOb>=1.2.3 greenlet>=0.3.2 netaddr!=0.7.16,>=0.7.12 paramiko>=1.16.0 python-neutronclient!=4.1.0,>=2.6.0 python-glanceclient>=2.0.0 python-keystoneclient!=1.8.0,!=2.1.0,<3.0.0,>=1.6.0 ironic-lib>=1.1.0 python-swiftclient>=2.2.0 pytz>=2013.6 stevedore>=1.5.0 pysendfile>=2.0.0 websockify>=0.6.1 oslo.concurrency>=3.5.0 oslo.config>=3.7.0 oslo.context>=0.2.0 oslo.db>=4.1.0 oslo.rootwrap>=2.0.0 oslo.i18n>=2.1.0 oslo.log>=1.14.0 oslo.middleware>=3.0.0 oslo.policy>=0.5.0 oslo.serialization>=1.10.0 oslo.service>=1.0.0 oslo.utils>=3.5.0 pecan>=1.0.0 requests!=2.9.0,>=2.8.1 six>=1.9.0 jsonpatch>=1.1 WSME>=0.8 Jinja2>=2.8 keystonemiddleware!=4.1.0,>=4.0.0 oslo.messaging>=4.0.0 retrying!=1.3.0,>=1.2.3 oslo.versionedobjects>=1.5.0 jsonschema!=2.5.0,<3.0.0,>=2.0.0 psutil<2.0.0,>=1.1.1 futurist>=0.11.0 ironic-5.1.2/ironic.egg-info/dependency_links.txt0000644000567000056710000000000112732316667023201 0ustar jenkinsjenkins00000000000000 ironic-5.1.2/ironic.egg-info/PKG-INFO0000644000567000056710000000357112732316667020236 0ustar jenkinsjenkins00000000000000Metadata-Version: 1.1 Name: ironic Version: 5.1.2 Summary: OpenStack Bare Metal Provisioning Home-page: http://docs.openstack.org/developer/ironic/ Author: OpenStack Author-email: openstack-dev@lists.openstack.org License: UNKNOWN Description: Ironic ====== Ironic is an integrated OpenStack project which aims to provision bare metal machines instead of virtual machines, forked from the Nova Baremetal driver. It is best thought of as a bare metal hypervisor **API** and a set of plugins which interact with the bare metal hypervisors. By default, it will use PXE and IPMI together to provision and turn on/off machines, but Ironic also supports vendor-specific plugins which may implement additional functionality. ----------------- Project Resources ----------------- * Free software: Apache license * Documentation: http://docs.openstack.org/developer/ironic * Source: http://git.openstack.org/cgit/openstack/ironic * Bugs: http://bugs.launchpad.net/ironic * Wiki: https://wiki.openstack.org/wiki/Ironic Project status, bugs, and blueprints are tracked on Launchpad: http://launchpad.net/ironic Anyone wishing to contribute to an OpenStack project should find a good reference here: http://docs.openstack.org/infra/manual/developers.html Platform: UNKNOWN Classifier: Environment :: OpenStack Classifier: Intended Audience :: Information Technology Classifier: Intended Audience :: System Administrators Classifier: License :: OSI Approved :: Apache Software License Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 ironic-5.1.2/ironic.egg-info/top_level.txt0000644000567000056710000000003512732316667021663 0ustar jenkinsjenkins00000000000000ironic ironic_tempest_plugin ironic-5.1.2/etc/0000755000567000056710000000000012732316670014723 5ustar jenkinsjenkins00000000000000ironic-5.1.2/etc/ironic/0000755000567000056710000000000012732316670016206 5ustar jenkinsjenkins00000000000000ironic-5.1.2/etc/ironic/policy.json0000644000567000056710000000016312732316044020373 0ustar jenkinsjenkins00000000000000{ "admin_api": "role:admin or role:administrator", "show_password": "!", "default": "rule:admin_api" } ironic-5.1.2/etc/ironic/rootwrap.d/0000755000567000056710000000000012732316670020305 5ustar jenkinsjenkins00000000000000ironic-5.1.2/etc/ironic/rootwrap.d/ironic-images.filters0000644000567000056710000000032512732316044024420 0ustar jenkinsjenkins00000000000000# ironic-rootwrap command filters to manipulate images # This file should be owned by (and only-writeable by) the root user [Filters] # ironic/common/images.py: 'qemu-img' qemu-img: CommandFilter, qemu-img, root ironic-5.1.2/etc/ironic/rootwrap.d/ironic-lib.filters0000644000567000056710000000156112732316044023724 0ustar jenkinsjenkins00000000000000# An ironic-lib.filters to be used with rootwrap command. # The following commands should be used in filters for disk manipulation. # This file should be owned by (and only-writeable by) the root user. # NOTE: this file is a copy of ironic-lib.filters from the ironic-lib # repository that should ultimately be remove. At this point, we still # need it to avoid gate breakage and preserve compatibily with existing # installation. [Filters] # ironic_lib/disk_utils.py blkid: CommandFilter, blkid, root blockdev: CommandFilter, blockdev, root hexdump: CommandFilter, hexdump, root qemu-img: CommandFilter, qemu-img, root wipefs: CommandFilter, wipefs, root # ironic_lib/utils.py mkswap: CommandFilter, mkswap, root mkfs: CommandFilter, mkfs, root dd: CommandFilter, dd, root # ironic_lib/disk_partitioner.py fuser: CommandFilter, fuser, root parted: CommandFilter, parted, root ironic-5.1.2/etc/ironic/rootwrap.d/ironic-utils.filters0000644000567000056710000000047112732316044024315 0ustar jenkinsjenkins00000000000000# ironic-rootwrap command filters for disk manipulation # This file should be owned by (and only-writeable by) the root user [Filters] # ironic/drivers/modules/deploy_utils.py iscsiadm: CommandFilter, iscsiadm, root # ironic/common/utils.py mount: CommandFilter, mount, root umount: CommandFilter, umount, root ironic-5.1.2/etc/ironic/ironic.conf.sample0000644000567000056710000017723512732316050021627 0ustar jenkinsjenkins00000000000000[DEFAULT] # # Options defined in ironic.api.app # # Authentication strategy used by ironic-api. "noauth" should # not be used in a production environment because all # authentication will be disabled. (string value) # Possible values: noauth, keystone #auth_strategy=keystone # Return server tracebacks in the API response for any error # responses. WARNING: this is insecure and should not be used # in a production environment. (boolean value) #debug_tracebacks_in_api=false # Enable pecan debug mode. WARNING: this is insecure and # should not be used in a production environment. (boolean # value) #pecan_debug=false # # Options defined in ironic.common.driver_factory # # Specify the list of drivers to load during service # initialization. Missing drivers, or drivers which fail to # initialize, will prevent the conductor service from # starting. The option default is a recommended set of # production-oriented drivers. A complete list of drivers # present on your system may be found by enumerating the # "ironic.drivers" entrypoint. An example may be found in the # developer documentation online. (list value) #enabled_drivers=pxe_ipmitool # # Options defined in ironic.common.exception # # Used if there is a formatting error when generating an # exception message (a programming error). If True, raise an # exception; if False, use the unformatted message. (boolean # value) #fatal_exception_format_errors=false # # Options defined in ironic.common.hash_ring # # Exponent to determine number of hash partitions to use when # distributing load across conductors. Larger values will # result in more even distribution of load and less load when # rebalancing the ring, but more memory usage. Number of # partitions per conductor is (2^hash_partition_exponent). # This determines the granularity of rebalancing: given 10 # hosts, and an exponent of the 2, there are 40 partitions in # the ring.A few thousand partitions should make rebalancing # smooth in most cases. The default is suitable for up to a # few hundred conductors. Too many partitions has a CPU # impact. (integer value) #hash_partition_exponent=5 # [Experimental Feature] Number of hosts to map onto each hash # partition. Setting this to more than one will cause # additional conductor services to prepare deployment # environments and potentially allow the Ironic cluster to # recover more quickly if a conductor instance is terminated. # (integer value) #hash_distribution_replicas=1 # Interval (in seconds) between hash ring resets. (integer # value) #hash_ring_reset_interval=180 # # Options defined in ironic.common.images # # If True, convert backing images to "raw" disk image format. # (boolean value) #force_raw_images=true # Path to isolinux binary file. (string value) #isolinux_bin=/usr/lib/syslinux/isolinux.bin # Template file for isolinux configuration file. (string # value) #isolinux_config_template=$pybasedir/common/isolinux_config.template # Template file for grub configuration file. (string value) #grub_config_template=$pybasedir/common/grub_conf.template # # Options defined in ironic.common.paths # # Directory where the ironic python module is installed. # (string value) #pybasedir=/usr/lib/python/site-packages/ironic/ironic # Directory where ironic binaries are installed. (string # value) #bindir=$pybasedir/bin # Top-level directory for maintaining ironic's state. (string # value) #state_path=$pybasedir # # Options defined in ironic.common.service # # Default interval (in seconds) for running driver periodic # tasks. (integer value) # This option is deprecated and planned for removal in a future release. #periodic_interval=60 # Name of this node. This can be an opaque identifier. It is # not necessarily a hostname, FQDN, or IP address. However, # the node name must be valid within an AMQP key, and if using # ZeroMQ, a valid hostname, FQDN, or IP address. (string # value) #host=localhost # # Options defined in ironic.common.utils # # Path to the rootwrap configuration file to use for running # commands as root. (string value) #rootwrap_config=/etc/ironic/rootwrap.conf # Temporary working directory, default is Python temp dir. # (string value) #tempdir=/tmp # # Options defined in ironic.drivers.modules.image_cache # # Run image downloads and raw format conversions in parallel. # (boolean value) #parallel_image_downloads=false # # Options defined in ironic.netconf # # IP address of this host. If unset, will determine the IP # programmatically. If unable to do so, will use "127.0.0.1". # (string value) #my_ip=10.0.0.1 # # Options defined in oslo.log # # If set to true, the logging level will be set to DEBUG # instead of the default INFO level. (boolean value) #debug=false # If set to false, the logging level will be set to WARNING # instead of the default INFO level. (boolean value) # This option is deprecated and planned for removal in a future release. #verbose=true # The name of a logging configuration file. This file is # appended to any existing logging configuration files. For # details about logging configuration files, see the Python # logging module documentation. Note that when logging # configuration files are used then all logging configuration # is set in the configuration file and other logging # configuration options are ignored (for example, # logging_context_format_string). (string value) # Deprecated group/name - [DEFAULT]/log_config #log_config_append= # Defines the format string for %%(asctime)s in log records. # Default: %(default)s . This option is ignored if # log_config_append is set. (string value) #log_date_format=%Y-%m-%d %H:%M:%S # (Optional) Name of log file to send logging output to. If no # default is set, logging will go to stderr as defined by # use_stderr. This option is ignored if log_config_append is # set. (string value) # Deprecated group/name - [DEFAULT]/logfile #log_file= # (Optional) The base directory used for relative log_file # paths. This option is ignored if log_config_append is set. # (string value) # Deprecated group/name - [DEFAULT]/logdir #log_dir= # Uses logging handler designed to watch file system. When log # file is moved or removed this handler will open a new log # file with specified path instantaneously. It makes sense # only if log_file option is specified and Linux platform is # used. This option is ignored if log_config_append is set. # (boolean value) #watch_log_file=false # Use syslog for logging. Existing syslog format is DEPRECATED # and will be changed later to honor RFC5424. This option is # ignored if log_config_append is set. (boolean value) #use_syslog=false # Syslog facility to receive log lines. This option is ignored # if log_config_append is set. (string value) #syslog_log_facility=LOG_USER # Log output to standard error. This option is ignored if # log_config_append is set. (boolean value) #use_stderr=true # Format string to use for log messages with context. (string # value) #logging_context_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s # Format string to use for log messages when context is # undefined. (string value) #logging_default_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s # Additional data to append to log message when logging level # for the message is DEBUG. (string value) #logging_debug_format_suffix=%(funcName)s %(pathname)s:%(lineno)d # Prefix each line of exception output with this format. # (string value) #logging_exception_prefix=%(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s # Defines the format string for %(user_identity)s that is used # in logging_context_format_string. (string value) #logging_user_identity_format=%(user)s %(tenant)s %(domain)s %(user_domain)s %(project_domain)s # List of package logging levels in logger=LEVEL pairs. This # option is ignored if log_config_append is set. (list value) #default_log_levels=amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN,taskflow=WARN,keystoneauth=WARN,oslo.cache=INFO,dogpile.core.dogpile=INFO # Enables or disables publication of error events. (boolean # value) #publish_errors=false # The format for an instance that is passed with the log # message. (string value) #instance_format="[instance: %(uuid)s] " # The format for an instance UUID that is passed with the log # message. (string value) #instance_uuid_format="[instance: %(uuid)s] " # Enables or disables fatal status of deprecations. (boolean # value) #fatal_deprecations=false # # Options defined in oslo.messaging # # Size of RPC connection pool. (integer value) # Deprecated group/name - [DEFAULT]/rpc_conn_pool_size #rpc_conn_pool_size=30 # ZeroMQ bind address. Should be a wildcard (*), an ethernet # interface, or IP. The "host" option should point or resolve # to this address. (string value) #rpc_zmq_bind_address=* # MatchMaker driver. (string value) # Possible values: redis, dummy #rpc_zmq_matchmaker=redis # Type of concurrency used. Either "native" or "eventlet" # (string value) #rpc_zmq_concurrency=eventlet # Number of ZeroMQ contexts, defaults to 1. (integer value) #rpc_zmq_contexts=1 # Maximum number of ingress messages to locally buffer per # topic. Default is unlimited. (integer value) #rpc_zmq_topic_backlog= # Directory for holding IPC sockets. (string value) #rpc_zmq_ipc_dir=/var/run/openstack # Name of this node. Must be a valid hostname, FQDN, or IP # address. Must match "host" option, if running Nova. (string # value) #rpc_zmq_host=localhost # Seconds to wait before a cast expires (TTL). The default # value of -1 specifies an infinite linger period. The value # of 0 specifies no linger period. Pending messages shall be # discarded immediately when the socket is closed. Only # supported by impl_zmq. (integer value) #rpc_cast_timeout=-1 # The default number of seconds that poll should wait. Poll # raises timeout exception when timeout expired. (integer # value) #rpc_poll_timeout=1 # Expiration timeout in seconds of a name service record about # existing target ( < 0 means no timeout). (integer value) #zmq_target_expire=120 # Use PUB/SUB pattern for fanout methods. PUB/SUB always uses # proxy. (boolean value) #use_pub_sub=true # Minimal port number for random ports range. (port value) # Possible values: 0-65535 #rpc_zmq_min_port=49152 # Maximal port number for random ports range. (integer value) # Possible values: 1-65536 #rpc_zmq_max_port=65536 # Number of retries to find free port number before fail with # ZMQBindError. (integer value) #rpc_zmq_bind_port_retries=100 # Size of executor thread pool. (integer value) # Deprecated group/name - [DEFAULT]/rpc_thread_pool_size #executor_thread_pool_size=64 # Seconds to wait for a response from a call. (integer value) #rpc_response_timeout=60 # A URL representing the messaging driver to use and its full # configuration. If not set, we fall back to the rpc_backend # option and driver specific configuration. (string value) #transport_url= # The messaging driver to use, defaults to rabbit. Other # drivers include amqp and zmq. (string value) #rpc_backend=rabbit # The default exchange under which topics are scoped. May be # overridden by an exchange name specified in the # transport_url option. (string value) #control_exchange=openstack # # Options defined in oslo.service.periodic_task # # Some periodic tasks can be run in a separate process. Should # we run them here? (boolean value) #run_external_periodic_tasks=true # # Options defined in oslo.service.service # # Enable eventlet backdoor. Acceptable values are 0, , # and :, where 0 results in listening on a random # tcp port number; results in listening on the # specified port number (and not enabling backdoor if that # port is in use); and : results in listening on # the smallest unused port number within the specified range # of port numbers. The chosen port is displayed in the # service's log file. (string value) #backdoor_port= # Enable eventlet backdoor, using the provided path as a unix # socket that can receive connections. This option is mutually # exclusive with 'backdoor_port' in that only one should be # provided. If both are provided then the existence of this # option overrides the usage of that option. (string value) #backdoor_socket= # Enables or disables logging values of all registered options # when starting a service (at DEBUG level). (boolean value) #log_options=true # Specify a timeout after which a gracefully shutdown server # will exit. Zero value means endless wait. (integer value) #graceful_shutdown_timeout=60 [agent] # # Options defined in ironic.drivers.modules.agent # # DEPRECATED. Additional append parameters for baremetal PXE # boot. This option is deprecated and will be removed in # Mitaka release. Please use [pxe]pxe_append_params instead. # (string value) #agent_pxe_append_params=nofb nomodeset vga=normal # DEPRECATED. Template file for PXE configuration. This option # is deprecated and will be removed in Mitaka release. Please # use [pxe]pxe_config_template instead. (string value) #agent_pxe_config_template=$pybasedir/drivers/modules/agent_config.template # Whether Ironic will manage booting of the agent ramdisk. If # set to False, you will need to configure your mechanism to # allow booting the agent ramdisk. (boolean value) # Deprecated group/name - [agent]/manage_tftp #manage_agent_boot=true # The memory size in MiB consumed by agent when it is booted # on a bare metal node. This is used for checking if the image # can be downloaded and deployed on the bare metal node after # booting agent ramdisk. This may be set according to the # memory consumed by the agent ramdisk image. (integer value) #memory_consumed_by_agent=0 # Whether the agent ramdisk should stream raw images directly # onto the disk or not. By streaming raw images directly onto # the disk the agent ramdisk will not spend time copying the # image to a tmpfs partition (therefore consuming less memory) # prior to writing it to the disk. Unless the disk where the # image will be copied to is really slow, this option should # be set to True. Defaults to True. (boolean value) #stream_raw_images=true # # Options defined in ironic.drivers.modules.agent_base_vendor # # Maximum interval (in seconds) for agent heartbeats. (integer # value) #heartbeat_timeout=300 # Number of times to retry getting power state to check if # bare metal node has been powered off after a soft power off. # (integer value) #post_deploy_get_power_state_retries=6 # Amount of time (in seconds) to wait between polling power # state after trigger soft poweroff. (integer value) #post_deploy_get_power_state_retry_interval=5 # # Options defined in ironic.drivers.modules.agent_client # # API version to use for communicating with the ramdisk agent. # (string value) #agent_api_version=v1 [amt] # # Options defined in ironic.drivers.modules.amt.common # # Protocol used for AMT endpoint (string value) # Possible values: http, https #protocol=http # Time interval (in seconds) for successive awake call to AMT # interface, this depends on the IdleTimeout setting on AMT # interface. AMT Interface will go to sleep after 60 seconds # of inactivity by default. IdleTimeout=0 means AMT will not # go to sleep at all. Setting awake_interval=0 will disable # awake call. (integer value) # Minimum value: 0 #awake_interval=60 # # Options defined in ironic.drivers.modules.amt.power # # Maximum number of times to attempt an AMT operation, before # failing (integer value) #max_attempts=3 # Amount of time (in seconds) to wait, before retrying an AMT # operation (integer value) #action_wait=10 [api] # # Options defined in ironic.api # # The IP address on which ironic-api listens. (string value) #host_ip=0.0.0.0 # The TCP port on which ironic-api listens. (port value) # Possible values: 0-65535 #port=6385 # The maximum number of items returned in a single response # from a collection resource. (integer value) #max_limit=1000 # Public URL to use when building the links to the API # resources (for example, "https://ironic.rocks:6384"). If # None the links will be built using the request's host URL. # If the API is operating behind a proxy, you will want to # change this to represent the proxy's URL. Defaults to None. # (string value) #public_endpoint= # Number of workers for OpenStack Ironic API service. The # default is equal to the number of CPUs available if that can # be determined, else a default worker count of 1 is returned. # (integer value) #api_workers= # Enable the integrated stand-alone API to service requests # via HTTPS instead of HTTP. If there is a front-end service # performing HTTPS offloading from the service, this option # should be False; note, you will want to change public API # endpoint to represent SSL termination URL with # 'public_endpoint' option. (boolean value) #enable_ssl_api=false [cimc] # # Options defined in ironic.drivers.modules.cimc.power # # Number of times a power operation needs to be retried # (integer value) #max_retry=6 # Amount of time in seconds to wait in between power # operations (integer value) #action_interval=10 [cisco_ucs] # # Options defined in ironic.drivers.modules.ucs.power # # Number of times a power operation needs to be retried # (integer value) #max_retry=6 # Amount of time in seconds to wait in between power # operations (integer value) #action_interval=5 [conductor] # # Options defined in ironic.conductor.base_manager # # The size of the workers greenthread pool. Note that 2 # threads will be reserved by the conductor itself for # handling heart beats and periodic tasks. (integer value) # Minimum value: 3 #workers_pool_size=100 # Seconds between conductor heart beats. (integer value) #heartbeat_interval=10 # # Options defined in ironic.conductor.manager # # URL of Ironic API service. If not set ironic can get the # current value from the keystone service catalog. (string # value) #api_url= # Maximum time (in seconds) since the last check-in of a # conductor. A conductor is considered inactive when this time # has been exceeded. (integer value) #heartbeat_timeout=60 # Interval between syncing the node power state to the # database, in seconds. (integer value) #sync_power_state_interval=60 # Interval between checks of provision timeouts, in seconds. # (integer value) #check_provision_state_interval=60 # Timeout (seconds) to wait for a callback from a deploy # ramdisk. Set to 0 to disable timeout. (integer value) #deploy_callback_timeout=1800 # During sync_power_state, should the hardware power state be # set to the state recorded in the database (True) or should # the database be updated based on the hardware state (False). # (boolean value) #force_power_state_during_sync=true # During sync_power_state failures, limit the number of times # Ironic should try syncing the hardware node power state with # the node power state in DB (integer value) #power_state_sync_max_retries=3 # Maximum number of worker threads that can be started # simultaneously by a periodic task. Should be less than RPC # thread pool size. (integer value) #periodic_max_workers=8 # Number of attempts to grab a node lock. (integer value) #node_locked_retry_attempts=3 # Seconds to sleep between node lock attempts. (integer value) #node_locked_retry_interval=1 # Enable sending sensor data message via the notification bus # (boolean value) #send_sensor_data=false # Seconds between conductor sending sensor data message to # ceilometer via the notification bus. (integer value) #send_sensor_data_interval=600 # List of comma separated meter types which need to be sent to # Ceilometer. The default value, "ALL", is a special value # meaning send all the sensor data. (list value) #send_sensor_data_types=ALL # When conductors join or leave the cluster, existing # conductors may need to update any persistent local state as # nodes are moved around the cluster. This option controls how # often, in seconds, each conductor will check for nodes that # it should "take over". Set it to a negative value to disable # the check entirely. (integer value) #sync_local_state_interval=180 # Whether to upload the config drive to Swift. (boolean value) #configdrive_use_swift=false # Name of the Swift container to store config drive data. Used # when configdrive_use_swift is True. (string value) #configdrive_swift_container=ironic_configdrive_container # Timeout (seconds) for waiting for node inspection. 0 - # unlimited. (integer value) #inspect_timeout=1800 # Enables or disables automated cleaning. Automated cleaning # is a configurable set of steps, such as erasing disk drives, # that are performed on the node to ensure it is in a baseline # state and ready to be deployed to. This is done after # instance deletion as well as during the transition from a # "manageable" to "available" state. When enabled, the # particular steps performed to clean a node depend on which # driver that node is managed by; see the individual driver's # documentation for details. NOTE: The introduction of the # cleaning operation causes instance deletion to take # significantly longer. In an environment where all tenants # are trusted (eg, because there is only one tenant), this # option could be safely disabled. (boolean value) # Deprecated group/name - [conductor]/clean_nodes #automated_clean=true # Timeout (seconds) to wait for a callback from the ramdisk # doing the cleaning. If the timeout is reached the node will # be put in the "clean failed" provision state. Set to 0 to # disable timeout. (integer value) #clean_callback_timeout=1800 [console] # # Options defined in ironic.drivers.modules.console_utils # # Path to serial console terminal program (string value) #terminal=shellinaboxd # Directory containing the terminal SSL cert(PEM) for serial # console access (string value) #terminal_cert_dir= # Directory for holding terminal pid files. If not specified, # the temporary directory will be used. (string value) #terminal_pid_dir= # Time interval (in seconds) for checking the status of # console subprocess. (integer value) #subprocess_checking_interval=1 # Time (in seconds) to wait for the console subprocess to # start. (integer value) #subprocess_timeout=10 [cors] # # Options defined in oslo.middleware.cors # # Indicate whether this resource may be shared with the domain # received in the requests "origin" header. (list value) #allowed_origin= # Indicate that the actual request can include user # credentials (boolean value) #allow_credentials=true # Indicate which headers are safe to expose to the API. # Defaults to HTTP Simple Headers. (list value) #expose_headers=Content-Type,Cache-Control,Content-Language,Expires,Last-Modified,Pragma # Maximum cache age of CORS preflight requests. (integer # value) #max_age=3600 # Indicate which methods can be used during the actual # request. (list value) #allow_methods=GET,POST,PUT,DELETE,OPTIONS # Indicate which header field names may be used during the # actual request. (list value) #allow_headers=Content-Type,Cache-Control,Content-Language,Expires,Last-Modified,Pragma [cors.subdomain] # # Options defined in oslo.middleware.cors # # Indicate whether this resource may be shared with the domain # received in the requests "origin" header. (list value) #allowed_origin= # Indicate that the actual request can include user # credentials (boolean value) #allow_credentials=true # Indicate which headers are safe to expose to the API. # Defaults to HTTP Simple Headers. (list value) #expose_headers=Content-Type,Cache-Control,Content-Language,Expires,Last-Modified,Pragma # Maximum cache age of CORS preflight requests. (integer # value) #max_age=3600 # Indicate which methods can be used during the actual # request. (list value) #allow_methods=GET,POST,PUT,DELETE,OPTIONS # Indicate which header field names may be used during the # actual request. (list value) #allow_headers=Content-Type,Cache-Control,Content-Language,Expires,Last-Modified,Pragma [database] # # Options defined in ironic.db.sqlalchemy.models # # MySQL engine to use. (string value) #mysql_engine=InnoDB # # Options defined in oslo.db # # The file name to use with SQLite. (string value) # Deprecated group/name - [DEFAULT]/sqlite_db #sqlite_db=oslo.sqlite # If True, SQLite uses synchronous mode. (boolean value) # Deprecated group/name - [DEFAULT]/sqlite_synchronous #sqlite_synchronous=true # The back end to use for the database. (string value) # Deprecated group/name - [DEFAULT]/db_backend #backend=sqlalchemy # The SQLAlchemy connection string to use to connect to the # database. (string value) # Deprecated group/name - [DEFAULT]/sql_connection # Deprecated group/name - [DATABASE]/sql_connection # Deprecated group/name - [sql]/connection #connection= # The SQLAlchemy connection string to use to connect to the # slave database. (string value) #slave_connection= # The SQL mode to be used for MySQL sessions. This option, # including the default, overrides any server-set SQL mode. To # use whatever SQL mode is set by the server configuration, # set this to no value. Example: mysql_sql_mode= (string # value) #mysql_sql_mode=TRADITIONAL # Timeout before idle SQL connections are reaped. (integer # value) # Deprecated group/name - [DEFAULT]/sql_idle_timeout # Deprecated group/name - [DATABASE]/sql_idle_timeout # Deprecated group/name - [sql]/idle_timeout #idle_timeout=3600 # Minimum number of SQL connections to keep open in a pool. # (integer value) # Deprecated group/name - [DEFAULT]/sql_min_pool_size # Deprecated group/name - [DATABASE]/sql_min_pool_size #min_pool_size=1 # Maximum number of SQL connections to keep open in a pool. # (integer value) # Deprecated group/name - [DEFAULT]/sql_max_pool_size # Deprecated group/name - [DATABASE]/sql_max_pool_size #max_pool_size= # Maximum number of database connection retries during # startup. Set to -1 to specify an infinite retry count. # (integer value) # Deprecated group/name - [DEFAULT]/sql_max_retries # Deprecated group/name - [DATABASE]/sql_max_retries #max_retries=10 # Interval between retries of opening a SQL connection. # (integer value) # Deprecated group/name - [DEFAULT]/sql_retry_interval # Deprecated group/name - [DATABASE]/reconnect_interval #retry_interval=10 # If set, use this value for max_overflow with SQLAlchemy. # (integer value) # Deprecated group/name - [DEFAULT]/sql_max_overflow # Deprecated group/name - [DATABASE]/sqlalchemy_max_overflow #max_overflow=50 # Verbosity of SQL debugging information: 0=None, # 100=Everything. (integer value) # Deprecated group/name - [DEFAULT]/sql_connection_debug #connection_debug=0 # Add Python stack traces to SQL as comment strings. (boolean # value) # Deprecated group/name - [DEFAULT]/sql_connection_trace #connection_trace=false # If set, use this value for pool_timeout with SQLAlchemy. # (integer value) # Deprecated group/name - [DATABASE]/sqlalchemy_pool_timeout #pool_timeout= # Enable the experimental use of database reconnect on # connection lost. (boolean value) #use_db_reconnect=false # Seconds between retries of a database transaction. (integer # value) #db_retry_interval=1 # If True, increases the interval between retries of a # database operation up to db_max_retry_interval. (boolean # value) #db_inc_retry_interval=true # If db_inc_retry_interval is set, the maximum seconds between # retries of a database operation. (integer value) #db_max_retry_interval=10 # Maximum retries in case of connection error or deadlock # error before error is raised. Set to -1 to specify an # infinite retry count. (integer value) #db_max_retries=20 [deploy] # # Options defined in ironic.drivers.modules.deploy_utils # # ironic-conductor node's HTTP server URL. Example: # http://192.1.2.3:8080 (string value) # Deprecated group/name - [pxe]/http_url #http_url= # ironic-conductor node's HTTP root path. (string value) # Deprecated group/name - [pxe]/http_root #http_root=/httpboot # Priority to run in-band erase devices via the Ironic Python # Agent ramdisk. If unset, will use the priority set in the # ramdisk (defaults to 10 for the GenericHardwareManager). If # set to 0, will not run during cleaning. (integer value) # Deprecated group/name - [agent]/agent_erase_devices_priority #erase_devices_priority= # Number of iterations to be run for erasing devices. (integer # value) # Deprecated group/name - [agent]/agent_erase_devices_iterations #erase_devices_iterations=1 [dhcp] # # Options defined in ironic.common.dhcp_factory # # DHCP provider to use. "neutron" uses Neutron, and "none" # uses a no-op provider. (string value) #dhcp_provider=neutron [disk_partitioner] # # Options defined in ironic_lib.disk_partitioner # # After Ironic has completed creating the partition table, it # continues to check for activity on the attached iSCSI device # status at this interval prior to copying the image to the # node, in seconds (integer value) #check_device_interval=1 # The maximum number of times to check that the device is not # accessed by another process. If the device is still busy # after that, the disk partitioning will be treated as having # failed. (integer value) #check_device_max_retries=20 [disk_utils] # # Options defined in ironic_lib.disk_utils # # Size of EFI system partition in MiB when configuring UEFI # systems for local boot. (integer value) # Deprecated group/name - [deploy]/efi_system_partition_size #efi_system_partition_size=200 # Block size to use when writing to the nodes disk. (string # value) # Deprecated group/name - [deploy]/dd_block_size #dd_block_size=1M # Maximum attempts to verify an iSCSI connection is active, # sleeping 1 second between attempts. (integer value) # Deprecated group/name - [deploy]/iscsi_verify_attempts #iscsi_verify_attempts=3 [glance] # # Options defined in ironic.common.glance_service.v2.image_service # # A list of URL schemes that can be downloaded directly via # the direct_url. Currently supported schemes: [file]. (list # value) #allowed_direct_url_schemes= # The secret token given to Swift to allow temporary URL # downloads. Required for temporary URLs. (string value) #swift_temp_url_key= # The length of time in seconds that the temporary URL will be # valid for. Defaults to 20 minutes. If some deploys get a 401 # response code when trying to download from the temporary # URL, try raising this duration. This value must be greater # than or equal to the value for # swift_temp_url_expected_download_start_delay (integer value) #swift_temp_url_duration=1200 # Whether to cache generated Swift temporary URLs. Setting it # to true is only useful when an image caching proxy is used. # Defaults to False. (boolean value) #swift_temp_url_cache_enabled=false # This is the delay (in seconds) from the time of the deploy # request (when the Swift temporary URL is generated) to when # the IPA ramdisk starts up and URL is used for the image # download. This value is used to check if the Swift temporary # URL duration is large enough to let the image download # begin. Also if temporary URL caching is enabled this will # determine if a cached entry will still be valid when the # download starts. swift_temp_url_duration value must be # greater than or equal to this option's value. Defaults to 0. # (integer value) # Minimum value: 0 #swift_temp_url_expected_download_start_delay=0 # The "endpoint" (scheme, hostname, optional port) for the # Swift URL of the form # "endpoint_url/api_version/[account/]container/object_id". Do # not include trailing "/". For example, use # "https://swift.example.com". If using RADOS Gateway, # endpoint may also contain /swift path; if it does not, it # will be appended. Required for temporary URLs. (string # value) #swift_endpoint_url= # The Swift API version to create a temporary URL for. # Defaults to "v1". Swift temporary URL format: # "endpoint_url/api_version/[account/]container/object_id" # (string value) #swift_api_version=v1 # The account that Glance uses to communicate with Swift. The # format is "AUTH_uuid". "uuid" is the UUID for the account # configured in the glance-api.conf. Required for temporary # URLs when Glance backend is Swift. For example: # "AUTH_a422b2-91f3-2f46-74b7-d7c9e8958f5d30". Swift temporary # URL format: # "endpoint_url/api_version/[account/]container/object_id" # (string value) #swift_account= # The Swift container Glance is configured to store its images # in. Defaults to "glance", which is the default in glance- # api.conf. Swift temporary URL format: # "endpoint_url/api_version/[account/]container/object_id" # (string value) #swift_container=glance # This should match a config by the same name in the Glance # configuration file. When set to 0, a single-tenant store # will only use one container to store all images. When set to # an integer value between 1 and 32, a single-tenant store # will use multiple containers to store images, and this value # will determine how many containers are created. (integer # value) #swift_store_multiple_containers_seed=0 # Type of endpoint to use for temporary URLs. If the Glance # backend is Swift, use "swift"; if it is CEPH with RADOS # gateway, use "radosgw". (string value) # Possible values: swift, radosgw #temp_url_endpoint_type=swift # # Options defined in ironic.common.image_service # # Default glance hostname or IP address. (string value) #glance_host=$my_ip # Default glance port. (port value) # Possible values: 0-65535 #glance_port=9292 # Default protocol to use when connecting to glance. Set to # https for SSL. (string value) # Possible values: http, https #glance_protocol=http # A list of the glance api servers available to ironic. Prefix # with https:// for SSL-based glance API servers. Format is # [hostname|IP]:port. (list value) #glance_api_servers= # Allow to perform insecure SSL (https) requests to glance. # (boolean value) #glance_api_insecure=false # Number of retries when downloading an image from glance. # (integer value) #glance_num_retries=0 # Authentication strategy to use when connecting to glance. # (string value) # Possible values: keystone, noauth #auth_strategy=keystone # Optional path to a CA certificate bundle to be used to # validate the SSL certificate served by glance. It is used # when glance_api_insecure is set to False. (string value) #glance_cafile= [iboot] # # Options defined in ironic.drivers.modules.iboot # # Maximum retries for iBoot operations (integer value) #max_retry=3 # Time (in seconds) between retry attempts for iBoot # operations (integer value) #retry_interval=1 # Time (in seconds) to sleep between when rebooting (powering # off and on again). (integer value) # Minimum value: 0 #reboot_delay=5 [ilo] # # Options defined in ironic.drivers.modules.ilo.common # # Timeout (in seconds) for iLO operations (integer value) #client_timeout=60 # Port to be used for iLO operations (port value) # Possible values: 0-65535 #client_port=443 # The Swift iLO container to store data. (string value) #swift_ilo_container=ironic_ilo_container # Amount of time in seconds for Swift objects to auto-expire. # (integer value) #swift_object_expiry_timeout=900 # Set this to True to use http web server to host floppy # images and generated boot ISO. This requires http_root and # http_url to be configured in the [deploy] section of the # config file. If this is set to False, then Ironic will use # Swift to host the floppy images and generated boot_iso. # (boolean value) #use_web_server_for_images=false # # Options defined in ironic.drivers.modules.ilo.deploy # # Priority for erase devices clean step. If unset, it defaults # to 10. If set to 0, the step will be disabled and will not # run during cleaning. (integer value) #clean_priority_erase_devices= # # Options defined in ironic.drivers.modules.ilo.management # # Priority for reset_ilo clean step. (integer value) #clean_priority_reset_ilo=0 # Priority for reset_bios_to_default clean step. (integer # value) #clean_priority_reset_bios_to_default=10 # Priority for reset_secure_boot_keys clean step. This step # will reset the secure boot keys to manufacturing defaults. # (integer value) #clean_priority_reset_secure_boot_keys_to_default=20 # Priority for clear_secure_boot_keys clean step. This step is # not enabled by default. It can be enabled to clear all # secure boot keys enrolled with iLO. (integer value) #clean_priority_clear_secure_boot_keys=0 # Priority for reset_ilo_credential clean step. This step # requires "ilo_change_password" parameter to be updated in # nodes's driver_info with the new password. (integer value) #clean_priority_reset_ilo_credential=30 # # Options defined in ironic.drivers.modules.ilo.power # # Number of times a power operation needs to be retried # (integer value) #power_retry=6 # Amount of time in seconds to wait in between power # operations (integer value) #power_wait=2 [inspector] # # Options defined in ironic.drivers.modules.inspector # # whether to enable inspection using ironic-inspector (boolean # value) # Deprecated group/name - [discoverd]/enabled #enabled=false # ironic-inspector HTTP endpoint. If this is not set, the # ironic-inspector client default (http://127.0.0.1:5050) will # be used. (string value) # Deprecated group/name - [discoverd]/service_url #service_url= # period (in seconds) to check status of nodes on inspection # (integer value) # Deprecated group/name - [discoverd]/status_check_period #status_check_period=60 [ipmi] # # Options defined in ironic.drivers.modules.ipminative # # Maximum time in seconds to retry IPMI operations. There is a # tradeoff when setting this value. Setting this too low may # cause older BMCs to crash and require a hard reset. However, # setting too high can cause the sync power state periodic # task to hang when there are slow or unresponsive BMCs. # (integer value) #retry_timeout=60 # Minimum time, in seconds, between IPMI operations sent to a # server. There is a risk with some hardware that setting this # too low may cause the BMC to crash. Recommended setting is 5 # seconds. (integer value) #min_command_interval=5 [irmc] # # Options defined in ironic.drivers.modules.irmc.boot # # Ironic conductor node's "NFS" or "CIFS" root path (string # value) #remote_image_share_root=/remote_image_share_root # IP of remote image server (string value) #remote_image_server= # Share type of virtual media (string value) # Possible values: CIFS, NFS #remote_image_share_type=CIFS # share name of remote_image_server (string value) #remote_image_share_name=share # User name of remote_image_server (string value) #remote_image_user_name= # Password of remote_image_user_name (string value) #remote_image_user_password= # Domain name of remote_image_user_name (string value) #remote_image_user_domain= # # Options defined in ironic.drivers.modules.irmc.common # # Port to be used for iRMC operations (port value) # Possible values: 443, 80 #port=443 # Authentication method to be used for iRMC operations (string # value) # Possible values: basic, digest #auth_method=basic # Timeout (in seconds) for iRMC operations (integer value) #client_timeout=60 # Sensor data retrieval method. (string value) # Possible values: ipmitool, scci #sensor_method=ipmitool # SNMP protocol version (string value) # Possible values: v1, v2c, v3 #snmp_version=v2c # SNMP port (port value) # Possible values: 0-65535 #snmp_port=161 # SNMP community. Required for versions "v1" and "v2c" (string # value) #snmp_community=public # SNMP security name. Required for version "v3" (string value) #snmp_security= [ironic_lib] # # Options defined in ironic_lib.utils # # Command that is prefixed to commands that are run as root. # If not specified, no commands are run as root. (string # value) #root_helper=sudo ironic-rootwrap /etc/ironic/rootwrap.conf [keystone] # # Options defined in ironic.common.keystone # # The region used for getting endpoints of OpenStack services. # (string value) #region_name= [keystone_authtoken] # # Options defined in keystonemiddleware.auth_token # # Complete public Identity API endpoint. (string value) #auth_uri= # API version of the admin Identity API endpoint. (string # value) #auth_version= # Do not handle authorization requests within the middleware, # but delegate the authorization decision to downstream WSGI # components. (boolean value) #delay_auth_decision=false # Request timeout value for communicating with Identity API # server. (integer value) #http_connect_timeout= # How many times are we trying to reconnect when communicating # with Identity API Server. (integer value) #http_request_max_retries=3 # Env key for the swift cache. (string value) #cache= # Required if identity server requires client certificate # (string value) #certfile= # Required if identity server requires client certificate # (string value) #keyfile= # A PEM encoded Certificate Authority to use when verifying # HTTPs connections. Defaults to system CAs. (string value) #cafile= # Verify HTTPS connections. (boolean value) #insecure=false # The region in which the identity server can be found. # (string value) #region_name= # Directory used to cache files related to PKI tokens. (string # value) #signing_dir= # Optionally specify a list of memcached server(s) to use for # caching. If left undefined, tokens will instead be cached # in-process. (list value) # Deprecated group/name - [keystone_authtoken]/memcache_servers #memcached_servers= # In order to prevent excessive effort spent validating # tokens, the middleware caches previously-seen tokens for a # configurable duration (in seconds). Set to -1 to disable # caching completely. (integer value) #token_cache_time=300 # Determines the frequency at which the list of revoked tokens # is retrieved from the Identity service (in seconds). A high # number of revocation events combined with a low cache # duration may significantly reduce performance. (integer # value) #revocation_cache_time=10 # (Optional) If defined, indicate whether token data should be # authenticated or authenticated and encrypted. If MAC, token # data is authenticated (with HMAC) in the cache. If ENCRYPT, # token data is encrypted and authenticated in the cache. If # the value is not one of these options or empty, auth_token # will raise an exception on initialization. (string value) # Possible values: None, MAC, ENCRYPT #memcache_security_strategy=None # (Optional, mandatory if memcache_security_strategy is # defined) This string is used for key derivation. (string # value) #memcache_secret_key= # (Optional) Number of seconds memcached server is considered # dead before it is tried again. (integer value) #memcache_pool_dead_retry=300 # (Optional) Maximum total number of open connections to every # memcached server. (integer value) #memcache_pool_maxsize=10 # (Optional) Socket timeout in seconds for communicating with # a memcached server. (integer value) #memcache_pool_socket_timeout=3 # (Optional) Number of seconds a connection to memcached is # held unused in the pool before it is closed. (integer value) #memcache_pool_unused_timeout=60 # (Optional) Number of seconds that an operation will wait to # get a memcached client connection from the pool. (integer # value) #memcache_pool_conn_get_timeout=10 # (Optional) Use the advanced (eventlet safe) memcached client # pool. The advanced pool will only work under python 2.x. # (boolean value) #memcache_use_advanced_pool=false # (Optional) Indicate whether to set the X-Service-Catalog # header. If False, middleware will not ask for service # catalog on token validation and will not set the X-Service- # Catalog header. (boolean value) #include_service_catalog=true # Used to control the use and type of token binding. Can be # set to: "disabled" to not check token binding. "permissive" # (default) to validate binding information if the bind type # is of a form known to the server and ignore it if not. # "strict" like "permissive" but if the bind type is unknown # the token will be rejected. "required" any form of token # binding is needed to be allowed. Finally the name of a # binding method that must be present in tokens. (string # value) #enforce_token_bind=permissive # If true, the revocation list will be checked for cached # tokens. This requires that PKI tokens are configured on the # identity server. (boolean value) #check_revocations_for_cached=false # Hash algorithms to use for hashing PKI tokens. This may be a # single algorithm or multiple. The algorithms are those # supported by Python standard hashlib.new(). The hashes will # be tried in the order given, so put the preferred one first # for performance. The result of the first hash will be stored # in the cache. This will typically be set to multiple values # only while migrating from a less secure algorithm to a more # secure one. Once all the old tokens are expired this option # should be set to a single value for better performance. # (list value) #hash_algorithms=md5 # Authentication type to load (type of value is unknown) # Deprecated group/name - [keystone_authtoken]/auth_plugin #auth_type= # Config Section from which to load plugin specific options # (type of value is unknown) #auth_section= [matchmaker_redis] # # Options defined in oslo.messaging # # Host to locate redis. (string value) #host=127.0.0.1 # Use this port to connect to redis host. (port value) # Possible values: 0-65535 #port=6379 # Password for Redis server (optional). (string value) #password= # List of Redis Sentinel hosts (fault tolerance mode) e.g. # [host:port, host1:port ... ] (list value) #sentinel_hosts= # Redis replica set name. (string value) #sentinel_group_name=oslo-messaging-zeromq # Time in ms to wait between connection attempts. (integer # value) #wait_timeout=500 # Time in ms to wait before the transaction is killed. # (integer value) #check_timeout=20000 # Timeout in ms on blocking socket operations (integer value) #socket_timeout=1000 [neutron] # # Options defined in ironic.dhcp.neutron # # URL for connecting to neutron. (string value) #url=http://$my_ip:9696 # Timeout value for connecting to neutron in seconds. (integer # value) #url_timeout=30 # Client retries in the case of a failed request. (integer # value) #retries=3 # Default authentication strategy to use when connecting to # neutron. Running neutron in noauth mode (related to but not # affected by this setting) is insecure and should only be # used for testing. (string value) # Possible values: keystone, noauth #auth_strategy=keystone # UUID of the network to create Neutron ports on, when booting # to a ramdisk for cleaning using Neutron DHCP. (string value) #cleaning_network_uuid= [oneview] # # Options defined in ironic.drivers.modules.oneview.common # # URL where OneView is available (string value) #manager_url= # OneView username to be used (string value) #username= # OneView password to be used (string value) #password= # Option to allow insecure connection with OneView (boolean # value) #allow_insecure_connections=false # Path to CA certificate (string value) #tls_cacert_file= # Max connection retries to check changes on OneView (integer # value) #max_polling_attempts=12 [oslo_concurrency] # # Options defined in oslo.concurrency # # Enables or disables inter-process locks. (boolean value) # Deprecated group/name - [DEFAULT]/disable_process_locking #disable_process_locking=false # Directory to use for lock files. For security, the # specified directory should only be writable by the user # running the processes that need locking. Defaults to # environment variable OSLO_LOCK_PATH. If external locks are # used, a lock path must be set. (string value) # Deprecated group/name - [DEFAULT]/lock_path #lock_path= [oslo_messaging_amqp] # # Options defined in oslo.messaging # # address prefix used when sending to a specific server # (string value) # Deprecated group/name - [amqp1]/server_request_prefix #server_request_prefix=exclusive # address prefix used when broadcasting to all servers (string # value) # Deprecated group/name - [amqp1]/broadcast_prefix #broadcast_prefix=broadcast # address prefix when sending to any server in group (string # value) # Deprecated group/name - [amqp1]/group_request_prefix #group_request_prefix=unicast # Name for the AMQP container (string value) # Deprecated group/name - [amqp1]/container_name #container_name= # Timeout for inactive connections (in seconds) (integer # value) # Deprecated group/name - [amqp1]/idle_timeout #idle_timeout=0 # Debug: dump AMQP frames to stdout (boolean value) # Deprecated group/name - [amqp1]/trace #trace=false # CA certificate PEM file to verify server certificate (string # value) # Deprecated group/name - [amqp1]/ssl_ca_file #ssl_ca_file= # Identifying certificate PEM file to present to clients # (string value) # Deprecated group/name - [amqp1]/ssl_cert_file #ssl_cert_file= # Private key PEM file used to sign cert_file certificate # (string value) # Deprecated group/name - [amqp1]/ssl_key_file #ssl_key_file= # Password for decrypting ssl_key_file (if encrypted) (string # value) # Deprecated group/name - [amqp1]/ssl_key_password #ssl_key_password= # Accept clients using either SSL or plain TCP (boolean value) # Deprecated group/name - [amqp1]/allow_insecure_clients #allow_insecure_clients=false # Space separated list of acceptable SASL mechanisms (string # value) # Deprecated group/name - [amqp1]/sasl_mechanisms #sasl_mechanisms= # Path to directory that contains the SASL configuration # (string value) # Deprecated group/name - [amqp1]/sasl_config_dir #sasl_config_dir= # Name of configuration file (without .conf suffix) (string # value) # Deprecated group/name - [amqp1]/sasl_config_name #sasl_config_name= # User name for message broker authentication (string value) # Deprecated group/name - [amqp1]/username #username= # Password for message broker authentication (string value) # Deprecated group/name - [amqp1]/password #password= [oslo_messaging_notifications] # # Options defined in oslo.messaging # # The Drivers(s) to handle sending notifications. Possible # values are messaging, messagingv2, routing, log, test, noop # (multi valued) # Deprecated group/name - [DEFAULT]/notification_driver #driver= # A URL representing the messaging driver to use for # notifications. If not set, we fall back to the same # configuration used for RPC. (string value) # Deprecated group/name - [DEFAULT]/notification_transport_url #transport_url= # AMQP topic used for OpenStack notifications. (list value) # Deprecated group/name - [rpc_notifier2]/topics # Deprecated group/name - [DEFAULT]/notification_topics #topics=notifications [oslo_messaging_rabbit] # # Options defined in oslo.messaging # # Use durable queues in AMQP. (boolean value) # Deprecated group/name - [DEFAULT]/amqp_durable_queues # Deprecated group/name - [DEFAULT]/rabbit_durable_queues #amqp_durable_queues=false # Auto-delete queues in AMQP. (boolean value) # Deprecated group/name - [DEFAULT]/amqp_auto_delete #amqp_auto_delete=false # SSL version to use (valid only if SSL enabled). Valid values # are TLSv1 and SSLv23. SSLv2, SSLv3, TLSv1_1, and TLSv1_2 may # be available on some distributions. (string value) # Deprecated group/name - [DEFAULT]/kombu_ssl_version #kombu_ssl_version= # SSL key file (valid only if SSL enabled). (string value) # Deprecated group/name - [DEFAULT]/kombu_ssl_keyfile #kombu_ssl_keyfile= # SSL cert file (valid only if SSL enabled). (string value) # Deprecated group/name - [DEFAULT]/kombu_ssl_certfile #kombu_ssl_certfile= # SSL certification authority file (valid only if SSL # enabled). (string value) # Deprecated group/name - [DEFAULT]/kombu_ssl_ca_certs #kombu_ssl_ca_certs= # How long to wait before reconnecting in response to an AMQP # consumer cancel notification. (floating point value) # Deprecated group/name - [DEFAULT]/kombu_reconnect_delay #kombu_reconnect_delay=1.0 # EXPERIMENTAL: Possible values are: gzip, bz2. If not set # compression will not be used. This option may notbe # available in future versions. (string value) #kombu_compression= # How long to wait a missing client beforce abandoning to send # it its replies. This value should not be longer than # rpc_response_timeout. (integer value) # Deprecated group/name - [oslo_messaging_rabbit]/kombu_reconnect_timeout #kombu_missing_consumer_retry_timeout=60 # Determines how the next RabbitMQ node is chosen in case the # one we are currently connected to becomes unavailable. Takes # effect only if more than one RabbitMQ node is provided in # config. (string value) # Possible values: round-robin, shuffle #kombu_failover_strategy=round-robin # The RabbitMQ broker address where a single node is used. # (string value) # Deprecated group/name - [DEFAULT]/rabbit_host #rabbit_host=localhost # The RabbitMQ broker port where a single node is used. (port # value) # Possible values: 0-65535 # Deprecated group/name - [DEFAULT]/rabbit_port #rabbit_port=5672 # RabbitMQ HA cluster host:port pairs. (list value) # Deprecated group/name - [DEFAULT]/rabbit_hosts #rabbit_hosts=$rabbit_host:$rabbit_port # Connect over SSL for RabbitMQ. (boolean value) # Deprecated group/name - [DEFAULT]/rabbit_use_ssl #rabbit_use_ssl=false # The RabbitMQ userid. (string value) # Deprecated group/name - [DEFAULT]/rabbit_userid #rabbit_userid=guest # The RabbitMQ password. (string value) # Deprecated group/name - [DEFAULT]/rabbit_password #rabbit_password=guest # The RabbitMQ login method. (string value) # Deprecated group/name - [DEFAULT]/rabbit_login_method #rabbit_login_method=AMQPLAIN # The RabbitMQ virtual host. (string value) # Deprecated group/name - [DEFAULT]/rabbit_virtual_host #rabbit_virtual_host=/ # How frequently to retry connecting with RabbitMQ. (integer # value) #rabbit_retry_interval=1 # How long to backoff for between retries when connecting to # RabbitMQ. (integer value) # Deprecated group/name - [DEFAULT]/rabbit_retry_backoff #rabbit_retry_backoff=2 # Maximum interval of RabbitMQ connection retries. Default is # 30 seconds. (integer value) #rabbit_interval_max=30 # Maximum number of RabbitMQ connection retries. Default is 0 # (infinite retry count). (integer value) # Deprecated group/name - [DEFAULT]/rabbit_max_retries #rabbit_max_retries=0 # Try to use HA queues in RabbitMQ (x-ha-policy: all). If you # change this option, you must wipe the RabbitMQ database. In # RabbitMQ 3.0, queue mirroring is no longer controlled by the # x-ha-policy argument when declaring a queue. If you just # want to make sure that all queues (except those with auto- # generated names) are mirrored across all nodes, run: # "rabbitmqctl set_policy HA '^(?!amq\.).*' '{"ha-mode": # "all"}' " (boolean value) # Deprecated group/name - [DEFAULT]/rabbit_ha_queues #rabbit_ha_queues=false # Positive integer representing duration in seconds for queue # TTL (x-expires). Queues which are unused for the duration of # the TTL are automatically deleted. The parameter affects # only reply and fanout queues. (integer value) # Minimum value: 1 #rabbit_transient_queues_ttl=1800 # Specifies the number of messages to prefetch. Setting to # zero allows unlimited messages. (integer value) #rabbit_qos_prefetch_count=0 # Number of seconds after which the Rabbit broker is # considered down if heartbeat's keep-alive fails (0 disable # the heartbeat). EXPERIMENTAL (integer value) #heartbeat_timeout_threshold=60 # How often times during the heartbeat_timeout_threshold we # check the heartbeat. (integer value) #heartbeat_rate=2 # Deprecated, use rpc_backend=kombu+memory or rpc_backend=fake # (boolean value) # Deprecated group/name - [DEFAULT]/fake_rabbit #fake_rabbit=false # Maximum number of channels to allow (integer value) #channel_max= # The maximum byte size for an AMQP frame (integer value) #frame_max= # How often to send heartbeats for consumer's connections # (integer value) #heartbeat_interval=1 # Enable SSL (boolean value) #ssl= # Arguments passed to ssl.wrap_socket (dict value) #ssl_options= # Set socket timeout in seconds for connection's socket # (floating point value) #socket_timeout=0.25 # Set TCP_USER_TIMEOUT in seconds for connection's socket # (floating point value) #tcp_user_timeout=0.25 # Set delay for reconnection to some host which has connection # error (floating point value) #host_connection_reconnect_delay=0.25 # Maximum number of connections to keep queued. (integer # value) #pool_max_size=10 # Maximum number of connections to create above # `pool_max_size`. (integer value) #pool_max_overflow=0 # Default number of seconds to wait for a connections to # available (integer value) #pool_timeout=30 # Lifetime of a connection (since creation) in seconds or None # for no recycling. Expired connections are closed on acquire. # (integer value) #pool_recycle=600 # Threshold at which inactive (since release) connections are # considered stale in seconds or None for no staleness. Stale # connections are closed on acquire. (integer value) #pool_stale=60 # Persist notification messages. (boolean value) #notification_persistence=false # Exchange name for for sending notifications (string value) #default_notification_exchange=${control_exchange}_notification # Max number of not acknowledged message which RabbitMQ can # send to notification listener. (integer value) #notification_listener_prefetch_count=100 # Reconnecting retry count in case of connectivity problem # during sending notification, -1 means infinite retry. # (integer value) #default_notification_retry_attempts=-1 # Reconnecting retry delay in case of connectivity problem # during sending notification message (floating point value) #notification_retry_delay=0.25 # Time to live for rpc queues without consumers in seconds. # (integer value) #rpc_queue_expiration=60 # Exchange name for sending RPC messages (string value) #default_rpc_exchange=${control_exchange}_rpc # Exchange name for receiving RPC replies (string value) #rpc_reply_exchange=${control_exchange}_rpc_reply # Max number of not acknowledged message which RabbitMQ can # send to rpc listener. (integer value) #rpc_listener_prefetch_count=100 # Max number of not acknowledged message which RabbitMQ can # send to rpc reply listener. (integer value) #rpc_reply_listener_prefetch_count=100 # Reconnecting retry count in case of connectivity problem # during sending reply. -1 means infinite retry during # rpc_timeout (integer value) #rpc_reply_retry_attempts=-1 # Reconnecting retry delay in case of connectivity problem # during sending reply. (floating point value) #rpc_reply_retry_delay=0.25 # Reconnecting retry count in case of connectivity problem # during sending RPC message, -1 means infinite retry. If # actual retry attempts in not 0 the rpc request could be # processed more then one time (integer value) #default_rpc_retry_attempts=-1 # Reconnecting retry delay in case of connectivity problem # during sending RPC message (floating point value) #rpc_retry_delay=0.25 [oslo_policy] # # Options defined in oslo.policy # # The JSON file that defines policies. (string value) # Deprecated group/name - [DEFAULT]/policy_file #policy_file=policy.json # Default rule. Enforced when a requested rule is not found. # (string value) # Deprecated group/name - [DEFAULT]/policy_default_rule #policy_default_rule=default # Directories where policy configuration files are stored. # They can be relative to any directory in the search path # defined by the config_dir option, or absolute paths. The # file defined by policy_file must exist for these directories # to be searched. Missing or empty directories are ignored. # (multi valued) # Deprecated group/name - [DEFAULT]/policy_dirs #policy_dirs=policy.d [pxe] # # Options defined in ironic.drivers.modules.iscsi_deploy # # Additional append parameters for baremetal PXE boot. (string # value) #pxe_append_params=nofb nomodeset vga=normal # Default file system format for ephemeral partition, if one # is created. (string value) #default_ephemeral_format=ext4 # On the ironic-conductor node, directory where images are # stored on disk. (string value) #images_path=/var/lib/ironic/images/ # On the ironic-conductor node, directory where master # instance images are stored on disk. Setting to # disables image caching. (string value) #instance_master_path=/var/lib/ironic/master_images # Maximum size (in MiB) of cache for master images, including # those in use. (integer value) #image_cache_size=20480 # Maximum TTL (in minutes) for old master images in cache. # (integer value) #image_cache_ttl=10080 # The disk devices to scan while doing the deploy. (string # value) #disk_devices=cciss/c0d0,sda,hda,vda # # Options defined in ironic.drivers.modules.pxe # # On ironic-conductor node, template file for PXE # configuration. (string value) #pxe_config_template=$pybasedir/drivers/modules/pxe_config.template # On ironic-conductor node, template file for PXE # configuration for UEFI boot loader. (string value) #uefi_pxe_config_template=$pybasedir/drivers/modules/elilo_efi_pxe_config.template # IP address of ironic-conductor node's TFTP server. (string # value) #tftp_server=$my_ip # ironic-conductor node's TFTP root path. The ironic-conductor # must have read/write access to this path. (string value) #tftp_root=/tftpboot # On ironic-conductor node, directory where master TFTP images # are stored on disk. Setting to disables image # caching. (string value) #tftp_master_path=/tftpboot/master_images # Bootfile DHCP parameter. (string value) #pxe_bootfile_name=pxelinux.0 # Bootfile DHCP parameter for UEFI boot mode. (string value) #uefi_pxe_bootfile_name=elilo.efi # Enable iPXE boot. (boolean value) #ipxe_enabled=false # On ironic-conductor node, the path to the main iPXE script # file. (string value) #ipxe_boot_script=$pybasedir/drivers/modules/boot.ipxe # Timeout value (in seconds) for downloading an image via # iPXE. Defaults to 0 (no timeout) (integer value) #ipxe_timeout=0 # The IP version that will be used for PXE booting. Defaults # to 4. EXPERIMENTAL (string value) # Possible values: 4, 6 #ip_version=4 [seamicro] # # Options defined in ironic.drivers.modules.seamicro # # Maximum retries for SeaMicro operations (integer value) #max_retry=3 # Seconds to wait for power action to be completed (integer # value) #action_timeout=10 [snmp] # # Options defined in ironic.drivers.modules.snmp # # Seconds to wait for power action to be completed (integer # value) #power_timeout=10 # Time (in seconds) to sleep between when rebooting (powering # off and on again) (integer value) # Minimum value: 0 #reboot_delay=0 [ssh] # # Options defined in ironic.drivers.modules.ssh # # libvirt URI. (string value) #libvirt_uri=qemu:///system # Number of attempts to try to get VM name used by the host # that corresponds to a node's MAC address. (integer value) #get_vm_name_attempts=3 # Number of seconds to wait between attempts to get VM name # used by the host that corresponds to a node's MAC address. # (integer value) #get_vm_name_retry_interval=3 [ssl] # # Options defined in oslo.service.sslutils # # CA certificate file to use to verify connecting clients. # (string value) # Deprecated group/name - [DEFAULT]/ssl_ca_file #ca_file= # Certificate file to use when starting the server securely. # (string value) # Deprecated group/name - [DEFAULT]/ssl_cert_file #cert_file= # Private key file to use when starting the server securely. # (string value) # Deprecated group/name - [DEFAULT]/ssl_key_file #key_file= # SSL version to use (valid only if SSL enabled). Valid values # are TLSv1 and SSLv23. SSLv2, SSLv3, TLSv1_1, and TLSv1_2 may # be available on some distributions. (string value) #version= # Sets the list of available ciphers. value should be a string # in the OpenSSL cipher list format. (string value) #ciphers= [swift] # # Options defined in ironic.common.swift # # Maximum number of times to retry a Swift request, before # failing. (integer value) #swift_max_retries=2 [virtualbox] # # Options defined in ironic.drivers.modules.virtualbox # # Port on which VirtualBox web service is listening. (port # value) # Possible values: 0-65535 #port=18083 ironic-5.1.2/etc/ironic/rootwrap.conf0000644000567000056710000000165412732316044020733 0ustar jenkinsjenkins00000000000000# Configuration for ironic-rootwrap # This file should be owned by (and only-writeable by) the root user [DEFAULT] # List of directories to load filter definitions from (separated by ','). # These directories MUST all be only writeable by root ! filters_path=/etc/ironic/rootwrap.d,/usr/share/ironic/rootwrap # List of directories to search executables in, in case filters do not # explicitely specify a full path (separated by ',') # If not specified, defaults to system PATH environment variable. # These directories MUST all be only writeable by root ! exec_dirs=/sbin,/usr/sbin,/bin,/usr/bin # Enable logging to syslog # Default value is False use_syslog=False # Which syslog facility to use. # Valid values include auth, authpriv, syslog, user0, user1... # Default value is 'syslog' syslog_log_facility=syslog # Which messages to log. # INFO means log all usage # ERROR means only log unsuccessful attempts syslog_log_level=ERROR ironic-5.1.2/etc/apache2/0000755000567000056710000000000012732316670016226 5ustar jenkinsjenkins00000000000000ironic-5.1.2/etc/apache2/ironic0000644000567000056710000000244612732316044017435 0ustar jenkinsjenkins00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # This is an example Apache2 configuration file for using the # Ironic API through mod_wsgi. This version assumes you are # running devstack to configure the software. Listen 6385 WSGIDaemonProcess ironic user=stack group=stack threads=10 display-name=%{GROUP} WSGIScriptAlias / /opt/stack/ironic/ironic/api/app.wsgi SetEnv APACHE_RUN_USER stack SetEnv APACHE_RUN_GROUP stack WSGIProcessGroup ironic ErrorLog /var/log/apache2/ironic_error.log LogLevel info CustomLog /var/log/apache2/ironic_access.log combined WSGIProcessGroup ironic WSGIApplicationGroup %{GLOBAL} AllowOverride All Require all granted ironic-5.1.2/ironic_tempest_plugin/0000755000567000056710000000000012732316670020552 5ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/clients.py0000644000567000056710000000257012732316050022561 0ustar jenkinsjenkins00000000000000# All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from tempest import clients from tempest.common import credentials_factory as common_creds from tempest import config from ironic_tempest_plugin.services.baremetal.v1.json.baremetal_client import \ BaremetalClient CONF = config.CONF ADMIN_CREDS = common_creds.get_configured_admin_credentials() class Manager(clients.Manager): def __init__(self, credentials=ADMIN_CREDS, service=None, api_microversions=None): super(Manager, self).__init__(credentials, service) self.baremetal_client = BaremetalClient( self.auth_provider, CONF.baremetal.catalog_type, CONF.identity.region, endpoint_type=CONF.baremetal.endpoint_type, **self.default_params_with_timeout_values) ironic-5.1.2/ironic_tempest_plugin/plugin.py0000644000567000056710000000256512732316044022425 0ustar jenkinsjenkins00000000000000# Copyright 2015 NEC Corporation # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import os from tempest import config from tempest.test_discover import plugins from ironic_tempest_plugin import config as project_config class IronicTempestPlugin(plugins.TempestPlugin): def load_tests(self): base_path = os.path.split(os.path.dirname( os.path.abspath(__file__)))[0] test_dir = "ironic_tempest_plugin/tests" full_test_dir = os.path.join(base_path, test_dir) return full_test_dir, base_path def register_opts(self, conf): config.register_opt_group(conf, project_config.baremetal_group, project_config.BaremetalGroup) def get_opt_lists(self): return [(project_config.baremetal_group.name, project_config.BaremetalGroup)] ironic-5.1.2/ironic_tempest_plugin/__init__.py0000644000567000056710000000000012732316044022644 0ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/tests/0000755000567000056710000000000012732316670021714 5ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/tests/api/0000755000567000056710000000000012732316670022465 5ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/tests/api/__init__.py0000644000567000056710000000000012732316044024557 0ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/tests/api/admin/0000755000567000056710000000000012732316670023555 5ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/tests/api/admin/test_nodes.py0000644000567000056710000001565612732316044026306 0ustar jenkinsjenkins00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import six from tempest.lib.common.utils import data_utils from tempest.lib import exceptions as lib_exc from tempest import test from ironic_tempest_plugin.common import waiters from ironic_tempest_plugin.tests.api.admin import base class TestNodes(base.BaseBaremetalTest): """Tests for baremetal nodes.""" def setUp(self): super(TestNodes, self).setUp() _, self.chassis = self.create_chassis() _, self.node = self.create_node(self.chassis['uuid']) def _assertExpected(self, expected, actual): # Check if not expected keys/values exists in actual response body for key, value in six.iteritems(expected): if key not in ('created_at', 'updated_at'): self.assertIn(key, actual) self.assertEqual(value, actual[key]) def _associate_node_with_instance(self): self.client.set_node_power_state(self.node['uuid'], 'power off') waiters.wait_for_bm_node_status(self.client, self.node['uuid'], 'power_state', 'power off') instance_uuid = data_utils.rand_uuid() self.client.update_node(self.node['uuid'], instance_uuid=instance_uuid) self.addCleanup(self.client.update_node, uuid=self.node['uuid'], instance_uuid=None) return instance_uuid @test.idempotent_id('4e939eb2-8a69-4e84-8652-6fffcbc9db8f') def test_create_node(self): params = {'cpu_arch': 'x86_64', 'cpus': '12', 'local_gb': '10', 'memory_mb': '1024'} _, body = self.create_node(self.chassis['uuid'], **params) self._assertExpected(params, body['properties']) @test.idempotent_id('9ade60a4-505e-4259-9ec4-71352cbbaf47') def test_delete_node(self): _, node = self.create_node(self.chassis['uuid']) self.delete_node(node['uuid']) self.assertRaises(lib_exc.NotFound, self.client.show_node, node['uuid']) @test.idempotent_id('55451300-057c-4ecf-8255-ba42a83d3a03') def test_show_node(self): _, loaded_node = self.client.show_node(self.node['uuid']) self._assertExpected(self.node, loaded_node) @test.idempotent_id('4ca123c4-160d-4d8d-a3f7-15feda812263') def test_list_nodes(self): _, body = self.client.list_nodes() self.assertIn(self.node['uuid'], [i['uuid'] for i in body['nodes']]) @test.idempotent_id('85b1f6e0-57fd-424c-aeff-c3422920556f') def test_list_nodes_association(self): _, body = self.client.list_nodes(associated=True) self.assertNotIn(self.node['uuid'], [n['uuid'] for n in body['nodes']]) self._associate_node_with_instance() _, body = self.client.list_nodes(associated=True) self.assertIn(self.node['uuid'], [n['uuid'] for n in body['nodes']]) _, body = self.client.list_nodes(associated=False) self.assertNotIn(self.node['uuid'], [n['uuid'] for n in body['nodes']]) @test.idempotent_id('18c4ebd8-f83a-4df7-9653-9fb33a329730') def test_node_port_list(self): _, port = self.create_port(self.node['uuid'], data_utils.rand_mac_address()) _, body = self.client.list_node_ports(self.node['uuid']) self.assertIn(port['uuid'], [p['uuid'] for p in body['ports']]) @test.idempotent_id('72591acb-f215-49db-8395-710d14eb86ab') def test_node_port_list_no_ports(self): _, node = self.create_node(self.chassis['uuid']) _, body = self.client.list_node_ports(node['uuid']) self.assertEmpty(body['ports']) @test.idempotent_id('4fed270a-677a-4d19-be87-fd38ae490320') def test_update_node(self): props = {'cpu_arch': 'x86_64', 'cpus': '12', 'local_gb': '10', 'memory_mb': '128'} _, node = self.create_node(self.chassis['uuid'], **props) new_p = {'cpu_arch': 'x86', 'cpus': '1', 'local_gb': '10000', 'memory_mb': '12300'} _, body = self.client.update_node(node['uuid'], properties=new_p) _, node = self.client.show_node(node['uuid']) self._assertExpected(new_p, node['properties']) @test.idempotent_id('cbf1f515-5f4b-4e49-945c-86bcaccfeb1d') def test_validate_driver_interface(self): _, body = self.client.validate_driver_interface(self.node['uuid']) core_interfaces = ['power', 'deploy'] for interface in core_interfaces: self.assertIn(interface, body) @test.idempotent_id('5519371c-26a2-46e9-aa1a-f74226e9d71f') def test_set_node_boot_device(self): self.client.set_node_boot_device(self.node['uuid'], 'pxe') @test.idempotent_id('9ea73775-f578-40b9-bc34-efc639c4f21f') def test_get_node_boot_device(self): body = self.client.get_node_boot_device(self.node['uuid']) self.assertIn('boot_device', body) self.assertIn('persistent', body) self.assertTrue(isinstance(body['boot_device'], six.string_types)) self.assertTrue(isinstance(body['persistent'], bool)) @test.idempotent_id('3622bc6f-3589-4bc2-89f3-50419c66b133') def test_get_node_supported_boot_devices(self): body = self.client.get_node_supported_boot_devices(self.node['uuid']) self.assertIn('supported_boot_devices', body) self.assertTrue(isinstance(body['supported_boot_devices'], list)) @test.idempotent_id('f63b6288-1137-4426-8cfe-0d5b7eb87c06') def test_get_console(self): _, body = self.client.get_console(self.node['uuid']) con_info = ['console_enabled', 'console_info'] for key in con_info: self.assertIn(key, body) @test.idempotent_id('80504575-9b21-4670-92d1-143b948f9437') def test_set_console_mode(self): self.client.set_console_mode(self.node['uuid'], True) _, body = self.client.get_console(self.node['uuid']) self.assertEqual(True, body['console_enabled']) @test.idempotent_id('b02a4f38-5e8b-44b2-aed2-a69a36ecfd69') def test_get_node_by_instance_uuid(self): instance_uuid = self._associate_node_with_instance() _, body = self.client.show_node_by_instance_uuid(instance_uuid) self.assertEqual(len(body['nodes']), 1) self.assertIn(self.node['uuid'], [n['uuid'] for n in body['nodes']]) ironic-5.1.2/ironic_tempest_plugin/tests/api/admin/test_ports_negative.py0000644000567000056710000003223212732316044030214 0ustar jenkinsjenkins00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from tempest.lib.common.utils import data_utils from tempest.lib import exceptions as lib_exc from tempest import test from ironic_tempest_plugin.tests.api.admin import base class TestPortsNegative(base.BaseBaremetalTest): """Negative tests for ports.""" def setUp(self): super(TestPortsNegative, self).setUp() _, self.chassis = self.create_chassis() _, self.node = self.create_node(self.chassis['uuid']) @test.attr(type=['negative']) @test.idempotent_id('0a6ee1f7-d0d9-4069-8778-37f3aa07303a') def test_create_port_malformed_mac(self): node_id = self.node['uuid'] address = 'malformed:mac' self.assertRaises(lib_exc.BadRequest, self.create_port, node_id=node_id, address=address) @test.attr(type=['negative']) @test.idempotent_id('30277ee8-0c60-4f1d-b125-0e51c2f43369') def test_create_port_nonexsistent_node_id(self): node_id = str(data_utils.rand_uuid()) address = data_utils.rand_mac_address() self.assertRaises(lib_exc.BadRequest, self.create_port, node_id=node_id, address=address) @test.attr(type=['negative']) @test.idempotent_id('029190f6-43e1-40a3-b64a-65173ba653a3') def test_show_port_malformed_uuid(self): self.assertRaises(lib_exc.BadRequest, self.client.show_port, 'malformed:uuid') @test.attr(type=['negative']) @test.idempotent_id('0d00e13d-e2e0-45b1-bcbc-55a6d90ca793') def test_show_port_nonexistent_uuid(self): self.assertRaises(lib_exc.NotFound, self.client.show_port, data_utils.rand_uuid()) @test.attr(type=['negative']) @test.idempotent_id('4ad85266-31e9-4942-99ac-751897dc9e23') def test_show_port_by_mac_not_allowed(self): self.assertRaises(lib_exc.BadRequest, self.client.show_port, data_utils.rand_mac_address()) @test.attr(type=['negative']) @test.idempotent_id('89a34380-3c61-4c32-955c-2cd9ce94da21') def test_create_port_duplicated_port_uuid(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() uuid = data_utils.rand_uuid() self.create_port(node_id=node_id, address=address, uuid=uuid) self.assertRaises(lib_exc.Conflict, self.create_port, node_id=node_id, address=address, uuid=uuid) @test.attr(type=['negative']) @test.idempotent_id('65e84917-733c-40ae-ae4b-96a4adff931c') def test_create_port_no_mandatory_field_node_id(self): address = data_utils.rand_mac_address() self.assertRaises(lib_exc.BadRequest, self.create_port, node_id=None, address=address) @test.attr(type=['negative']) @test.idempotent_id('bcea3476-7033-4183-acfe-e56a30809b46') def test_create_port_no_mandatory_field_mac(self): node_id = self.node['uuid'] self.assertRaises(lib_exc.BadRequest, self.create_port, node_id=node_id, address=None) @test.attr(type=['negative']) @test.idempotent_id('2b51cd18-fb95-458b-9780-e6257787b649') def test_create_port_malformed_port_uuid(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() uuid = 'malformed:uuid' self.assertRaises(lib_exc.BadRequest, self.create_port, node_id=node_id, address=address, uuid=uuid) @test.attr(type=['negative']) @test.idempotent_id('583a6856-6a30-4ac4-889f-14e2adff8105') def test_create_port_malformed_node_id(self): address = data_utils.rand_mac_address() self.assertRaises(lib_exc.BadRequest, self.create_port, node_id='malformed:nodeid', address=address) @test.attr(type=['negative']) @test.idempotent_id('e27f8b2e-42c6-4a43-a3cd-accff716bc5c') def test_create_port_duplicated_mac(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() self.create_port(node_id=node_id, address=address) self.assertRaises(lib_exc.Conflict, self.create_port, node_id=node_id, address=address) @test.attr(type=['negative']) @test.idempotent_id('8907082d-ac5e-4be3-b05f-d072ede82020') def test_update_port_by_mac_not_allowed(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() extra = {'key': 'value'} self.create_port(node_id=node_id, address=address, extra=extra) patch = [{'path': '/extra/key', 'op': 'replace', 'value': 'new-value'}] self.assertRaises(lib_exc.BadRequest, self.client.update_port, address, patch) @test.attr(type=['negative']) @test.idempotent_id('df1ac70c-db9f-41d9-90f1-78cd6b905718') def test_update_port_nonexistent(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() extra = {'key': 'value'} _, port = self.create_port(node_id=node_id, address=address, extra=extra) port_id = port['uuid'] _, body = self.client.delete_port(port_id) patch = [{'path': '/extra/key', 'op': 'replace', 'value': 'new-value'}] self.assertRaises(lib_exc.NotFound, self.client.update_port, port_id, patch) @test.attr(type=['negative']) @test.idempotent_id('c701e315-aa52-41ea-817c-65c5ca8ca2a8') def test_update_port_malformed_port_uuid(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() self.create_port(node_id=node_id, address=address) new_address = data_utils.rand_mac_address() self.assertRaises(lib_exc.BadRequest, self.client.update_port, uuid='malformed:uuid', patch=[{'path': '/address', 'op': 'replace', 'value': new_address}]) @test.attr(type=['negative']) @test.idempotent_id('f8f15803-34d6-45dc-b06f-e5e04bf1b38b') def test_update_port_add_nonexistent_property(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() _, port = self.create_port(node_id=node_id, address=address) port_id = port['uuid'] self.assertRaises(lib_exc.BadRequest, self.client.update_port, port_id, [{'path': '/nonexistent', ' op': 'add', 'value': 'value'}]) @test.attr(type=['negative']) @test.idempotent_id('898ec904-38b1-4fcb-9584-1187d4263a2a') def test_update_port_replace_node_id_with_malformed(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() _, port = self.create_port(node_id=node_id, address=address) port_id = port['uuid'] patch = [{'path': '/node_uuid', 'op': 'replace', 'value': 'malformed:node_uuid'}] self.assertRaises(lib_exc.BadRequest, self.client.update_port, port_id, patch) @test.attr(type=['negative']) @test.idempotent_id('2949f30f-5f59-43fa-a6d9-4eac578afab4') def test_update_port_replace_mac_with_duplicated(self): node_id = self.node['uuid'] address1 = data_utils.rand_mac_address() address2 = data_utils.rand_mac_address() _, port1 = self.create_port(node_id=node_id, address=address1) _, port2 = self.create_port(node_id=node_id, address=address2) port_id = port2['uuid'] patch = [{'path': '/address', 'op': 'replace', 'value': address1}] self.assertRaises(lib_exc.Conflict, self.client.update_port, port_id, patch) @test.attr(type=['negative']) @test.idempotent_id('97f6e048-6e4f-4eba-a09d-fbbc78b77a77') def test_update_port_replace_node_id_with_nonexistent(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() _, port = self.create_port(node_id=node_id, address=address) port_id = port['uuid'] patch = [{'path': '/node_uuid', 'op': 'replace', 'value': data_utils.rand_uuid()}] self.assertRaises(lib_exc.BadRequest, self.client.update_port, port_id, patch) @test.attr(type=['negative']) @test.idempotent_id('375022c5-9e9e-4b11-9ca4-656729c0c9b2') def test_update_port_replace_mac_with_malformed(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() _, port = self.create_port(node_id=node_id, address=address) port_id = port['uuid'] patch = [{'path': '/address', 'op': 'replace', 'value': 'malformed:mac'}] self.assertRaises(lib_exc.BadRequest, self.client.update_port, port_id, patch) @test.attr(type=['negative']) @test.idempotent_id('5722b853-03fc-4854-8308-2036a1b67d85') def test_update_port_replace_nonexistent_property(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() _, port = self.create_port(node_id=node_id, address=address) port_id = port['uuid'] patch = [{'path': '/nonexistent', ' op': 'replace', 'value': 'value'}] self.assertRaises(lib_exc.BadRequest, self.client.update_port, port_id, patch) @test.attr(type=['negative']) @test.idempotent_id('ae2696ca-930a-4a7f-918f-30ae97c60f56') def test_update_port_remove_mandatory_field_mac(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() _, port = self.create_port(node_id=node_id, address=address) port_id = port['uuid'] self.assertRaises(lib_exc.BadRequest, self.client.update_port, port_id, [{'path': '/address', 'op': 'remove'}]) @test.attr(type=['negative']) @test.idempotent_id('5392c1f0-2071-4697-9064-ec2d63019018') def test_update_port_remove_mandatory_field_port_uuid(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() _, port = self.create_port(node_id=node_id, address=address) port_id = port['uuid'] self.assertRaises(lib_exc.BadRequest, self.client.update_port, port_id, [{'path': '/uuid', 'op': 'remove'}]) @test.attr(type=['negative']) @test.idempotent_id('06b50d82-802a-47ef-b079-0a3311cf85a2') def test_update_port_remove_nonexistent_property(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() _, port = self.create_port(node_id=node_id, address=address) port_id = port['uuid'] self.assertRaises(lib_exc.BadRequest, self.client.update_port, port_id, [{'path': '/nonexistent', 'op': 'remove'}]) @test.attr(type=['negative']) @test.idempotent_id('03d42391-2145-4a6c-95bf-63fe55eb64fd') def test_delete_port_by_mac_not_allowed(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() self.create_port(node_id=node_id, address=address) self.assertRaises(lib_exc.BadRequest, self.client.delete_port, address) @test.attr(type=['negative']) @test.idempotent_id('0629e002-818e-4763-b25b-ae5e07b1cb23') def test_update_port_mixed_ops_integrity(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() extra = {'key1': 'value1', 'key2': 'value2'} _, port = self.create_port(node_id=node_id, address=address, extra=extra) port_id = port['uuid'] new_address = data_utils.rand_mac_address() new_extra = {'key1': 'new-value1', 'key3': 'new-value3'} patch = [{'path': '/address', 'op': 'replace', 'value': new_address}, {'path': '/extra/key1', 'op': 'replace', 'value': new_extra['key1']}, {'path': '/extra/key2', 'op': 'remove'}, {'path': '/extra/key3', 'op': 'add', 'value': new_extra['key3']}, {'path': '/nonexistent', 'op': 'replace', 'value': 'value'}] self.assertRaises(lib_exc.BadRequest, self.client.update_port, port_id, patch) # patch should not be applied _, body = self.client.show_port(port_id) self.assertEqual(address, body['address']) self.assertEqual(extra, body['extra']) ironic-5.1.2/ironic_tempest_plugin/tests/api/admin/test_api_discovery.py0000644000567000056710000000324712732316044030027 0ustar jenkinsjenkins00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from tempest import test from ironic_tempest_plugin.tests.api.admin import base class TestApiDiscovery(base.BaseBaremetalTest): """Tests for API discovery features.""" @test.idempotent_id('a3c27e94-f56c-42c4-8600-d6790650b9c5') def test_api_versions(self): _, descr = self.client.get_api_description() expected_versions = ('v1',) versions = [version['id'] for version in descr['versions']] for v in expected_versions: self.assertIn(v, versions) @test.idempotent_id('896283a6-488e-4f31-af78-6614286cbe0d') def test_default_version(self): _, descr = self.client.get_api_description() default_version = descr['default_version'] self.assertEqual(default_version['id'], 'v1') @test.idempotent_id('abc0b34d-e684-4546-9728-ab7a9ad9f174') def test_version_1_resources(self): _, descr = self.client.get_version_description(version='v1') expected_resources = ('nodes', 'chassis', 'ports', 'links', 'media_types') for res in expected_resources: self.assertIn(res, descr) ironic-5.1.2/ironic_tempest_plugin/tests/api/admin/test_nodestates.py0000644000567000056710000000460212732316050027331 0ustar jenkinsjenkins00000000000000# Copyright 2014 NEC Corporation. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from oslo_utils import timeutils from tempest.lib import exceptions from tempest import test from ironic_tempest_plugin.tests.api.admin import base class TestNodeStates(base.BaseBaremetalTest): """Tests for baremetal NodeStates.""" @classmethod def resource_setup(cls): super(TestNodeStates, cls).resource_setup() _, cls.chassis = cls.create_chassis() _, cls.node = cls.create_node(cls.chassis['uuid']) def _validate_power_state(self, node_uuid, power_state): # Validate that power state is set within timeout if power_state == 'rebooting': power_state = 'power on' start = timeutils.utcnow() while timeutils.delta_seconds( start, timeutils.utcnow()) < self.power_timeout: _, node = self.client.show_node(node_uuid) if node['power_state'] == power_state: return message = ('Failed to set power state within ' 'the required time: %s sec.' % self.power_timeout) raise exceptions.TimeoutException(message) @test.idempotent_id('cd8afa5e-3f57-4e43-8185-beb83d3c9015') def test_list_nodestates(self): _, nodestates = self.client.list_nodestates(self.node['uuid']) for key in nodestates: self.assertEqual(nodestates[key], self.node[key]) @test.idempotent_id('fc5b9320-0c98-4e5a-8848-877fe5a0322c') def test_set_node_power_state(self): _, node = self.create_node(self.chassis['uuid']) states = ["power on", "rebooting", "power off"] for state in states: # Set power state self.client.set_node_power_state(node['uuid'], state) # Check power state after state is set self._validate_power_state(node['uuid'], state) ironic-5.1.2/ironic_tempest_plugin/tests/api/admin/__init__.py0000644000567000056710000000000012732316044025647 0ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/tests/api/admin/base.py0000644000567000056710000001511412732316050025033 0ustar jenkinsjenkins00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import functools from tempest import config from tempest.lib.common.utils import data_utils from tempest.lib import exceptions as lib_exc from tempest import test from ironic_tempest_plugin import clients CONF = config.CONF # NOTE(adam_g): The baremetal API tests exercise operations such as enroll # node, power on, power off, etc. Testing against real drivers (ie, IPMI) # will require passing driver-specific data to Tempest (addresses, # credentials, etc). Until then, only support testing against the fake driver, # which has no external dependencies. SUPPORTED_DRIVERS = ['fake'] # NOTE(jroll): resources must be deleted in a specific order, this list # defines the resource types to clean up, and the correct order. RESOURCE_TYPES = ['port', 'node', 'chassis'] def creates(resource): """Decorator that adds resources to the appropriate cleanup list.""" def decorator(f): @functools.wraps(f) def wrapper(cls, *args, **kwargs): resp, body = f(cls, *args, **kwargs) if 'uuid' in body: cls.created_objects[resource].add(body['uuid']) return resp, body return wrapper return decorator class BaseBaremetalTest(test.BaseTestCase): """Base class for Baremetal API tests.""" credentials = ['admin'] @classmethod def skip_checks(cls): super(BaseBaremetalTest, cls).skip_checks() if CONF.baremetal.driver not in SUPPORTED_DRIVERS: skip_msg = ('%s skipped as Ironic driver %s is not supported for ' 'testing.' % (cls.__name__, CONF.baremetal.driver)) raise cls.skipException(skip_msg) @classmethod def setup_clients(cls): super(BaseBaremetalTest, cls).setup_clients() cls.client = clients.Manager().baremetal_client @classmethod def resource_setup(cls): super(BaseBaremetalTest, cls).resource_setup() cls.driver = CONF.baremetal.driver cls.power_timeout = CONF.baremetal.power_timeout cls.created_objects = {} for resource in RESOURCE_TYPES: cls.created_objects[resource] = set() @classmethod def resource_cleanup(cls): """Ensure that all created objects get destroyed.""" try: for resource in RESOURCE_TYPES: uuids = cls.created_objects[resource] delete_method = getattr(cls.client, 'delete_%s' % resource) for u in uuids: delete_method(u, ignore_errors=lib_exc.NotFound) finally: super(BaseBaremetalTest, cls).resource_cleanup() @classmethod @creates('chassis') def create_chassis(cls, description=None, expect_errors=False): """Wrapper utility for creating test chassis. :param description: A description of the chassis. if not supplied, a random value will be generated. :return: Created chassis. """ description = description or data_utils.rand_name('test-chassis') resp, body = cls.client.create_chassis(description=description) return resp, body @classmethod @creates('node') def create_node(cls, chassis_id, cpu_arch='x86', cpus=8, local_gb=10, memory_mb=4096): """Wrapper utility for creating test baremetal nodes. :param cpu_arch: CPU architecture of the node. Default: x86. :param cpus: Number of CPUs. Default: 8. :param local_gb: Disk size. Default: 10. :param memory_mb: Available RAM. Default: 4096. :return: Created node. """ resp, body = cls.client.create_node(chassis_id, cpu_arch=cpu_arch, cpus=cpus, local_gb=local_gb, memory_mb=memory_mb, driver=cls.driver) return resp, body @classmethod @creates('port') def create_port(cls, node_id, address, extra=None, uuid=None): """Wrapper utility for creating test ports. :param address: MAC address of the port. :param extra: Meta data of the port. If not supplied, an empty dictionary will be created. :param uuid: UUID of the port. :return: Created port. """ extra = extra or {} resp, body = cls.client.create_port(address=address, node_id=node_id, extra=extra, uuid=uuid) return resp, body @classmethod def delete_chassis(cls, chassis_id): """Deletes a chassis having the specified UUID. :param uuid: The unique identifier of the chassis. :return: Server response. """ resp, body = cls.client.delete_chassis(chassis_id) if chassis_id in cls.created_objects['chassis']: cls.created_objects['chassis'].remove(chassis_id) return resp @classmethod def delete_node(cls, node_id): """Deletes a node having the specified UUID. :param uuid: The unique identifier of the node. :return: Server response. """ resp, body = cls.client.delete_node(node_id) if node_id in cls.created_objects['node']: cls.created_objects['node'].remove(node_id) return resp @classmethod def delete_port(cls, port_id): """Deletes a port having the specified UUID. :param uuid: The unique identifier of the port. :return: Server response. """ resp, body = cls.client.delete_port(port_id) if port_id in cls.created_objects['port']: cls.created_objects['port'].remove(port_id) return resp def validate_self_link(self, resource, uuid, link): """Check whether the given self link formatted correctly.""" expected_link = "{base}/{pref}/{res}/{uuid}".format( base=self.client.base_url, pref=self.client.uri_prefix, res=resource, uuid=uuid) self.assertEqual(expected_link, link) ironic-5.1.2/ironic_tempest_plugin/tests/api/admin/test_chassis.py0000644000567000056710000000661512732316044026626 0ustar jenkinsjenkins00000000000000# -*- coding: utf-8 -*- # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import six from tempest.lib.common.utils import data_utils from tempest.lib import exceptions as lib_exc from tempest import test from ironic_tempest_plugin.tests.api.admin import base class TestChassis(base.BaseBaremetalTest): """Tests for chassis.""" @classmethod def resource_setup(cls): super(TestChassis, cls).resource_setup() _, cls.chassis = cls.create_chassis() def _assertExpected(self, expected, actual): # Check if not expected keys/values exists in actual response body for key, value in six.iteritems(expected): if key not in ('created_at', 'updated_at'): self.assertIn(key, actual) self.assertEqual(value, actual[key]) @test.idempotent_id('7c5a2e09-699c-44be-89ed-2bc189992d42') def test_create_chassis(self): descr = data_utils.rand_name('test-chassis') _, chassis = self.create_chassis(description=descr) self.assertEqual(chassis['description'], descr) @test.idempotent_id('cabe9c6f-dc16-41a7-b6b9-0a90c212edd5') def test_create_chassis_unicode_description(self): # Use a unicode string for testing: # 'We ♡ OpenStack in Ukraine' descr = u'Ð’ Україні ♡ OpenStack!' _, chassis = self.create_chassis(description=descr) self.assertEqual(chassis['description'], descr) @test.idempotent_id('c84644df-31c4-49db-a307-8942881f41c0') def test_show_chassis(self): _, chassis = self.client.show_chassis(self.chassis['uuid']) self._assertExpected(self.chassis, chassis) @test.idempotent_id('29c9cd3f-19b5-417b-9864-99512c3b33b3') def test_list_chassis(self): _, body = self.client.list_chassis() self.assertIn(self.chassis['uuid'], [i['uuid'] for i in body['chassis']]) @test.idempotent_id('5ae649ad-22d1-4fe1-bbc6-97227d199fb3') def test_delete_chassis(self): _, body = self.create_chassis() uuid = body['uuid'] self.delete_chassis(uuid) self.assertRaises(lib_exc.NotFound, self.client.show_chassis, uuid) @test.idempotent_id('cda8a41f-6be2-4cbf-840c-994b00a89b44') def test_update_chassis(self): _, body = self.create_chassis() uuid = body['uuid'] new_description = data_utils.rand_name('new-description') _, body = (self.client.update_chassis(uuid, description=new_description)) _, chassis = self.client.show_chassis(uuid) self.assertEqual(chassis['description'], new_description) @test.idempotent_id('76305e22-a4e2-4ab3-855c-f4e2368b9335') def test_chassis_node_list(self): _, node = self.create_node(self.chassis['uuid']) _, body = self.client.list_chassis_nodes(self.chassis['uuid']) self.assertIn(node['uuid'], [n['uuid'] for n in body['nodes']]) ironic-5.1.2/ironic_tempest_plugin/tests/api/admin/test_ports.py0000644000567000056710000002407212732316044026335 0ustar jenkinsjenkins00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import six from tempest.lib.common.utils import data_utils from tempest.lib import exceptions as lib_exc from tempest import test from ironic_tempest_plugin.tests.api.admin import base class TestPorts(base.BaseBaremetalTest): """Tests for ports.""" def setUp(self): super(TestPorts, self).setUp() _, self.chassis = self.create_chassis() _, self.node = self.create_node(self.chassis['uuid']) _, self.port = self.create_port(self.node['uuid'], data_utils.rand_mac_address()) def _assertExpected(self, expected, actual): # Check if not expected keys/values exists in actual response body for key, value in six.iteritems(expected): if key not in ('created_at', 'updated_at'): self.assertIn(key, actual) self.assertEqual(value, actual[key]) @test.idempotent_id('83975898-2e50-42ed-b5f0-e510e36a0b56') def test_create_port(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() _, port = self.create_port(node_id=node_id, address=address) _, body = self.client.show_port(port['uuid']) self._assertExpected(port, body) @test.idempotent_id('d1f6b249-4cf6-4fe6-9ed6-a6e84b1bf67b') def test_create_port_specifying_uuid(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() uuid = data_utils.rand_uuid() _, port = self.create_port(node_id=node_id, address=address, uuid=uuid) _, body = self.client.show_port(uuid) self._assertExpected(port, body) @test.idempotent_id('4a02c4b0-6573-42a4-a513-2e36ad485b62') def test_create_port_with_extra(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() extra = {'str': 'value', 'int': 123, 'float': 0.123, 'bool': True, 'list': [1, 2, 3], 'dict': {'foo': 'bar'}} _, port = self.create_port(node_id=node_id, address=address, extra=extra) _, body = self.client.show_port(port['uuid']) self._assertExpected(port, body) @test.idempotent_id('1bf257a9-aea3-494e-89c0-63f657ab4fdd') def test_delete_port(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() _, port = self.create_port(node_id=node_id, address=address) self.delete_port(port['uuid']) self.assertRaises(lib_exc.NotFound, self.client.show_port, port['uuid']) @test.idempotent_id('9fa77ab5-ce59-4f05-baac-148904ba1597') def test_show_port(self): _, port = self.client.show_port(self.port['uuid']) self._assertExpected(self.port, port) @test.idempotent_id('7c1114ff-fc3f-47bb-bc2f-68f61620ba8b') def test_show_port_by_address(self): _, port = self.client.show_port_by_address(self.port['address']) self._assertExpected(self.port, port['ports'][0]) @test.idempotent_id('bd773405-aea5-465d-b576-0ab1780069e5') def test_show_port_with_links(self): _, port = self.client.show_port(self.port['uuid']) self.assertIn('links', port.keys()) self.assertEqual(2, len(port['links'])) self.assertIn(port['uuid'], port['links'][0]['href']) @test.idempotent_id('b5e91854-5cd7-4a8e-bb35-3e0a1314606d') def test_list_ports(self): _, body = self.client.list_ports() self.assertIn(self.port['uuid'], [i['uuid'] for i in body['ports']]) # Verify self links. for port in body['ports']: self.validate_self_link('ports', port['uuid'], port['links'][0]['href']) @test.idempotent_id('324a910e-2f80-4258-9087-062b5ae06240') def test_list_with_limit(self): _, body = self.client.list_ports(limit=3) next_marker = body['ports'][-1]['uuid'] self.assertIn(next_marker, body['next']) @test.idempotent_id('8a94b50f-9895-4a63-a574-7ecff86e5875') def test_list_ports_details(self): node_id = self.node['uuid'] uuids = [ self.create_port(node_id=node_id, address=data_utils.rand_mac_address()) [1]['uuid'] for i in range(0, 5)] _, body = self.client.list_ports_detail() ports_dict = dict((port['uuid'], port) for port in body['ports'] if port['uuid'] in uuids) for uuid in uuids: self.assertIn(uuid, ports_dict) port = ports_dict[uuid] self.assertIn('extra', port) self.assertIn('node_uuid', port) # never expose the node_id self.assertNotIn('node_id', port) # Verify self link. self.validate_self_link('ports', port['uuid'], port['links'][0]['href']) @test.idempotent_id('8a03f688-7d75-4ecd-8cbc-e06b8f346738') def test_list_ports_details_with_address(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() self.create_port(node_id=node_id, address=address) for i in range(0, 5): self.create_port(node_id=node_id, address=data_utils.rand_mac_address()) _, body = self.client.list_ports_detail(address=address) self.assertEqual(1, len(body['ports'])) self.assertEqual(address, body['ports'][0]['address']) @test.idempotent_id('9c26298b-1bcb-47b7-9b9e-8bdd6e3c4aba') def test_update_port_replace(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() extra = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'} _, port = self.create_port(node_id=node_id, address=address, extra=extra) new_address = data_utils.rand_mac_address() new_extra = {'key1': 'new-value1', 'key2': 'new-value2', 'key3': 'new-value3'} patch = [{'path': '/address', 'op': 'replace', 'value': new_address}, {'path': '/extra/key1', 'op': 'replace', 'value': new_extra['key1']}, {'path': '/extra/key2', 'op': 'replace', 'value': new_extra['key2']}, {'path': '/extra/key3', 'op': 'replace', 'value': new_extra['key3']}] self.client.update_port(port['uuid'], patch) _, body = self.client.show_port(port['uuid']) self.assertEqual(new_address, body['address']) self.assertEqual(new_extra, body['extra']) @test.idempotent_id('d7e7fece-6ed9-460a-9ebe-9267217e8580') def test_update_port_remove(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() extra = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'} _, port = self.create_port(node_id=node_id, address=address, extra=extra) # Removing one item from the collection self.client.update_port(port['uuid'], [{'path': '/extra/key2', 'op': 'remove'}]) extra.pop('key2') _, body = self.client.show_port(port['uuid']) self.assertEqual(extra, body['extra']) # Removing the collection self.client.update_port(port['uuid'], [{'path': '/extra', 'op': 'remove'}]) _, body = self.client.show_port(port['uuid']) self.assertEqual({}, body['extra']) # Assert nothing else was changed self.assertEqual(node_id, body['node_uuid']) self.assertEqual(address, body['address']) @test.idempotent_id('241288b3-e98a-400f-a4d7-d1f716146361') def test_update_port_add(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() _, port = self.create_port(node_id=node_id, address=address) extra = {'key1': 'value1', 'key2': 'value2'} patch = [{'path': '/extra/key1', 'op': 'add', 'value': extra['key1']}, {'path': '/extra/key2', 'op': 'add', 'value': extra['key2']}] self.client.update_port(port['uuid'], patch) _, body = self.client.show_port(port['uuid']) self.assertEqual(extra, body['extra']) @test.idempotent_id('5309e897-0799-4649-a982-0179b04c3876') def test_update_port_mixed_ops(self): node_id = self.node['uuid'] address = data_utils.rand_mac_address() extra = {'key1': 'value1', 'key2': 'value2'} _, port = self.create_port(node_id=node_id, address=address, extra=extra) new_address = data_utils.rand_mac_address() new_extra = {'key1': 0.123, 'key3': {'cat': 'meow'}} patch = [{'path': '/address', 'op': 'replace', 'value': new_address}, {'path': '/extra/key1', 'op': 'replace', 'value': new_extra['key1']}, {'path': '/extra/key2', 'op': 'remove'}, {'path': '/extra/key3', 'op': 'add', 'value': new_extra['key3']}] self.client.update_port(port['uuid'], patch) _, body = self.client.show_port(port['uuid']) self.assertEqual(new_address, body['address']) self.assertEqual(new_extra, body['extra']) ironic-5.1.2/ironic_tempest_plugin/tests/api/admin/test_drivers.py0000644000567000056710000000264212732316044026643 0ustar jenkinsjenkins00000000000000# Copyright 2014 NEC Corporation. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from tempest import config from tempest import test from ironic_tempest_plugin.tests.api.admin import base CONF = config.CONF class TestDrivers(base.BaseBaremetalTest): """Tests for drivers.""" @classmethod def resource_setup(cls): super(TestDrivers, cls).resource_setup() cls.driver_name = CONF.baremetal.driver @test.idempotent_id('5aed2790-7592-4655-9b16-99abcc2e6ec5') def test_list_drivers(self): _, drivers = self.client.list_drivers() self.assertIn(self.driver_name, [d['name'] for d in drivers['drivers']]) @test.idempotent_id('fb3287a3-c4d7-44bf-ae9d-1eef906d78ce') def test_show_driver(self): _, driver = self.client.show_driver(self.driver_name) self.assertEqual(self.driver_name, driver['name']) ironic-5.1.2/ironic_tempest_plugin/tests/__init__.py0000644000567000056710000000000012732316044024006 0ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/tests/scenario/0000755000567000056710000000000012732316670023517 5ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/tests/scenario/__init__.py0000644000567000056710000000000012732316044025611 0ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/tests/scenario/test_baremetal_basic_ops.py0000644000567000056710000001223712732316044031106 0ustar jenkinsjenkins00000000000000# # Copyright 2014 Hewlett-Packard Development Company, L.P. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from oslo_log import log as logging from tempest.common import waiters from tempest import config from tempest import test from ironic_tempest_plugin.tests.scenario import baremetal_manager CONF = config.CONF LOG = logging.getLogger(__name__) class BaremetalBasicOps(baremetal_manager.BaremetalScenarioTest): """This smoke test tests the pxe_ssh Ironic driver. It follows this basic set of operations: * Creates a keypair * Boots an instance using the keypair * Monitors the associated Ironic node for power and expected state transitions * Validates Ironic node's port data has been properly updated * Verifies SSH connectivity using created keypair via fixed IP * Associates a floating ip * Verifies SSH connectivity using created keypair via floating IP * Verifies instance rebuild with ephemeral partition preservation * Deletes instance * Monitors the associated Ironic node for power and expected state transitions """ def rebuild_instance(self, preserve_ephemeral=False): self.rebuild_server(server_id=self.instance['id'], preserve_ephemeral=preserve_ephemeral, wait=False) node = self.get_node(instance_id=self.instance['id']) # We should remain on the same node self.assertEqual(self.node['uuid'], node['uuid']) self.node = node waiters.wait_for_server_status( self.servers_client, server_id=self.instance['id'], status='REBUILD', ready_wait=False) waiters.wait_for_server_status( self.servers_client, server_id=self.instance['id'], status='ACTIVE') def verify_partition(self, client, label, mount, gib_size): """Verify a labeled partition's mount point and size.""" LOG.info("Looking for partition %s mounted on %s" % (label, mount)) # Validate we have a device with the given partition label cmd = "/sbin/blkid | grep '%s' | cut -d':' -f1" % label device = client.exec_command(cmd).rstrip('\n') LOG.debug("Partition device is %s" % device) self.assertNotEqual('', device) # Validate the mount point for the device cmd = "mount | grep '%s' | cut -d' ' -f3" % device actual_mount = client.exec_command(cmd).rstrip('\n') LOG.debug("Partition mount point is %s" % actual_mount) self.assertEqual(actual_mount, mount) # Validate the partition size matches what we expect numbers = '0123456789' devnum = device.replace('/dev/', '') cmd = "cat /sys/block/%s/%s/size" % (devnum.rstrip(numbers), devnum) num_bytes = client.exec_command(cmd).rstrip('\n') num_bytes = int(num_bytes) * 512 actual_gib_size = num_bytes / (1024 * 1024 * 1024) LOG.debug("Partition size is %d GiB" % actual_gib_size) self.assertEqual(actual_gib_size, gib_size) def get_flavor_ephemeral_size(self): """Returns size of the ephemeral partition in GiB.""" f_id = self.instance['flavor']['id'] flavor = self.flavors_client.show_flavor(f_id)['flavor'] ephemeral = flavor.get('OS-FLV-EXT-DATA:ephemeral') if not ephemeral or ephemeral == 'N/A': return None return int(ephemeral) def validate_ports(self): for port in self.get_ports(self.node['uuid']): n_port_id = port['extra']['vif_port_id'] body = self.ports_client.show_port(n_port_id) n_port = body['port'] self.assertEqual(n_port['device_id'], self.instance['id']) self.assertEqual(n_port['mac_address'], port['address']) @test.idempotent_id('549173a5-38ec-42bb-b0e2-c8b9f4a08943') @test.services('baremetal', 'compute', 'image', 'network') def test_baremetal_server_ops(self): self.add_keypair() self.boot_instance() self.validate_ports() ip_address = self.get_server_ip(self.instance) self.get_remote_client(ip_address).validate_authentication() vm_client = self.get_remote_client(ip_address) # We expect the ephemeral partition to be mounted on /mnt and to have # the same size as our flavor definition. eph_size = self.get_flavor_ephemeral_size() if eph_size: self.verify_partition(vm_client, 'ephemeral0', '/mnt', eph_size) # Create the test file self.create_timestamp( ip_address, private_key=self.keypair['private_key']) self.terminate_instance() ironic-5.1.2/ironic_tempest_plugin/tests/scenario/baremetal_manager.py0000644000567000056710000001422312732316050027511 0ustar jenkinsjenkins00000000000000# Copyright 2012 OpenStack Foundation # Copyright 2013 IBM Corp. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from tempest.common import waiters from tempest import config from tempest.lib import exceptions as lib_exc from tempest.scenario import manager # noqa import tempest.test from ironic_tempest_plugin import clients CONF = config.CONF # power/provision states as of icehouse class BaremetalPowerStates(object): """Possible power states of an Ironic node.""" POWER_ON = 'power on' POWER_OFF = 'power off' REBOOT = 'rebooting' SUSPEND = 'suspended' class BaremetalProvisionStates(object): """Possible provision states of an Ironic node.""" NOSTATE = None INIT = 'initializing' ACTIVE = 'active' BUILDING = 'building' DEPLOYWAIT = 'wait call-back' DEPLOYING = 'deploying' DEPLOYFAIL = 'deploy failed' DEPLOYDONE = 'deploy complete' DELETING = 'deleting' DELETED = 'deleted' ERROR = 'error' class BaremetalScenarioTest(manager.ScenarioTest): credentials = ['primary', 'admin'] @classmethod def skip_checks(cls): super(BaremetalScenarioTest, cls).skip_checks() if not CONF.baremetal.driver_enabled: msg = 'Ironic not available or Ironic compute driver not enabled' raise cls.skipException(msg) @classmethod def setup_clients(cls): super(BaremetalScenarioTest, cls).setup_clients() cls.baremetal_client = clients.Manager().baremetal_client @classmethod def resource_setup(cls): super(BaremetalScenarioTest, cls).resource_setup() # allow any issues obtaining the node list to raise early cls.baremetal_client.list_nodes() def _node_state_timeout(self, node_id, state_attr, target_states, timeout=10, interval=1): if not isinstance(target_states, list): target_states = [target_states] def check_state(): node = self.get_node(node_id=node_id) if node.get(state_attr) in target_states: return True return False if not tempest.test.call_until_true(check_state, timeout, interval): msg = ("Timed out waiting for node %s to reach %s state(s) %s" % (node_id, state_attr, target_states)) raise lib_exc.TimeoutException(msg) def wait_provisioning_state(self, node_id, state, timeout): self._node_state_timeout( node_id=node_id, state_attr='provision_state', target_states=state, timeout=timeout) def wait_power_state(self, node_id, state): self._node_state_timeout( node_id=node_id, state_attr='power_state', target_states=state, timeout=CONF.baremetal.power_timeout) def wait_node(self, instance_id): """Waits for a node to be associated with instance_id.""" def _get_node(): node = None try: node = self.get_node(instance_id=instance_id) except lib_exc.NotFound: pass return node is not None if (not tempest.test.call_until_true( _get_node, CONF.baremetal.association_timeout, 1)): msg = ('Timed out waiting to get Ironic node by instance id %s' % instance_id) raise lib_exc.TimeoutException(msg) def get_node(self, node_id=None, instance_id=None): if node_id: _, body = self.baremetal_client.show_node(node_id) return body elif instance_id: _, body = self.baremetal_client.show_node_by_instance_uuid( instance_id) if body['nodes']: return body['nodes'][0] def get_ports(self, node_uuid): ports = [] _, body = self.baremetal_client.list_node_ports(node_uuid) for port in body['ports']: _, p = self.baremetal_client.show_port(port['uuid']) ports.append(p) return ports def add_keypair(self): self.keypair = self.create_keypair() def verify_connectivity(self, ip=None): if ip: dest = self.get_remote_client(ip) else: dest = self.get_remote_client(self.instance) dest.validate_authentication() def boot_instance(self): self.instance = self.create_server( key_name=self.keypair['name']) self.wait_node(self.instance['id']) self.node = self.get_node(instance_id=self.instance['id']) self.wait_power_state(self.node['uuid'], BaremetalPowerStates.POWER_ON) self.wait_provisioning_state( self.node['uuid'], [BaremetalProvisionStates.DEPLOYWAIT, BaremetalProvisionStates.ACTIVE], timeout=CONF.baremetal.deploywait_timeout) self.wait_provisioning_state(self.node['uuid'], BaremetalProvisionStates.ACTIVE, timeout=CONF.baremetal.active_timeout) waiters.wait_for_server_status(self.servers_client, self.instance['id'], 'ACTIVE') self.node = self.get_node(instance_id=self.instance['id']) self.instance = (self.servers_client.show_server(self.instance['id']) ['server']) def terminate_instance(self): self.servers_client.delete_server(self.instance['id']) self.wait_power_state(self.node['uuid'], BaremetalPowerStates.POWER_OFF) self.wait_provisioning_state( self.node['uuid'], BaremetalProvisionStates.NOSTATE, timeout=CONF.baremetal.unprovision_timeout) ironic-5.1.2/ironic_tempest_plugin/config.py0000644000567000056710000000621412732316050022364 0ustar jenkinsjenkins00000000000000# Copyright 2015 NEC Corporation # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from oslo_config import cfg from tempest import config # noqa baremetal_group = cfg.OptGroup(name='baremetal', title='Baremetal provisioning service options', help='When enabling baremetal tests, Nova ' 'must be configured to use the Ironic ' 'driver. The following parameters for the ' '[compute] section must be disabled: ' 'console_output, interface_attach, ' 'live_migration, pause, rescue, resize, ' 'shelve, snapshot, and suspend') # NOTE(maurosr): Until liberty-eol we need to keep config options and tests # on tempest's tree to test stable branches and thus we have to comment the # options bellow to avoid duplication. Only new options should live here. BaremetalGroup = [ # cfg.StrOpt('catalog_type', # default='baremetal', # help="Catalog type of the baremetal provisioning service"), # cfg.BoolOpt('driver_enabled', # default=True, # help="Whether the Ironic nova-compute driver is enabled"), # cfg.StrOpt('driver', # default='fake', # help="Driver name which Ironic uses"), # cfg.StrOpt('endpoint_type', # default='publicURL', # choices=['public', 'admin', 'internal', # 'publicURL', 'adminURL', 'internalURL'], # help="The endpoint type to use for the baremetal provisioning" # " service"), cfg.IntOpt('deploywait_timeout', default=15, help="Timeout for Ironic node to reach the " "wait-callback state after powering on."), # cfg.IntOpt('active_timeout', # default=300, # help="Timeout for Ironic node to completely provision"), # cfg.IntOpt('association_timeout', # default=30, # help="Timeout for association of Nova instance and Ironic " # "node"), # cfg.IntOpt('power_timeout', # default=60, # help="Timeout for Ironic power transitions."), # cfg.IntOpt('unprovision_timeout', # default=300, # help="Timeout for unprovisioning an Ironic node. " # "Takes longer since Kilo as Ironic performs an extra " # "step in Node cleaning.") ] ironic-5.1.2/ironic_tempest_plugin/README.rst0000644000567000056710000000133512732316050022233 0ustar jenkinsjenkins00000000000000===================== Ironic tempest plugin ===================== This directory contains Tempest tests to cover the Ironic project, as well as a plugin to automatically load these tests into tempest. See the tempest plugin docs for information on using it: http://docs.openstack.org/developer/tempest/plugin.html#using-plugins To run all tests from this plugin, install ironic into your environment and run:: $ tox -e all-plugin -- ironic To run a single test case, run with the test case name, for example:: $ tox -e all-plugin -- ironic_tempest_plugin.tests.scenario.test_baremetal_basic_ops.BaremetalBasicOps.test_baremetal_server_ops To run all tempest tests including this plugin, run:: $ tox -e all-plugin ironic-5.1.2/ironic_tempest_plugin/services/0000755000567000056710000000000012732316670022375 5ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/services/__init__.py0000644000567000056710000000000012732316044024467 0ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/services/baremetal/0000755000567000056710000000000012732316670024331 5ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/services/baremetal/__init__.py0000644000567000056710000000000012732316044026423 0ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/services/baremetal/base.py0000644000567000056710000001552012732316050025610 0ustar jenkinsjenkins00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import functools from oslo_serialization import jsonutils as json import six from six.moves.urllib import parse as urllib from tempest.lib.common import rest_client def handle_errors(f): """A decorator that allows to ignore certain types of errors.""" @functools.wraps(f) def wrapper(*args, **kwargs): param_name = 'ignore_errors' ignored_errors = kwargs.get(param_name, tuple()) if param_name in kwargs: del kwargs[param_name] try: return f(*args, **kwargs) except ignored_errors: # Silently ignore errors pass return wrapper class BaremetalClient(rest_client.RestClient): """Base Tempest REST client for Ironic API.""" uri_prefix = '' def serialize(self, object_dict): """Serialize an Ironic object.""" return json.dumps(object_dict) def deserialize(self, object_str): """Deserialize an Ironic object.""" return json.loads(object_str) def _get_uri(self, resource_name, uuid=None, permanent=False): """Get URI for a specific resource or object. :param resource_name: The name of the REST resource, e.g., 'nodes'. :param uuid: The unique identifier of an object in UUID format. :returns: Relative URI for the resource or object. """ prefix = self.uri_prefix if not permanent else '' return '{pref}/{res}{uuid}'.format(pref=prefix, res=resource_name, uuid='/%s' % uuid if uuid else '') def _make_patch(self, allowed_attributes, **kwargs): """Create a JSON patch according to RFC 6902. :param allowed_attributes: An iterable object that contains a set of allowed attributes for an object. :param **kwargs: Attributes and new values for them. :returns: A JSON path that sets values of the specified attributes to the new ones. """ def get_change(kwargs, path='/'): for name, value in six.iteritems(kwargs): if isinstance(value, dict): for ch in get_change(value, path + '%s/' % name): yield ch else: if value is None: yield {'path': path + name, 'op': 'remove'} else: yield {'path': path + name, 'value': value, 'op': 'replace'} patch = [ch for ch in get_change(kwargs) if ch['path'].lstrip('/') in allowed_attributes] return patch def _list_request(self, resource, permanent=False, **kwargs): """Get the list of objects of the specified type. :param resource: The name of the REST resource, e.g., 'nodes'. :param **kwargs: Parameters for the request. :returns: A tuple with the server response and deserialized JSON list of objects """ uri = self._get_uri(resource, permanent=permanent) if kwargs: uri += "?%s" % urllib.urlencode(kwargs) resp, body = self.get(uri) self.expected_success(200, resp.status) return resp, self.deserialize(body) def _show_request(self, resource, uuid, permanent=False, **kwargs): """Gets a specific object of the specified type. :param uuid: Unique identifier of the object in UUID format. :returns: Serialized object as a dictionary. """ if 'uri' in kwargs: uri = kwargs['uri'] else: uri = self._get_uri(resource, uuid=uuid, permanent=permanent) resp, body = self.get(uri) self.expected_success(200, resp.status) return resp, self.deserialize(body) def _create_request(self, resource, object_dict): """Create an object of the specified type. :param resource: The name of the REST resource, e.g., 'nodes'. :param object_dict: A Python dict that represents an object of the specified type. :returns: A tuple with the server response and the deserialized created object. """ body = self.serialize(object_dict) uri = self._get_uri(resource) resp, body = self.post(uri, body=body) self.expected_success(201, resp.status) return resp, self.deserialize(body) def _delete_request(self, resource, uuid): """Delete specified object. :param resource: The name of the REST resource, e.g., 'nodes'. :param uuid: The unique identifier of an object in UUID format. :returns: A tuple with the server response and the response body. """ uri = self._get_uri(resource, uuid) resp, body = self.delete(uri) self.expected_success(204, resp.status) return resp, body def _patch_request(self, resource, uuid, patch_object): """Update specified object with JSON-patch. :param resource: The name of the REST resource, e.g., 'nodes'. :param uuid: The unique identifier of an object in UUID format. :returns: A tuple with the server response and the serialized patched object. """ uri = self._get_uri(resource, uuid) patch_body = json.dumps(patch_object) resp, body = self.patch(uri, body=patch_body) self.expected_success(200, resp.status) return resp, self.deserialize(body) @handle_errors def get_api_description(self): """Retrieves all versions of the Ironic API.""" return self._list_request('', permanent=True) @handle_errors def get_version_description(self, version='v1'): """Retrieves the desctription of the API. :param version: The version of the API. Default: 'v1'. :returns: Serialized description of API resources. """ return self._list_request(version, permanent=True) def _put_request(self, resource, put_object): """Update specified object with JSON-patch.""" uri = self._get_uri(resource) put_body = json.dumps(put_object) resp, body = self.put(uri, body=put_body) self.expected_success([202, 204], resp.status) return resp, body ironic-5.1.2/ironic_tempest_plugin/services/baremetal/v1/0000755000567000056710000000000012732316670024657 5ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/services/baremetal/v1/__init__.py0000644000567000056710000000000012732316044026751 0ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/services/baremetal/v1/json/0000755000567000056710000000000012732316670025630 5ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/services/baremetal/v1/json/__init__.py0000644000567000056710000000000012732316044027722 0ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/services/baremetal/v1/json/baremetal_client.py0000644000567000056710000002711612732316050031473 0ustar jenkinsjenkins00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from ironic_tempest_plugin.services.baremetal import base class BaremetalClient(base.BaremetalClient): """Base Tempest REST client for Ironic API v1.""" version = '1' uri_prefix = 'v1' @base.handle_errors def list_nodes(self, **kwargs): """List all existing nodes.""" return self._list_request('nodes', **kwargs) @base.handle_errors def list_chassis(self): """List all existing chassis.""" return self._list_request('chassis') @base.handle_errors def list_chassis_nodes(self, chassis_uuid): """List all nodes associated with a chassis.""" return self._list_request('/chassis/%s/nodes' % chassis_uuid) @base.handle_errors def list_ports(self, **kwargs): """List all existing ports.""" return self._list_request('ports', **kwargs) @base.handle_errors def list_node_ports(self, uuid): """List all ports associated with the node.""" return self._list_request('/nodes/%s/ports' % uuid) @base.handle_errors def list_nodestates(self, uuid): """List all existing states.""" return self._list_request('/nodes/%s/states' % uuid) @base.handle_errors def list_ports_detail(self, **kwargs): """Details list all existing ports.""" return self._list_request('/ports/detail', **kwargs) @base.handle_errors def list_drivers(self): """List all existing drivers.""" return self._list_request('drivers') @base.handle_errors def show_node(self, uuid): """Gets a specific node. :param uuid: Unique identifier of the node in UUID format. :return: Serialized node as a dictionary. """ return self._show_request('nodes', uuid) @base.handle_errors def show_node_by_instance_uuid(self, instance_uuid): """Gets a node associated with given instance uuid. :param uuid: Unique identifier of the node in UUID format. :return: Serialized node as a dictionary. """ uri = '/nodes/detail?instance_uuid=%s' % instance_uuid return self._show_request('nodes', uuid=None, uri=uri) @base.handle_errors def show_chassis(self, uuid): """Gets a specific chassis. :param uuid: Unique identifier of the chassis in UUID format. :return: Serialized chassis as a dictionary. """ return self._show_request('chassis', uuid) @base.handle_errors def show_port(self, uuid): """Gets a specific port. :param uuid: Unique identifier of the port in UUID format. :return: Serialized port as a dictionary. """ return self._show_request('ports', uuid) @base.handle_errors def show_port_by_address(self, address): """Gets a specific port by address. :param address: MAC address of the port. :return: Serialized port as a dictionary. """ uri = '/ports/detail?address=%s' % address return self._show_request('ports', uuid=None, uri=uri) def show_driver(self, driver_name): """Gets a specific driver. :param driver_name: Name of driver. :return: Serialized driver as a dictionary. """ return self._show_request('drivers', driver_name) @base.handle_errors def create_node(self, chassis_id=None, **kwargs): """Create a baremetal node with the specified parameters. :param cpu_arch: CPU architecture of the node. Default: x86_64. :param cpus: Number of CPUs. Default: 8. :param local_gb: Disk size. Default: 1024. :param memory_mb: Available RAM. Default: 4096. :param driver: Driver name. Default: "fake" :return: A tuple with the server response and the created node. """ node = {'chassis_uuid': chassis_id, 'properties': {'cpu_arch': kwargs.get('cpu_arch', 'x86_64'), 'cpus': kwargs.get('cpus', 8), 'local_gb': kwargs.get('local_gb', 1024), 'memory_mb': kwargs.get('memory_mb', 4096)}, 'driver': kwargs.get('driver', 'fake')} return self._create_request('nodes', node) @base.handle_errors def create_chassis(self, **kwargs): """Create a chassis with the specified parameters. :param description: The description of the chassis. Default: test-chassis :return: A tuple with the server response and the created chassis. """ chassis = {'description': kwargs.get('description', 'test-chassis')} return self._create_request('chassis', chassis) @base.handle_errors def create_port(self, node_id, **kwargs): """Create a port with the specified parameters. :param node_id: The ID of the node which owns the port. :param address: MAC address of the port. :param extra: Meta data of the port. Default: {'foo': 'bar'}. :param uuid: UUID of the port. :return: A tuple with the server response and the created port. """ port = {'extra': kwargs.get('extra', {'foo': 'bar'}), 'uuid': kwargs['uuid']} if node_id is not None: port['node_uuid'] = node_id if kwargs['address'] is not None: port['address'] = kwargs['address'] return self._create_request('ports', port) @base.handle_errors def delete_node(self, uuid): """Deletes a node having the specified UUID. :param uuid: The unique identifier of the node. :return: A tuple with the server response and the response body. """ return self._delete_request('nodes', uuid) @base.handle_errors def delete_chassis(self, uuid): """Deletes a chassis having the specified UUID. :param uuid: The unique identifier of the chassis. :return: A tuple with the server response and the response body. """ return self._delete_request('chassis', uuid) @base.handle_errors def delete_port(self, uuid): """Deletes a port having the specified UUID. :param uuid: The unique identifier of the port. :return: A tuple with the server response and the response body. """ return self._delete_request('ports', uuid) @base.handle_errors def update_node(self, uuid, **kwargs): """Update the specified node. :param uuid: The unique identifier of the node. :return: A tuple with the server response and the updated node. """ node_attributes = ('properties/cpu_arch', 'properties/cpus', 'properties/local_gb', 'properties/memory_mb', 'driver', 'instance_uuid') patch = self._make_patch(node_attributes, **kwargs) return self._patch_request('nodes', uuid, patch) @base.handle_errors def update_chassis(self, uuid, **kwargs): """Update the specified chassis. :param uuid: The unique identifier of the chassis. :return: A tuple with the server response and the updated chassis. """ chassis_attributes = ('description',) patch = self._make_patch(chassis_attributes, **kwargs) return self._patch_request('chassis', uuid, patch) @base.handle_errors def update_port(self, uuid, patch): """Update the specified port. :param uuid: The unique identifier of the port. :param patch: List of dicts representing json patches. :return: A tuple with the server response and the updated port. """ return self._patch_request('ports', uuid, patch) @base.handle_errors def set_node_power_state(self, node_uuid, state): """Set power state of the specified node. :param node_uuid: The unique identifier of the node. :state: desired state to set (on/off/reboot). """ target = {'target': state} return self._put_request('nodes/%s/states/power' % node_uuid, target) @base.handle_errors def validate_driver_interface(self, node_uuid): """Get all driver interfaces of a specific node. :param uuid: Unique identifier of the node in UUID format. """ uri = '{pref}/{res}/{uuid}/{postf}'.format(pref=self.uri_prefix, res='nodes', uuid=node_uuid, postf='validate') return self._show_request('nodes', node_uuid, uri=uri) @base.handle_errors def set_node_boot_device(self, node_uuid, boot_device, persistent=False): """Set the boot device of the specified node. :param node_uuid: The unique identifier of the node. :param boot_device: The boot device name. :param persistent: Boolean value. True if the boot device will persist to all future boots, False if not. Default: False. """ request = {'boot_device': boot_device, 'persistent': persistent} resp, body = self._put_request('nodes/%s/management/boot_device' % node_uuid, request) self.expected_success(204, resp.status) return body @base.handle_errors def get_node_boot_device(self, node_uuid): """Get the current boot device of the specified node. :param node_uuid: The unique identifier of the node. """ path = 'nodes/%s/management/boot_device' % node_uuid resp, body = self._list_request(path) self.expected_success(200, resp.status) return body @base.handle_errors def get_node_supported_boot_devices(self, node_uuid): """Get the supported boot devices of the specified node. :param node_uuid: The unique identifier of the node. """ path = 'nodes/%s/management/boot_device/supported' % node_uuid resp, body = self._list_request(path) self.expected_success(200, resp.status) return body @base.handle_errors def get_console(self, node_uuid): """Get connection information about the console. :param node_uuid: Unique identifier of the node in UUID format. """ resp, body = self._show_request('nodes/states/console', node_uuid) self.expected_success(200, resp.status) return resp, body @base.handle_errors def set_console_mode(self, node_uuid, enabled): """Start and stop the node console. :param node_uuid: Unique identifier of the node in UUID format. :param enabled: Boolean value; whether to enable or disable the console. """ enabled = {'enabled': enabled} resp, body = self._put_request('nodes/%s/states/console' % node_uuid, enabled) self.expected_success(202, resp.status) return resp, body ironic-5.1.2/ironic_tempest_plugin/common/0000755000567000056710000000000012732316670022042 5ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/common/__init__.py0000644000567000056710000000000012732316044024134 0ustar jenkinsjenkins00000000000000ironic-5.1.2/ironic_tempest_plugin/common/waiters.py0000644000567000056710000000346712732316044024077 0ustar jenkinsjenkins00000000000000# All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import time from tempest.lib.common.utils import misc as misc_utils from tempest.lib import exceptions as lib_exc def wait_for_bm_node_status(client, node_id, attr, status): """Waits for a baremetal node attribute to reach given status. The client should have a show_node(node_uuid) method to get the node. """ _, node = client.show_node(node_id) start = int(time.time()) while node[attr] != status: time.sleep(client.build_interval) _, node = client.show_node(node_id) status_curr = node[attr] if status_curr == status: return if int(time.time()) - start >= client.build_timeout: message = ('Node %(node_id)s failed to reach %(attr)s=%(status)s ' 'within the required time (%(timeout)s s).' % {'node_id': node_id, 'attr': attr, 'status': status, 'timeout': client.build_timeout}) message += ' Current state of %s: %s.' % (attr, status_curr) caller = misc_utils.find_test_caller() if caller: message = '(%s) %s' % (caller, message) raise lib_exc.TimeoutException(message) ironic-5.1.2/devstack/0000755000567000056710000000000012732316670015754 5ustar jenkinsjenkins00000000000000ironic-5.1.2/devstack/lib/0000755000567000056710000000000012732316670016522 5ustar jenkinsjenkins00000000000000ironic-5.1.2/devstack/lib/ironic0000644000567000056710000012020712732316050017722 0ustar jenkinsjenkins00000000000000#!/bin/bash # # lib/ironic # Functions to control the configuration and operation of the **Ironic** service # Dependencies: # # - ``functions`` file # - ``DEST``, ``DATA_DIR``, ``STACK_USER`` must be defined # - ``SERVICE_{TENANT_NAME|PASSWORD}`` must be defined # - ``SERVICE_HOST`` # - ``KEYSTONE_TOKEN_FORMAT`` must be defined # ``stack.sh`` calls the entry points in this order: # # - install_ironic # - install_ironicclient # - init_ironic # - start_ironic # - stop_ironic # - cleanup_ironic # Save trace and pipefail settings _XTRACE_IRONIC=$(set +o | grep xtrace) _PIPEFAIL_IRONIC=$(set +o | grep pipefail) set +o xtrace set +o pipefail # Defaults # -------- # Set up default directories GITDIR["python-ironicclient"]=$DEST/python-ironicclient GITDIR["ironic-lib"]=$DEST/ironic-lib IRONIC_DIR=$DEST/ironic IRONIC_DEVSTACK_DIR=$IRONIC_DIR/devstack IRONIC_DEVSTACK_FILES_DIR=$IRONIC_DEVSTACK_DIR/files IRONIC_PYTHON_AGENT_DIR=$DEST/ironic-python-agent IRONIC_DATA_DIR=$DATA_DIR/ironic IRONIC_STATE_PATH=/var/lib/ironic IRONIC_AUTH_CACHE_DIR=${IRONIC_AUTH_CACHE_DIR:-/var/cache/ironic} IRONIC_CONF_DIR=${IRONIC_CONF_DIR:-/etc/ironic} IRONIC_CONF_FILE=$IRONIC_CONF_DIR/ironic.conf IRONIC_ROOTWRAP_CONF=$IRONIC_CONF_DIR/rootwrap.conf IRONIC_POLICY_JSON=$IRONIC_CONF_DIR/policy.json # Deploy callback timeout can be changed from its default (1800), if required. IRONIC_CALLBACK_TIMEOUT=${IRONIC_CALLBACK_TIMEOUT:-} # Deploy to hardware platform IRONIC_HW_NODE_CPU=${IRONIC_HW_NODE_CPU:-1} IRONIC_HW_NODE_RAM=${IRONIC_HW_NODE_RAM:-512} IRONIC_HW_NODE_DISK=${IRONIC_HW_NODE_DISK:-10} IRONIC_HW_EPHEMERAL_DISK=${IRONIC_HW_EPHEMERAL_DISK:-0} IRONIC_HW_ARCH=${IRONIC_HW_ARCH:-x86_64} # The file is composed of multiple lines, each line includes four field # separated by white space: IPMI address, MAC address, IPMI username # and IPMI password. # # 192.168.110.107 00:1e:67:57:50:4c root otc123 IRONIC_IPMIINFO_FILE=${IRONIC_IPMIINFO_FILE:-$IRONIC_DATA_DIR/hardware_info} # Set up defaults for functional / integration testing IRONIC_NODE_UUID=${IRONIC_NODE_UUID:-`uuidgen`} IRONIC_SCRIPTS_DIR=${IRONIC_SCRIPTS_DIR:-$IRONIC_DEVSTACK_DIR/tools/ironic/scripts} IRONIC_TEMPLATES_DIR=${IRONIC_TEMPLATES_DIR:-$IRONIC_DEVSTACK_DIR/tools/ironic/templates} IRONIC_BAREMETAL_BASIC_OPS=$(trueorfalse False IRONIC_BAREMETAL_BASIC_OPS) IRONIC_ENABLED_DRIVERS=${IRONIC_ENABLED_DRIVERS:-fake,pxe_ssh,pxe_ipmitool} IRONIC_SSH_USERNAME=${IRONIC_SSH_USERNAME:-`whoami`} IRONIC_SSH_TIMEOUT=${IRONIC_SSH_TIMEOUT:-15} IRONIC_SSH_KEY_DIR=${IRONIC_SSH_KEY_DIR:-$IRONIC_DATA_DIR/ssh_keys} IRONIC_SSH_KEY_FILENAME=${IRONIC_SSH_KEY_FILENAME:-ironic_key} IRONIC_KEY_FILE=${IRONIC_KEY_FILE:-$IRONIC_SSH_KEY_DIR/$IRONIC_SSH_KEY_FILENAME} IRONIC_SSH_VIRT_TYPE=${IRONIC_SSH_VIRT_TYPE:-virsh} IRONIC_TFTPBOOT_DIR=${IRONIC_TFTPBOOT_DIR:-$IRONIC_DATA_DIR/tftpboot} IRONIC_TFTPSERVER_IP=${IRONIC_TFTPSERVER_IP:-$HOST_IP} IRONIC_VM_SSH_PORT=${IRONIC_VM_SSH_PORT:-22} IRONIC_VM_SSH_ADDRESS=${IRONIC_VM_SSH_ADDRESS:-$HOST_IP} IRONIC_VM_COUNT=${IRONIC_VM_COUNT:-1} IRONIC_VM_SPECS_CPU=${IRONIC_VM_SPECS_CPU:-1} IRONIC_VM_SPECS_RAM=${IRONIC_VM_SPECS_RAM:-1024} IRONIC_VM_SPECS_DISK=${IRONIC_VM_SPECS_DISK:-10} IRONIC_VM_EPHEMERAL_DISK=${IRONIC_VM_EPHEMERAL_DISK:-0} IRONIC_VM_EMULATOR=${IRONIC_VM_EMULATOR:-/usr/bin/qemu-system-x86_64} IRONIC_VM_NETWORK_BRIDGE=${IRONIC_VM_NETWORK_BRIDGE:-brbm} IRONIC_VM_NETWORK_RANGE=${IRONIC_VM_NETWORK_RANGE:-192.0.2.0/24} IRONIC_VM_MACS_CSV_FILE=${IRONIC_VM_MACS_CSV_FILE:-$IRONIC_DATA_DIR/ironic_macs.csv} IRONIC_AUTHORIZED_KEYS_FILE=${IRONIC_AUTHORIZED_KEYS_FILE:-$HOME/.ssh/authorized_keys} # By default, baremetal VMs will console output to file. IRONIC_VM_LOG_CONSOLE=${IRONIC_VM_LOG_CONSOLE:-True} IRONIC_VM_LOG_DIR=${IRONIC_VM_LOG_DIR:-$IRONIC_DATA_DIR/logs/} IRONIC_VM_LOG_ROTATE=$(trueorfalse True IRONIC_VM_LOG_ROTATE) # Use DIB to create deploy ramdisk and kernel. IRONIC_BUILD_DEPLOY_RAMDISK=$(trueorfalse True IRONIC_BUILD_DEPLOY_RAMDISK) # Ironic IPA ramdisk type, supported types are: coreos, tinyipa. IRONIC_RAMDISK_TYPE=${IRONIC_RAMDISK_TYPE:-coreos} # If not use DIB, these files are used as deploy ramdisk/kernel. # (The value must be an absolute path) IRONIC_DEPLOY_RAMDISK=${IRONIC_DEPLOY_RAMDISK:-} IRONIC_DEPLOY_KERNEL=${IRONIC_DEPLOY_KERNEL:-} IRONIC_DEPLOY_ELEMENT=${IRONIC_DEPLOY_ELEMENT:-deploy-ironic} # NOTE(jroll) this needs to be updated when stable branches are cut IPA_DOWNLOAD_BRANCH=${IPA_DOWNLOAD_BRANCH:-stable/mitaka} IPA_DOWNLOAD_BRANCH=$(echo $IPA_DOWNLOAD_BRANCH | tr / -) case $IRONIC_RAMDISK_TYPE in coreos) IRONIC_AGENT_KERNEL_URL=${IRONIC_AGENT_KERNEL_URL:-http://tarballs.openstack.org/ironic-python-agent/coreos/files/coreos_production_pxe-${IPA_DOWNLOAD_BRANCH}.vmlinuz} IRONIC_AGENT_RAMDISK_URL=${IRONIC_AGENT_RAMDISK_URL:-http://tarballs.openstack.org/ironic-python-agent/coreos/files/coreos_production_pxe_image-oem-${IPA_DOWNLOAD_BRANCH}.cpio.gz} ;; tinyipa) IRONIC_AGENT_KERNEL_URL=${IRONIC_AGENT_KERNEL_URL:-http://tarballs.openstack.org/ironic-python-agent/tinyipa/files/tinyipa-${IPA_DOWNLOAD_BRANCH}.vmlinuz} IRONIC_AGENT_RAMDISK_URL=${IRONIC_AGENT_RAMDISK_URL:-http://tarballs.openstack.org/ironic-python-agent/tinyipa/files/tinyipa-${IPA_DOWNLOAD_BRANCH}.gz} ;; *) die $LINENO "Unrecognised IRONIC_RAMDISK_TYPE: $IRONIC_RAMDISK_TYPE. Expected 'coreos' or 'tinyipa'" ;; esac # Which deploy driver to use - valid choices right now # are ``pxe_ssh``, ``pxe_ipmitool``, ``agent_ssh`` and ``agent_ipmitool``. IRONIC_DEPLOY_DRIVER=${IRONIC_DEPLOY_DRIVER:-pxe_ssh} # TODO(agordeev): replace 'ubuntu' with host distro name getting IRONIC_DEPLOY_FLAVOR=${IRONIC_DEPLOY_FLAVOR:-ubuntu $IRONIC_DEPLOY_ELEMENT} # Support entry points installation of console scripts IRONIC_BIN_DIR=$(get_python_exec_prefix) # Ironic connection info. Note the port must be specified. IRONIC_SERVICE_PROTOCOL=${IRONIC_SERVICE_PROTOCOL:-$SERVICE_PROTOCOL} IRONIC_SERVICE_PORT=${IRONIC_SERVICE_PORT:-6385} IRONIC_HOSTPORT=${IRONIC_HOSTPORT:-$SERVICE_HOST:$IRONIC_SERVICE_PORT} # Enable iPXE IRONIC_IPXE_ENABLED=$(trueorfalse False IRONIC_IPXE_ENABLED) IRONIC_HTTP_DIR=${IRONIC_HTTP_DIR:-$IRONIC_DATA_DIR/httpboot} IRONIC_HTTP_SERVER=${IRONIC_HTTP_SERVER:-$HOST_IP} IRONIC_HTTP_PORT=${IRONIC_HTTP_PORT:-3928} # Whether DevStack will be setup for bare metal or VMs IRONIC_IS_HARDWARE=$(trueorfalse False IRONIC_IS_HARDWARE) # The first port in the range to bind the Virtual BMCs. The number of # ports that will be used depends on $IRONIC_VM_COUNT variable, e.g if # $IRONIC_VM_COUNT=3 the ports 6230, 6231 and 6232 will be used for the # Virtual BMCs, one for each VM. IRONIC_VBMC_PORT_RANGE_START=${IRONIC_VBMC_PORT_RANGE_START:-6230} IRONIC_VBMC_CONFIG_FILE=${IRONIC_VBMC_CONFIG_FILE:-$HOME/.vbmc/virtualbmc.conf} IRONIC_VBMC_LOGFILE=${IRONIC_VBMC_LOGFILE:-$IRONIC_VM_LOG_DIR/virtualbmc.log} # NOTE(lucasagomes): This flag is used to differentiate the nodes that # uses IPA as their deploy ramdisk from nodes that uses the agent_* drivers # (which also uses IPA but depends on Swift Temp URLs to work). At present, # all drivers that uses the iSCSI approach for their deployment supports # using both, IPA or bash ramdisks for the deployment. In the future we # want to remove the support for the bash ramdisk in favor of IPA, once # we get there this flag can be removed, and all conditionals that uses # it should just run by default. IRONIC_DEPLOY_DRIVER_ISCSI_WITH_IPA=$(trueorfalse False IRONIC_DEPLOY_DRIVER_ISCSI_WITH_IPA) # The path to the libvirt hooks directory, used if IRONIC_VM_LOG_ROTATE is True IRONIC_LIBVIRT_HOOKS_PATH=${IRONIC_LIBVIRT_HOOKS_PATH:-/etc/libvirt/hooks/} # The authentication strategy used by ironic-api. Valid values are: # keystone and noauth. IRONIC_AUTH_STRATEGY=${IRONIC_AUTH_STRATEGY:-keystone} # get_pxe_boot_file() - Get the PXE/iPXE boot file path function get_pxe_boot_file { local relpath=syslinux/pxelinux.0 if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then relpath=ipxe/undionly.kpxe fi local pxe_boot_file if is_ubuntu; then pxe_boot_file=/usr/lib/$relpath elif is_fedora || is_suse; then pxe_boot_file=/usr/share/$relpath fi echo $pxe_boot_file } # PXE boot image IRONIC_PXE_BOOT_IMAGE=${IRONIC_PXE_BOOT_IMAGE:-$(get_pxe_boot_file)} # Functions # --------- # Test if any Ironic services are enabled # is_ironic_enabled function is_ironic_enabled { [[ ,${ENABLED_SERVICES} =~ ,"ir-" ]] && return 0 return 1 } function is_deployed_by_agent { [[ -z "${IRONIC_DEPLOY_DRIVER%%agent*}" ]] && return 0 return 1 } function is_deployed_by_ipmitool { [[ -z "${IRONIC_DEPLOY_DRIVER##*_ipmitool}" ]] && return 0 return 1 } function is_deployed_with_ipa_ramdisk { is_deployed_by_agent || [[ "$IRONIC_DEPLOY_DRIVER_ISCSI_WITH_IPA" == "True" ]] && return 0 return 1 } # install_ironic() - Install the things! function install_ironic { # make sure all needed service were enabled local req_services="key" if [[ "$VIRT_DRIVER" == "ironic" ]]; then req_services+=" nova glance neutron" fi for srv in $req_services; do if ! is_service_enabled "$srv"; then die $LINENO "$srv should be enabled for Ironic." fi done if use_library_from_git "ironic-lib"; then git_clone_by_name "ironic-lib" setup_dev_lib "ironic-lib" fi setup_develop $IRONIC_DIR if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then install_apache_wsgi fi if is_deployed_by_ipmitool && [[ "$IRONIC_IS_HARDWARE" == "False" ]]; then pip_install "virtualbmc" if [[ ! -d $(dirname $IRONIC_VBMC_CONFIG_FILE) ]]; then mkdir -p $(dirname $IRONIC_VBMC_CONFIG_FILE) fi iniset $IRONIC_VBMC_CONFIG_FILE log debug True iniset $IRONIC_VBMC_CONFIG_FILE log logfile $IRONIC_VBMC_LOGFILE fi } # install_ironicclient() - Collect sources and prepare function install_ironicclient { if use_library_from_git "python-ironicclient"; then git_clone_by_name "python-ironicclient" setup_dev_lib "python-ironicclient" sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-ironicclient"]}/tools/,/etc/bash_completion.d/}ironic.bash_completion else # nothing actually "requires" ironicclient, so force instally from pypi pip_install_gr python-ironicclient fi } # _cleanup_ironic_apache_wsgi() - Remove wsgi files, disable and remove apache vhost file function _cleanup_ironic_apache_wsgi { sudo rm -rf $IRONIC_HTTP_DIR disable_apache_site ironic sudo rm -f $(apache_site_config_for ironic) restart_apache_server } # _config_ironic_apache_wsgi() - Set WSGI config files of Ironic function _config_ironic_apache_wsgi { local ironic_apache_conf ironic_apache_conf=$(apache_site_config_for ironic) sudo cp $IRONIC_DEVSTACK_FILES_DIR/apache-ironic.template $ironic_apache_conf sudo sed -e " s|%PUBLICPORT%|$IRONIC_HTTP_PORT|g; s|%HTTPROOT%|$IRONIC_HTTP_DIR|g; " -i $ironic_apache_conf enable_apache_site ironic } # cleanup_ironic() - Remove residual data files, anything left over from previous # runs that would need to clean up. function cleanup_ironic { sudo rm -rf $IRONIC_AUTH_CACHE_DIR $IRONIC_CONF_DIR sudo rm -rf $IRONIC_VM_LOG_DIR/* } # configure_ironic_dirs() - Create all directories required by Ironic and # associated services. function configure_ironic_dirs { sudo install -d -o $STACK_USER $IRONIC_CONF_DIR $STACK_USER $IRONIC_DATA_DIR \ $IRONIC_STATE_PATH $IRONIC_TFTPBOOT_DIR $IRONIC_TFTPBOOT_DIR/pxelinux.cfg sudo chown -R $STACK_USER:$LIBVIRT_GROUP $IRONIC_TFTPBOOT_DIR if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then sudo install -d -o $STACK_USER -g $LIBVIRT_GROUP $IRONIC_HTTP_DIR fi if [ ! -f $IRONIC_PXE_BOOT_IMAGE ]; then die $LINENO "PXE boot file $IRONIC_PXE_BOOT_IMAGE not found." fi # Copy PXE binary if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then cp $IRONIC_PXE_BOOT_IMAGE $IRONIC_TFTPBOOT_DIR else # Syslinux >= 5.00 pxelinux.0 binary is not "stand-alone" anymore, # it depends on some c32 modules to work correctly. # More info: http://www.syslinux.org/wiki/index.php/Library_modules cp -aR $(dirname $IRONIC_PXE_BOOT_IMAGE)/*.{c32,0} $IRONIC_TFTPBOOT_DIR fi } # configure_ironic() - Set config files, create data dirs, etc function configure_ironic { configure_ironic_dirs # Copy over ironic configuration file and configure common parameters. cp $IRONIC_DIR/etc/ironic/ironic.conf.sample $IRONIC_CONF_FILE iniset $IRONIC_CONF_FILE DEFAULT debug True inicomment $IRONIC_CONF_FILE DEFAULT log_file iniset $IRONIC_CONF_FILE database connection `database_connection_url ironic` iniset $IRONIC_CONF_FILE DEFAULT state_path $IRONIC_STATE_PATH iniset $IRONIC_CONF_FILE DEFAULT use_syslog $SYSLOG # Configure Ironic conductor, if it was enabled. if is_service_enabled ir-cond; then configure_ironic_conductor fi # Configure Ironic API, if it was enabled. if is_service_enabled ir-api; then configure_ironic_api fi # Format logging if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ]; then setup_colorized_logging $IRONIC_CONF_FILE DEFAULT tenant user fi if [[ "$IRONIC_IPXE_ENABLED" == "True" ]]; then _config_ironic_apache_wsgi fi } # configure_ironic_api() - Is used by configure_ironic(). Performs # API specific configuration. function configure_ironic_api { iniset $IRONIC_CONF_FILE DEFAULT auth_strategy $IRONIC_AUTH_STRATEGY iniset $IRONIC_CONF_FILE oslo_policy policy_file $IRONIC_POLICY_JSON # TODO(Yuki Nishiwaki): This is a temporary work-around until Ironic is fixed(bug#1422632). # These codes need to be changed to use the function of configure_auth_token_middleware # after Ironic conforms to the new auth plugin. iniset $IRONIC_CONF_FILE keystone_authtoken identity_uri $KEYSTONE_AUTH_URI iniset $IRONIC_CONF_FILE keystone_authtoken auth_uri $KEYSTONE_SERVICE_URI/v2.0 iniset $IRONIC_CONF_FILE keystone_authtoken admin_user ironic iniset $IRONIC_CONF_FILE keystone_authtoken admin_password $SERVICE_PASSWORD iniset $IRONIC_CONF_FILE keystone_authtoken admin_tenant_name $SERVICE_PROJECT_NAME iniset $IRONIC_CONF_FILE keystone_authtoken cafile $SSL_BUNDLE_FILE iniset $IRONIC_CONF_FILE keystone_authtoken signing_dir $IRONIC_AUTH_CACHE_DIR/api iniset_rpc_backend ironic $IRONIC_CONF_FILE iniset $IRONIC_CONF_FILE api port $IRONIC_SERVICE_PORT cp -p $IRONIC_DIR/etc/ironic/policy.json $IRONIC_POLICY_JSON } # configure_ironic_conductor() - Is used by configure_ironic(). # Sets conductor specific settings. function configure_ironic_conductor { cp $IRONIC_DIR/etc/ironic/rootwrap.conf $IRONIC_ROOTWRAP_CONF cp -r $IRONIC_DIR/etc/ironic/rootwrap.d $IRONIC_CONF_DIR local ironic_rootwrap ironic_rootwrap=$(get_rootwrap_location ironic) local rootwrap_isudoer_cmd="$ironic_rootwrap $IRONIC_CONF_DIR/rootwrap.conf *" # Set up the rootwrap sudoers for ironic local tempfile tempfile=`mktemp` echo "$STACK_USER ALL=(root) NOPASSWD: $rootwrap_isudoer_cmd" >$tempfile chmod 0440 $tempfile sudo chown root:root $tempfile sudo mv $tempfile /etc/sudoers.d/ironic-rootwrap iniset $IRONIC_CONF_FILE DEFAULT rootwrap_config $IRONIC_ROOTWRAP_CONF iniset $IRONIC_CONF_FILE DEFAULT enabled_drivers $IRONIC_ENABLED_DRIVERS iniset $IRONIC_CONF_FILE conductor api_url $IRONIC_SERVICE_PROTOCOL://$HOST_IP:$IRONIC_SERVICE_PORT if [[ -n "$IRONIC_CALLBACK_TIMEOUT" ]]; then iniset $IRONIC_CONF_FILE conductor deploy_callback_timeout $IRONIC_CALLBACK_TIMEOUT fi iniset $IRONIC_CONF_FILE pxe tftp_server $IRONIC_TFTPSERVER_IP iniset $IRONIC_CONF_FILE pxe tftp_root $IRONIC_TFTPBOOT_DIR iniset $IRONIC_CONF_FILE pxe tftp_master_path $IRONIC_TFTPBOOT_DIR/master_images local pxe_params="nofb nomodeset vga=normal console=ttyS0" if is_deployed_with_ipa_ramdisk; then pxe_params+=" systemd.journald.forward_to_console=yes ipa-debug=1" fi # When booting with less than 1GB, we need to switch from default tmpfs # to ramfs for ramdisks to decompress successfully. if ([[ "$IRONIC_IS_HARDWARE" == "True" ]] && [[ "$IRONIC_HW_NODE_RAM" -lt 1024 ]]) || ([[ "$IRONIC_IS_HARDWARE" == "False" ]] && [[ "$IRONIC_VM_SPECS_RAM" -lt 1024 ]]); then pxe_params+=" rootfstype=ramfs" fi if [[ -n "$pxe_params" ]]; then iniset $IRONIC_CONF_FILE pxe pxe_append_params "$pxe_params" fi # Set these options for scenarios in which the agent fetches the image # directly from glance, and don't set them where the image is pushed # over iSCSI. if is_deployed_by_agent; then if [[ "$SWIFT_ENABLE_TEMPURLS" == "True" ]] ; then iniset $IRONIC_CONF_FILE glance swift_temp_url_key $SWIFT_TEMPURL_KEY else die $LINENO "SWIFT_ENABLE_TEMPURLS must be True to use agent_* driver in Ironic." fi iniset $IRONIC_CONF_FILE glance swift_endpoint_url http://${HOST_IP}:${SWIFT_DEFAULT_BIND_PORT:-8080} iniset $IRONIC_CONF_FILE glance swift_api_version v1 local tenant_id tenant_id=$(get_or_create_project $SERVICE_PROJECT_NAME default) iniset $IRONIC_CONF_FILE glance swift_account AUTH_${tenant_id} iniset $IRONIC_CONF_FILE glance swift_container glance iniset $IRONIC_CONF_FILE glance swift_temp_url_duration 3600 iniset $IRONIC_CONF_FILE agent heartbeat_timeout 30 fi # FIXME: this really needs to be tested in the gate. For now, any # test using the agent ramdisk should skip the erase_devices clean # step because it is too slow to run in the gate. iniset $IRONIC_CONF_FILE deploy erase_devices_priority 0 if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then local pxebin pxebin=`basename $IRONIC_PXE_BOOT_IMAGE` iniset $IRONIC_CONF_FILE pxe ipxe_enabled True iniset $IRONIC_CONF_FILE pxe pxe_config_template '\$pybasedir/drivers/modules/ipxe_config.template' iniset $IRONIC_CONF_FILE pxe pxe_bootfile_name $pxebin iniset $IRONIC_CONF_FILE deploy http_root $IRONIC_HTTP_DIR iniset $IRONIC_CONF_FILE deploy http_url "http://$IRONIC_HTTP_SERVER:$IRONIC_HTTP_PORT" fi } # create_ironic_cache_dir() - Part of the init_ironic() process function create_ironic_cache_dir { # Create cache dir sudo mkdir -p $IRONIC_AUTH_CACHE_DIR/api sudo chown $STACK_USER $IRONIC_AUTH_CACHE_DIR/api rm -f $IRONIC_AUTH_CACHE_DIR/api/* sudo mkdir -p $IRONIC_AUTH_CACHE_DIR/registry sudo chown $STACK_USER $IRONIC_AUTH_CACHE_DIR/registry rm -f $IRONIC_AUTH_CACHE_DIR/registry/* } # create_ironic_accounts() - Set up common required ironic accounts # Tenant User Roles # ------------------------------------------------------------------ # service ironic admin # if enabled function create_ironic_accounts { # Ironic if [[ "$ENABLED_SERVICES" =~ "ir-api" ]]; then # Get ironic user if exists # NOTE(Shrews): This user MUST have admin level privileges! create_service_user "ironic" "admin" get_or_create_service "ironic" "baremetal" "Ironic baremetal provisioning service" get_or_create_endpoint "baremetal" \ "$REGION_NAME" \ "$IRONIC_SERVICE_PROTOCOL://$IRONIC_HOSTPORT" \ "$IRONIC_SERVICE_PROTOCOL://$IRONIC_HOSTPORT" \ "$IRONIC_SERVICE_PROTOCOL://$IRONIC_HOSTPORT" fi } # init_ironic() - Initialize databases, etc. function init_ironic { if is_service_enabled neutron; then # Save private network as cleaning network local cleaning_network_uuid cleaning_network_uuid=$(neutron net-list | grep private | get_field 1) die_if_not_set $LINENO cleaning_network_uuid "Failed to get ironic cleaning network id" iniset $IRONIC_CONF_FILE neutron cleaning_network_uuid ${cleaning_network_uuid} fi # (Re)create ironic database recreate_database ironic # Migrate ironic database $IRONIC_BIN_DIR/ironic-dbsync --config-file=$IRONIC_CONF_FILE create_ironic_cache_dir } # _ironic_bm_vm_names() - Generates list of names for baremetal VMs. function _ironic_bm_vm_names { local idx local num_vms num_vms=$(($IRONIC_VM_COUNT - 1)) for idx in $(seq 0 $num_vms); do echo "baremetal${IRONIC_VM_NETWORK_BRIDGE}_${idx}" done } # start_ironic() - Start running processes, including screen function start_ironic { # Start Ironic API server, if enabled. if is_service_enabled ir-api; then start_ironic_api fi # Start Ironic conductor, if enabled. if is_service_enabled ir-cond; then start_ironic_conductor fi # Start Apache if iPXE is enabled if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then restart_apache_server fi } # start_ironic_api() - Used by start_ironic(). # Starts Ironic API server. function start_ironic_api { run_process ir-api "$IRONIC_BIN_DIR/ironic-api --config-file=$IRONIC_CONF_FILE" echo "Waiting for ir-api ($IRONIC_HOSTPORT) to start..." if ! timeout $SERVICE_TIMEOUT sh -c "while ! wget --no-proxy -q -O- $IRONIC_SERVICE_PROTOCOL://$IRONIC_HOSTPORT; do sleep 1; done"; then die $LINENO "ir-api did not start" fi } # start_ironic_conductor() - Used by start_ironic(). # Starts Ironic conductor. function start_ironic_conductor { run_process ir-cond "$IRONIC_BIN_DIR/ironic-conductor --config-file=$IRONIC_CONF_FILE" # TODO(romcheg): Find a way to check whether the conductor has started. } # stop_ironic() - Stop running processes function stop_ironic { stop_process ir-api stop_process ir-cond # Cleanup the WSGI files if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then _cleanup_ironic_apache_wsgi fi # Remove the hook to disable log rotate sudo rm -rf $IRONIC_LIBVIRT_HOOKS_PATH/qemu } function create_ovs_taps { local ironic_net_id ironic_net_id=$(neutron net-list | grep private | get_field 1) die_if_not_set $LINENO ironic_net_id "Failed to get ironic network id" # Work around: No netns exists on host until a Neutron port is created. We # need to create one in Neutron to know what netns to tap into prior to the # first node booting. local port_id port_id=$(neutron port-create private | grep " id " | get_field 2) die_if_not_set $LINENO port_id "Failed to create neutron port" # intentional sleep to make sure the tag has been set to port sleep 10 local tapdev tapdev=$(sudo ip netns exec qdhcp-${ironic_net_id} ip link list | grep " tap" | cut -d':' -f2 | cut -d'@' -f1 | cut -b2-) die_if_not_set $LINENO tapdev "Failed to get tap device id" local tag_id tag_id=$(sudo ovs-vsctl show |grep ${tapdev} -A1 -m1 | grep tag | cut -d':' -f2 | cut -b2-) die_if_not_set $LINENO tag_id "Failed to get tag id" # make sure veth pair is not existing, otherwise delete its links sudo ip link show ovs-tap1 && sudo ip link delete ovs-tap1 sudo ip link show brbm-tap1 && sudo ip link delete brbm-tap1 # create veth pair for future interconnection between br-int and brbm sudo ip link add brbm-tap1 type veth peer name ovs-tap1 sudo ip link set dev brbm-tap1 up sudo ip link set dev ovs-tap1 up sudo ovs-vsctl -- --if-exists del-port ovs-tap1 -- add-port br-int ovs-tap1 tag=$tag_id sudo ovs-vsctl -- --if-exists del-port brbm-tap1 -- add-port $IRONIC_VM_NETWORK_BRIDGE brbm-tap1 # Remove the port needed only for workaround. neutron port-delete $port_id # Finally, share the fixed tenant network across all tenants. This allows the host # to serve TFTP to a single network namespace via the tap device created above. neutron net-update $ironic_net_id --shared true } function setup_qemu_log_hook { local libvirt_service_name # Make sure the libvirt hooks directory exist sudo mkdir -p $IRONIC_LIBVIRT_HOOKS_PATH # Copy the qemu hook to the right directory sudo cp $IRONIC_DEVSTACK_FILES_DIR/hooks/qemu $IRONIC_LIBVIRT_HOOKS_PATH/qemu sudo chmod -v +x $IRONIC_LIBVIRT_HOOKS_PATH/qemu sudo sed -e " s|%LOG_DIR%|$IRONIC_VM_LOG_DIR|g; " -i $IRONIC_LIBVIRT_HOOKS_PATH/qemu # Restart the libvirt daemon libvirt_service_name="libvirt-bin" if is_fedora; then libvirt_service_name="libvirtd" fi restart_service $libvirt_service_name } function create_bridge_and_vms { # Call libvirt setup scripts in a new shell to ensure any new group membership sudo su $STACK_USER -c "$IRONIC_SCRIPTS_DIR/setup-network.sh" if [[ "$IRONIC_VM_LOG_CONSOLE" == "True" ]] ; then local log_arg="$IRONIC_VM_LOG_DIR" if [[ "$IRONIC_VM_LOG_ROTATE" == "True" ]] ; then setup_qemu_log_hook fi else local log_arg="" fi local vbmc_port=$IRONIC_VBMC_PORT_RANGE_START local vm_name for vm_name in $(_ironic_bm_vm_names); do sudo su $STACK_USER -c "$IRONIC_SCRIPTS_DIR/create-node.sh $vm_name \ $IRONIC_VM_SPECS_CPU $IRONIC_VM_SPECS_RAM $IRONIC_VM_SPECS_DISK \ amd64 $IRONIC_VM_NETWORK_BRIDGE $IRONIC_VM_EMULATOR \ $vbmc_port $log_arg" >> $IRONIC_VM_MACS_CSV_FILE vbmc_port=$((vbmc_port+1)) done create_ovs_taps } function wait_for_nova_resources { # After nodes have been enrolled, we need to wait for both ironic and # nova's periodic tasks to populate the resource tracker with available # nodes and resources. Wait up to 2 minutes for a given resource before # timing out. local resource=$1 local expected_count=$2 local i echo_summary "Waiting 2 minutes for Nova resource tracker to pick up $resource >= $expected_count" for i in $(seq 1 120); do if [ $(nova hypervisor-stats | grep " $resource " | get_field 2) -ge $expected_count ]; then return 0 fi sleep 1 done die $LINENO "Timed out waiting for Nova hypervisor-stats $resource >= $expected_count" } function _clean_ncpu_failure { SCREEN_NAME=${SCREEN_NAME:-stack} SERVICE_DIR=${SERVICE_DIR:-${DEST}/status} n_cpu_failure="$SERVICE_DIR/$SCREEN_NAME/n-cpu.failure" if [ -f ${n_cpu_failure} ]; then mv ${n_cpu_failure} "${n_cpu_failure}.before-restart-by-ironic" fi } function enroll_nodes { local chassis_id chassis_id=$(ironic chassis-create -d "ironic test chassis" | grep " uuid " | get_field 2) die_if_not_set $LINENO chassis_id "Failed to create chassis" if [[ "$IRONIC_IS_HARDWARE" == "False" ]]; then local ironic_node_cpu=$IRONIC_VM_SPECS_CPU local ironic_node_ram=$IRONIC_VM_SPECS_RAM local ironic_node_disk=$IRONIC_VM_SPECS_DISK local ironic_ephemeral_disk=$IRONIC_VM_EPHEMERAL_DISK local ironic_node_arch=x86_64 local ironic_hwinfo_file=$IRONIC_VM_MACS_CSV_FILE if is_deployed_by_ipmitool; then local node_options="\ -i ipmi_address=127.0.0.1 \ -i ipmi_username=admin \ -i ipmi_password=password" else local node_options="\ -i ssh_virt_type=$IRONIC_SSH_VIRT_TYPE \ -i ssh_address=$IRONIC_VM_SSH_ADDRESS \ -i ssh_port=$IRONIC_VM_SSH_PORT \ -i ssh_username=$IRONIC_SSH_USERNAME \ -i ssh_key_filename=$IRONIC_KEY_FILE" fi node_options="\ $node_options \ -i deploy_kernel=$IRONIC_DEPLOY_KERNEL_ID \ -i deploy_ramdisk=$IRONIC_DEPLOY_RAMDISK_ID" else local ironic_node_cpu=$IRONIC_HW_NODE_CPU local ironic_node_ram=$IRONIC_HW_NODE_RAM local ironic_node_disk=$IRONIC_HW_NODE_DISK local ironic_ephemeral_disk=$IRONIC_HW_EPHEMERAL_DISK local ironic_node_arch=$IRONIC_HW_ARCH if [[ -z "${IRONIC_DEPLOY_DRIVER##*_ipmitool}" ]]; then local ironic_hwinfo_file=$IRONIC_IPMIINFO_FILE fi fi local total_nodes=0 local total_cpus=0 while read hardware_info; do if [[ "$IRONIC_IS_HARDWARE" == "False" ]]; then local mac_address mac_address=$(echo $hardware_info | awk '{print $1}') if is_deployed_by_ipmitool; then local vbmc_port vbmc_port=$(echo $hardware_info | awk '{print $2}') node_options+=" -i ipmi_port=$vbmc_port" fi elif is_deployed_by_ipmitool; then local ipmi_address ipmi_address=$(echo $hardware_info |awk '{print $1}') local mac_address mac_address=$(echo $hardware_info |awk '{print $2}') local ironic_ipmi_username ironic_ipmi_username=$(echo $hardware_info |awk '{print $3}') local ironic_ipmi_passwd ironic_ipmi_passwd=$(echo $hardware_info |awk '{print $4}') # Currently we require all hardware platform have same CPU/RAM/DISK info # in future, this can be enhanced to support different type, and then # we create the bare metal flavor with minimum value local node_options="-i ipmi_address=$ipmi_address -i ipmi_password=$ironic_ipmi_passwd\ -i ipmi_username=$ironic_ipmi_username" node_options+=" -i deploy_kernel=$IRONIC_DEPLOY_KERNEL_ID" node_options+=" -i deploy_ramdisk=$IRONIC_DEPLOY_RAMDISK_ID" fi # First node created will be used for testing in ironic w/o glance # scenario, so we need to know its UUID. local standalone_node_uuid="" if [ $total_nodes -eq 0 ]; then standalone_node_uuid="--uuid $IRONIC_NODE_UUID" fi local node_id node_id=$(ironic node-create $standalone_node_uuid\ --chassis_uuid $chassis_id \ --driver $IRONIC_DEPLOY_DRIVER \ --name node-$total_nodes \ -p cpus=$ironic_node_cpu\ -p memory_mb=$ironic_node_ram\ -p local_gb=$ironic_node_disk\ -p cpu_arch=$ironic_node_arch \ $node_options \ | grep " uuid " | get_field 2) ironic port-create --address $mac_address --node $node_id total_nodes=$((total_nodes+1)) total_cpus=$((total_cpus+$ironic_node_cpu)) done < $ironic_hwinfo_file local adjusted_disk adjusted_disk=$(($ironic_node_disk - $ironic_ephemeral_disk)) nova flavor-create --ephemeral $ironic_ephemeral_disk baremetal auto $ironic_node_ram $adjusted_disk $ironic_node_cpu nova flavor-key baremetal set "cpu_arch"="$ironic_node_arch" if [ "$VIRT_DRIVER" == "ironic" ]; then # NOTE(dtantsur): sometimes nova compute fails to start with ironic due # to keystone restarting and not being able to authenticate us. # Restart it just to be sure (and avoid gate problems like bug 1537076) stop_nova_compute || /bin/true # NOTE(pas-ha) if nova compute failed before restart, .failure file # that was created will fail the service_check in the end of the deployment _clean_ncpu_failure start_nova_compute wait_for_nova_resources "count" $total_nodes wait_for_nova_resources "vcpus" $total_cpus fi } function configure_iptables { # enable tftp natting for allowing connections to HOST_IP's tftp server sudo modprobe nf_conntrack_tftp sudo modprobe nf_nat_tftp # explicitly allow DHCP - packets are occasionally being dropped here sudo iptables -I INPUT -p udp --dport 67:68 --sport 67:68 -j ACCEPT || true # nodes boot from TFTP and callback to the API server listening on $HOST_IP sudo iptables -I INPUT -d $HOST_IP -p udp --dport 69 -j ACCEPT || true sudo iptables -I INPUT -d $HOST_IP -p tcp --dport $IRONIC_SERVICE_PORT -j ACCEPT || true if is_deployed_by_agent; then # agent ramdisk gets instance image from swift sudo iptables -I INPUT -d $HOST_IP -p tcp --dport ${SWIFT_DEFAULT_BIND_PORT:-8080} -j ACCEPT || true fi if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then sudo iptables -I INPUT -d $HOST_IP -p tcp --dport $IRONIC_HTTP_PORT -j ACCEPT || true fi } function configure_tftpd { # stop tftpd and setup serving via xinetd stop_service tftpd-hpa || true [ -f /etc/init/tftpd-hpa.conf ] && echo "manual" | sudo tee /etc/init/tftpd-hpa.override sudo cp $IRONIC_TEMPLATES_DIR/tftpd-xinetd.template /etc/xinetd.d/tftp sudo sed -e "s|%TFTPBOOT_DIR%|$IRONIC_TFTPBOOT_DIR|g" -i /etc/xinetd.d/tftp # setup tftp file mapping to satisfy requests at the root (booting) and # /tftpboot/ sub-dir (as per deploy-ironic elements) echo "r ^([^/]) $IRONIC_TFTPBOOT_DIR/\1" >$IRONIC_TFTPBOOT_DIR/map-file echo "r ^(/tftpboot/) $IRONIC_TFTPBOOT_DIR/\2" >>$IRONIC_TFTPBOOT_DIR/map-file chmod -R 0755 $IRONIC_TFTPBOOT_DIR restart_service xinetd } function configure_ironic_ssh_keypair { if [[ ! -d $HOME/.ssh ]]; then mkdir -p $HOME/.ssh chmod 700 $HOME/.ssh fi if [[ ! -e $IRONIC_KEY_FILE ]]; then if [[ ! -d $(dirname $IRONIC_KEY_FILE) ]]; then mkdir -p $(dirname $IRONIC_KEY_FILE) fi echo -e 'n\n' | ssh-keygen -q -t rsa -P '' -f $IRONIC_KEY_FILE fi cat $IRONIC_KEY_FILE.pub | tee -a $IRONIC_AUTHORIZED_KEYS_FILE } function ironic_ssh_check { local key_file=$1 local floating_ip=$2 local port=$3 local default_instance_user=$4 local active_timeout=$5 if ! timeout $active_timeout sh -c "while ! ssh -p $port -o StrictHostKeyChecking=no -i $key_file ${default_instance_user}@$floating_ip echo success; do sleep 1; done"; then die $LINENO "server didn't become ssh-able!" fi } function configure_ironic_auxiliary { configure_ironic_ssh_keypair ironic_ssh_check $IRONIC_KEY_FILE $IRONIC_VM_SSH_ADDRESS $IRONIC_VM_SSH_PORT $IRONIC_SSH_USERNAME $IRONIC_SSH_TIMEOUT } function build_ipa_coreos_ramdisk { echo "Building ironic-python-agent deploy ramdisk" local kernel_path=$1 local ramdisk_path=$2 # on fedora services do not start by default restart_service docker git_clone $IRONIC_PYTHON_AGENT_REPO $IRONIC_PYTHON_AGENT_DIR $IRONIC_PYTHON_AGENT_BRANCH cd $IRONIC_PYTHON_AGENT_DIR imagebuild/coreos/build_coreos_image.sh cp imagebuild/coreos/UPLOAD/coreos_production_pxe_image-oem.cpio.gz $ramdisk_path cp imagebuild/coreos/UPLOAD/coreos_production_pxe.vmlinuz $kernel_path sudo rm -rf UPLOAD cd - } function build_tinyipa_ramdisk { echo "Building ironic-python-agent deploy ramdisk" local kernel_path=$1 local ramdisk_path=$2 git_clone $IRONIC_PYTHON_AGENT_REPO $IRONIC_PYTHON_AGENT_DIR $IRONIC_PYTHON_AGENT_BRANCH cd $IRONIC_PYTHON_AGENT_DIR/imagebuild/tinyipa export BUILD_AND_INSTALL_TINYIPA=true make cp tinyipa.gz $ramdisk_path cp tinyipa.vmlinuz $kernel_path make clean cd - } # install_diskimage_builder() - Collect source and prepare or install from pip function install_diskimage_builder { if use_library_from_git "diskimage-builder"; then git_clone_by_name "diskimage-builder" setup_dev_lib "diskimage-builder" else pip_install_gr "diskimage-builder" fi } # build deploy kernel+ramdisk, then upload them to glance # this function sets ``IRONIC_DEPLOY_KERNEL_ID``, ``IRONIC_DEPLOY_RAMDISK_ID`` function upload_baremetal_ironic_deploy { declare -g IRONIC_DEPLOY_KERNEL_ID IRONIC_DEPLOY_RAMDISK_ID echo_summary "Creating and uploading baremetal images for ironic" # install diskimage-builder if [[ $(type -P ramdisk-image-create) == "" ]]; then install_diskimage_builder fi if [ -z "$IRONIC_DEPLOY_KERNEL" -o -z "$IRONIC_DEPLOY_RAMDISK" ]; then local IRONIC_DEPLOY_KERNEL_PATH=$TOP_DIR/files/ir-deploy-$IRONIC_DEPLOY_DRIVER.kernel local IRONIC_DEPLOY_RAMDISK_PATH=$TOP_DIR/files/ir-deploy-$IRONIC_DEPLOY_DRIVER.initramfs else local IRONIC_DEPLOY_KERNEL_PATH=$IRONIC_DEPLOY_KERNEL local IRONIC_DEPLOY_RAMDISK_PATH=$IRONIC_DEPLOY_RAMDISK fi if [ ! -e "$IRONIC_DEPLOY_RAMDISK_PATH" -o ! -e "$IRONIC_DEPLOY_KERNEL_PATH" ]; then # files don't exist, need to build them if [ "$IRONIC_BUILD_DEPLOY_RAMDISK" = "True" ]; then # we can build them only if we're not offline if [ "$OFFLINE" != "True" ]; then if is_deployed_with_ipa_ramdisk; then if [ "$IRONIC_RAMDISK_TYPE" == "coreos" ]; then build_ipa_coreos_ramdisk $IRONIC_DEPLOY_KERNEL_PATH $IRONIC_DEPLOY_RAMDISK_PATH elif [ "$IRONIC_RAMDISK_TYPE" == "tinyipa" ]; then build_tinyipa_ramdisk $IRONIC_DEPLOY_KERNEL_PATH $IRONIC_DEPLOY_RAMDISK_PATH else die $LINENO "Unrecognised IRONIC_RAMDISK_TYPE: $IRONIC_RAMDISK_TYPE. Expected 'coreos' or 'tinyipa'" fi else ramdisk-image-create $IRONIC_DEPLOY_FLAVOR \ -o $TOP_DIR/files/ir-deploy-$IRONIC_DEPLOY_DRIVER fi else die $LINENO "Deploy kernel+ramdisk files don't exist and cannot be build in OFFLINE mode" fi else if is_deployed_with_ipa_ramdisk; then # download the agent image tarball wget "$IRONIC_AGENT_KERNEL_URL" -O $IRONIC_DEPLOY_KERNEL_PATH wget "$IRONIC_AGENT_RAMDISK_URL" -O $IRONIC_DEPLOY_RAMDISK_PATH else die $LINENO "Deploy kernel+ramdisk files don't exist and their building was disabled explicitly by IRONIC_BUILD_DEPLOY_RAMDISK" fi fi fi # load them into glance IRONIC_DEPLOY_KERNEL_ID=$(openstack \ image create \ $(basename $IRONIC_DEPLOY_KERNEL_PATH) \ --public --disk-format=aki \ --container-format=aki \ < $IRONIC_DEPLOY_KERNEL_PATH | grep ' id ' | get_field 2) die_if_not_set $LINENO IRONIC_DEPLOY_KERNEL_ID "Failed to load kernel image into glance" IRONIC_DEPLOY_RAMDISK_ID=$(openstack \ image create \ $(basename $IRONIC_DEPLOY_RAMDISK_PATH) \ --public --disk-format=ari \ --container-format=ari \ < $IRONIC_DEPLOY_RAMDISK_PATH | grep ' id ' | get_field 2) die_if_not_set $LINENO IRONIC_DEPLOY_RAMDISK_ID "Failed to load ramdisk image into glance" } function prepare_baremetal_basic_ops { if [[ "$IRONIC_BAREMETAL_BASIC_OPS" != "True" ]]; then return 0 fi if [[ "$IRONIC_IS_HARDWARE" == "False" ]]; then configure_ironic_auxiliary fi upload_baremetal_ironic_deploy if [[ "$IRONIC_IS_HARDWARE" == "False" ]]; then create_bridge_and_vms fi enroll_nodes configure_tftpd configure_iptables } function cleanup_baremetal_basic_ops { if [[ "$IRONIC_BAREMETAL_BASIC_OPS" != "True" ]]; then return 0 fi rm -f $IRONIC_VM_MACS_CSV_FILE if [ -f $IRONIC_KEY_FILE ]; then local key key=$(cat $IRONIC_KEY_FILE.pub) # remove public key from authorized_keys grep -v "$key" $IRONIC_AUTHORIZED_KEYS_FILE > temp && mv temp $IRONIC_AUTHORIZED_KEYS_FILE chmod 0600 $IRONIC_AUTHORIZED_KEYS_FILE fi sudo rm -rf $IRONIC_DATA_DIR $IRONIC_STATE_PATH local vm_name for vm_name in $(_ironic_bm_vm_names); do sudo su $STACK_USER -c "$IRONIC_SCRIPTS_DIR/cleanup-node.sh $vm_name $IRONIC_VM_NETWORK_BRIDGE" done sudo rm -rf /etc/xinetd.d/tftp /etc/init/tftpd-hpa.override restart_service xinetd sudo iptables -D INPUT -d $HOST_IP -p udp --dport 69 -j ACCEPT || true sudo iptables -D INPUT -d $HOST_IP -p tcp --dport $IRONIC_SERVICE_PORT -j ACCEPT || true if is_deployed_by_agent; then # agent ramdisk gets instance image from swift sudo iptables -D INPUT -d $HOST_IP -p tcp --dport ${SWIFT_DEFAULT_BIND_PORT:-8080} -j ACCEPT || true fi sudo rmmod nf_conntrack_tftp || true sudo rmmod nf_nat_tftp || true } function ironic_configure_tempest { local bm_flavor_id bm_flavor_id=$(openstack flavor show baremetal -f value -c id) die_if_not_set $LINENO bm_flavor_id "Failed to get id of baremetal flavor" iniset $TEMPEST_CONFIG compute flavor_ref $bm_flavor_id iniset $TEMPEST_CONFIG compute flavor_ref_alt $bm_flavor_id } # Restore xtrace + pipefail $_XTRACE_IRONIC $_PIPEFAIL_IRONIC # Tell emacs to use shell-script-mode ## Local variables: ## mode: shell-script ## End: ironic-5.1.2/devstack/tools/0000755000567000056710000000000012732316670017114 5ustar jenkinsjenkins00000000000000ironic-5.1.2/devstack/tools/ironic/0000755000567000056710000000000012732316670020377 5ustar jenkinsjenkins00000000000000ironic-5.1.2/devstack/tools/ironic/templates/0000755000567000056710000000000012732316670022375 5ustar jenkinsjenkins00000000000000ironic-5.1.2/devstack/tools/ironic/templates/vm.xml0000644000567000056710000000304612732316050023534 0ustar jenkinsjenkins00000000000000 %(name)s %(memory)s %(cpus)s hvm destroy restart restart %(emulator)s