ironic-2014.1.rc1/0000775000175300017540000000000012316614636014715 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/tox.ini0000664000175300017540000000206312316614117016223 0ustar jenkinsjenkins00000000000000[tox] minversion = 1.6 skipsdist = True envlist = py26,py27,pep8 [testenv] usedevelop = True install_command = pip install -U {opts} {packages} setenv = VIRTUAL_ENV={envdir} deps = -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt commands = python setup.py testr --slowest --testr-args='{posargs}' whitelist_externals = bash [tox:jenkins] downloadcache = ~/cache/pip [testenv:pep8] commands = flake8 {posargs} {toxinidir}/tools/config/check_uptodate.sh # Check that .po and .pot files are valid: bash -c "find ironic -type f -regex '.*\.pot?' -print0|xargs --null -n 1 msgfmt --check-format -o /dev/null" [testenv:cover] setenv = VIRTUAL_ENV={envdir} commands = python setup.py testr --coverage {posargs} [testenv:venv] commands = {posargs} [flake8] # E711: ignored because it is normal to use "column == None" in sqlalchemy ignore = E12,E711 builtins = _ exclude = .venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build,tools [hacking] import_exceptions = ironic.openstack.common.gettextutils._,testtools.matchers ironic-2014.1.rc1/.mailmap0000664000175300017540000000022412316614116016325 0ustar jenkinsjenkins00000000000000# Format is: # # Joe Gordon ironic-2014.1.rc1/setup.py0000664000175300017540000000141512316614116016421 0ustar jenkinsjenkins00000000000000#!/usr/bin/env python # Copyright (c) 2013 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. # THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT import setuptools setuptools.setup( setup_requires=['pbr'], pbr=True) ironic-2014.1.rc1/LICENSE0000664000175300017540000002363712316614116015726 0ustar jenkinsjenkins00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. ironic-2014.1.rc1/PKG-INFO0000664000175300017540000000410012316614636016005 0ustar jenkinsjenkins00000000000000Metadata-Version: 1.1 Name: ironic Version: 2014.1.rc1 Summary: OpenStack Bare Metal Provisioning Home-page: http://www.openstack.org/ Author: OpenStack Author-email: openstack-dev@lists.openstack.org License: UNKNOWN Description: Ironic ====== Ironic is an Incubated 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 in concert to provision and turn on/off machines, but Ironic also supports vendor-specific plugins which may implement additional functionality. ----------------- Project Resources ----------------- Project status, bugs, and blueprints are tracked on Launchpad: http://launchpad.net/ironic Developer documentation can be found here: http://docs.openstack.org/developer/ironic Additional resources are linked from the project wiki page: https://wiki.openstack.org/wiki/Ironic Anyone wishing to contribute to an OpenStack project should find plenty of helpful resources here: https://wiki.openstack.org/wiki/HowToContribute All OpenStack projects use Gerrit for code reviews. A good reference for that is here: https://wiki.openstack.org/wiki/GerritWorkflow 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 Classifier: Programming Language :: Python :: 2.6 ironic-2014.1.rc1/CONTRIBUTING.rst0000664000175300017540000000103412316614116017345 0ustar jenkinsjenkins00000000000000If you would like to contribute to the development of OpenStack, you must follow the steps in the "If you're a developer, start here" section of this page: http://wiki.openstack.org/HowToContribute Once those steps have been completed, changes to OpenStack should be submitted for review via the Gerrit tool, following the workflow documented at: http://wiki.openstack.org/GerritWorkflow Pull requests submitted through GitHub will be ignored. Bugs should be filed on Launchpad, not GitHub: https://bugs.launchpad.net/ironic ironic-2014.1.rc1/ChangeLog0000664000175300017540000010007412316614636016471 0ustar jenkinsjenkins00000000000000CHANGES ======= 2014.1.rc1 ---------- * Manually update all translated strings * Check that all po/pot files are valid * If no swap is specified default to 1MB * Remove obsolete po entries - they break translation jobs * Add note to ssh about impact on ci testing * Adds exact match filters to nova scheduler * ironic_host_manager was missing two stats * Imported Translations from Transifex * Fix seamicro validate() method definition * Remove some obsolete settings from DevStack doc * Raise unexpected exceptions during destroy() * Start using oslosphinx theme for docs * Provide a new ComputeManager for Ironic * Nova Ironic driver to set pxe_swap_mb in Ironic * Fix strings post landing for c63e1d9f6 * Run periodic_task in a with a dynamic timer * Update SeaMicro to use MixinVendorInterface * Run ipmi power status less aggressively * Avoid API root controller dependency on v1 dir * Update Neutron if mac address of the port changed * Replace fixtures with mock in test_keystone.py * Decrease running time of SeaMicro driver tests * Remove logging of exceptions from controller's methods * Imported Translations from Transifex * Fix missed exception raise in _add_driver_fields * Speed up ironic tests * Pass no arguments to _wait_for_provision_state() * Adds max retry limit to sync_power_state task * Updated from global requirements * Imported Translations from Transifex * Stop incorrectly returning rescue: supported * Correct version.py and update current version string * Documentation for deploying DevStack /w Ironic * Hide rescue interface from validate() output * Change set_console_mode() to use greenthreads * Fix help string for a glance option * Expose API for fetching a single driver * Change JsonEncodedType.impl to TEXT * Fix traceback hook for avoid duplicate traces * Fix 'spacing' parameters for periodic tasks * Permit passing SSH keys into the Ironic API * Better instance-not-found handling within IronicDriver * Make sure auth_url exists and is not versionless * Conductor de-registers on shutdown * Change deploy validation exception handling * Suppress conductor logging of expected exceptions * Remove unused method from timeutils * Add admin_auth_token option for nova driver * Remove redundant nova virt driver test * Process public API list as regular expressions * Enable pep8 tests for the Nova Ironic Driver * Fix typo tenet -> tenant * Stop logging paramiko's DEBUG and INFO messages * Set boot device to PXE when deploying * Driver utils should raise unsupported method * Delete node while waiting for deploy * Check BMC availability in ipmitool 'validate' method * SeaMicro use device parameter for set_boot_device * Make the Nova Ironic driver to wait for ACTIVE * Fix misspelled impi to ipmi * Do not use __builtin__ in python3 * Use range instead xrange to keep python 3.X compatibility * Set the database.connection option default value * PXE validate() to fail if no Ironic API URL * Improve Ironic Conductor threading & locks * Generic MixinVendorInterface using static mapping * Conductor logs better error if seamicroclient missing * Add TaskManager lock on change port data * Nova ironic driver to retry on HTTP 503 * Mark hash_replicas as experimental * do_node_deploy() to use greenthreads * Move v1 API tests to separate v1 directory * Pin iso8601 logging to WARN * Only fetch node once for vif actions * Fix how nova ironic driver gets flavor information * Imported Translations from Transifex * API: Add sample() method to remaining models * Import Nova "ironic" driver * Remove errors from API documentation * Add libffi-dev(el) dependency to quickstart * Updated from global requirements * Remove redundant default value None for dict.get 2014.1.b3 --------- * Refactor vendor_passthru to use conductor async workers * Fix wrong exception raised by conductor for node * Fix params order in assertEqual * Sync the log_handler from oslo * Fix SeaMicro driver post landing for ba207b4aa0 * Implements SeaMicro VendorPassThru functionality * Implement the SeaMicro Power driver * Fix provision_updated_at deserialization * Remove jsonutils from test_rpcapi * Do not delete a Node which is not powered off * Add provision_updated_at to node's resource * Prevent a node in maintenance from being deployed * Allow clients to mark a node as in maintenance * Support preserve_ephemeral * Updated from global requirements * API: Expose a way to start/stop the console * Add option to sync node power state from DB * Make the PXE driver understand ephemeral disks * Log deploy_utils.deploy() erros in the PXE driver * Removing get_node_power_state, bumping RPC version * Add timeout for waiting callback from deploy ramdisk * Prevent GET /v1/nodes returning maintenance field * Suggested improvements to _set_boot_device * Move ipminative _set_boot_device to VendorPassthru * Sync common db code from Oslo * PXE clean_up() to remove the pxe_deploy_key parameter * Add support for custom libvirt uri * Python 3: replace "im_self" by "__self__" * Fix race condition when deleting a node * Remove extraneous vim configuration comments for ironic * Do not allow POST ports and chassis internal attributes * Do not allow POST node's internal attributes * Unused 'pxe_key_data' & 'pxe_instance_name' info * Add provision_updated_at field to nodes table * Exclude nodes in DEPLOYWAIT state from _sync_power_states * Sync common config module from Oslo * Get rid object model `dict` methods part 4 * Sync Oslo rpc module to Ironic * Clarify and fix the dev-quickstart doc some more * Do not use CONF as a default parameter value * Simplify locking around acquiring Node resources * Improve help strings * Remove shebang lines from code * Use six.moves.urllib.parse instead of urlparse * Add string representation method to MultiType * Fix test migrations for alembic * Sync Oslo gettextutils module to Ironic * NodeLocked returns 503 error status * Supports OPERATOR priv level for ipmitool driver * Correct assertEqual order from patch e69e41c99fb * PXE and SSH validate() method to check for a port * Task object as paramater to validate() methods * Fix dev-quick-start.rst post landing for 9d81333fd0 * API validates driver name for both POST and PATCH * Sync Oslo service module to Ironic * Move ipmitool _set_boot_device to VendorPassthru * Use six.StringIO/BytesIO instead of StringIO.StringIO * Add JSONEncodedType with enforced type checking * Correct PXEPrivateMethodsTestCase.setUp * Don't raise MySQL 2013 'Lost connection' errors * Use the custom wsme BooleanType on the nodes api * Add wsme custom BooleanType type * Fix task_manager acquire post landing for c4f2f26ed * Add common.service config options to sample * Removes use of timeutils.set_time_override * Replace assertEqual(None, *) with assertIsNone in tests * Replace nonexistent mock assert methods with real ones * Log IPMI power on/off timeouts * Remove None as default value for dict get() * Fix autodoc formatting in pxe.py * Fix race condition when changing node states * Use StringType from WSME * Add testing and doc sections to docs/dev-quickstart * Implement _update_neutron in PXE driver * Remove _load_one_plugin fallback * SSHPower driver support VMware ESXi * Make ironic-api not single threaded * Remove POST calls in tests for resource creation * Add topic to the change_node_maintenance_mode() RPC method * Fix API inconsistence when changing node's states * Add samples to serve API through Apache mod_wsgi * Add git dependency to quickstart docs * Add get_console() method * Remove unnecessary json dumps/loads from tests * Add parameter for filtering nodes by maintenance mode * Rename and update ironic-deploy-helper rootwrap * Remove tox locale overrides * Updated from global requirements * Move eventlent monkeypatch out of cmd/ * Fix misspellings in ironic * Ensure parameter order of assertEqual correct * Return correct HTTP response codes for create ops * Fix broken doc links on the index page * Allow to tear-down a node waiting to be deployed * Improve NodeLocked exception message * Expose 'reservation' field of a node via API * Implement a multiplexed VendorPassthru example * Fix log and test for NeutronAPI.update_port_dhcp_opts * Fix 'run_as_root' parameter check in utils * Handle multiple exceptions raised by jsonpatch * API tests to check for the return codes * Imported Translations from Transifex * Move test__get_nodes_mac_addresses * Removed duplicated function to create a swap fs * Updated from global requirements * Add futures to requirements * Fix missing keystone option in ironic.conf.sample * Adds Neutron support to Ironic * Replace CONF.set_default with self.config * Fix ssh_port type in _parse_driver_info() from ssh.py * Improve handling of invalid input in HashRing class * Sync db.sqlalchemy code from Oslo * Add lockfile>=0.8 to requirements.txt * Remove net_config_template options * Remove deploy kernel and ramdisk global config * Update docstrings in ssh.py * SSHPower driver raises IronicExceptions * mock's return value for processutils.ssh_execute * API: Add sample() method on Node * Update method doc strings in pxe.py * Minor documentation update * Removed unused exceptions * Bump version of sphinxcontrib-pecanwsme * Add missing parameter in call to _load_one_plugin * Docstrings for ipmitool * alembic with initial migration and tests * Update RPC version post-landing for 9bc5f92fb * ipmitool's _power_status raises IPMIFailure 2014.1.b2 --------- * Add [keystone_authtoken] to ironic.conf.sample * Updated from global requirements * Add comment about node.instance_uuid * Run mkfs as root * Remove the absolute paths from ironic-deploy-helper.filters * PXE instance_name is no longer mandatory * Remove unused config option - pxe_deploy_timeout * Delete the iscsi target * Imported Translations from Transifex * Fix non-unique tftp dir instance_uuid * Fix non-unique pxe driver 'instance_name' * Add missing "Filters" section to the ironic-images.filters * Use oslo.rootwrap library instead of local copy * Replace assertTrue with explicit assertIsInstance * Disallow new provision for nodes in maintenance * Add RPC method for node maintenance mode * Fix keystone get_service_url filtering * Use same MANAGER_TOPIC variable * Implement consistent hashing of nodes to conductors * PXEAndSSH driver lacked vendor_passthru * Use correct auth context inside pxe driver * sync_power_states handles missing driver info * Enable $pybasedir value in pxe.py * Correct SSHPowerDriver validate() exceptions * API to check the requested power state * Improve the node driver interfaces validation output * Remove copyright from empty files * Make param descriptions more consistent in API * Imported Translations from Transifex * Fix wrong message of pxe validator * Remove unused dict BYTE_MULTIPLIERS * Implement API for provisioning * API to validate UUID parameters * Make chassis_uuid field of nodes optional * Add unit tests for get_nodeinfo_list * Improve error handling in PXE _continue_deploy * Make param names more consistent in API * Sync config module from oslo * Fix wrong message of MACAlreadyExists * Avoid a race when associating instance_uuid * Move and rename ValidTypes * Convert trycmd() to oslo's processutils * Improve error handling in validate_vendor_action * Passing nodes more consistently * Add 'next' link when GET maximum number of items * Check connectivity in SSH driver 'validate' method * GET /drivers to show a list of active conductors * Improve method to get list of active conductors * Refactor /node//state * Reworks Chassis validations * Reworks Node validations * Developer doc index page points to correct API docs * Fix auto-generated REST API formatting * Method to generate PXE options for Neutron ports * Strip '/' from api_url string for PXE driver * Add driver interfaces validation * Command call should log the stdout and stderr * Add prepare, clean_up, take_over methods to deploy * PEP8-ify imports in test_ipmitool * API: Add sample() method on Port and PortCollection * API: Validate and normalize address * Handle DBDuplicateEntry on Ports with same address * Imported Translations from Transifex * removed wrap_exception method from ironic/common/exception.py * Rework patch validation on Ports * Add JsonPatchType class * Change default API auth to keystone-based * Clean up duplicated change-building code in objects * Add -U to pip install command in tox.ini * Updated from global requirements * Add config option for # of conductor replicas * Port StringType class from WSME trunk * Add tools/conf/check_uptodate to tox.ini 2014.1.b1 --------- * Correct error with unicode mac address * Expose created_at/updated_at properties in the REST API * Import heartbeat_interval opt in API * Add power control to PXE driver * Implement sync_power_state periodic task * Set the provision_state to DEPLOYFAIL * Save PKI token in a file for PXE deploy ramdisk * API ports update for WSME 0.5b6 compliance * Add heartbeat_interval to new 'conductor' cfg group * Add missing hash_partition_exponent config option * If no block devices abort deployment * Add missing link for drivers resource * Apply comments to 58558/4 post-landing * Replace removed xrange in Python3 * Imported Translations from Transifex * Use addCleanup() in test_deploy_utils * Allow Pecan to use 'debuginfo' response field * Do not allow API to expose error stacktrace * Add port address unique constraint for sqlite * Implement consistent hashing common methods * Sync some db changes from Oslo * Bump required version of sqlalchemy-migrate * Update ironic.conf.sample * Import uuidutils unit tests from oslo * Allow FakePower to return node objects power_state * Adds doc strings to API FunctionalTest class * Use oslo's execute() and ssh_execute() methods * Remove openstack.common.uuidutils * Sync common.context changes from olso * Remove oslo uuidutils.is_uuid_like call * Remove oslo uuidutils.generate_uuid() call * Add troubleshoot option to PXE template * Imported Translations from Transifex * Add tftp_server pattern in ironic.conf * Import HasLength object * ipmitool SHOULD accept empty username/password * Imported Translations from Transifex * Add missing ConfigNotFound exception * Imported Translations from Transifex * Add hooks to auto-generate REST API docs * Imported Translations from Transifex * Redefined default value of allowed_rpc_exception_modules * Add last_error usage to deploy and teardown methods * Support building wheels (PEP-427) * Import missing gettext _ to fix Sphinx error * sync common.service from oslo * sync common.periodic_task from oslo * sync common.notifier.* from oslo * sync common.log from oslo * sync common.local from oslo * Sync common utils from Oslo * Rename parameters * Accessing a subresource that parent does not exist * Imported Translations from Transifex * Changes power_state and adds last_error field * Update openstack/common/lockutils * sync common.context from oslo * sync common.config.generator from oslo * Remove sqlalchemy-migrate 0.7.3 patching * Fix integer division compatibility in middleware * Fix node lock in PXE driver * Imported Translations from Transifex * Register API options under the 'api' group * Supporting both Python 2 and Python 3 with six * Supports get node by instance uuid in API * Imported Translations from Transifex * Check invalid uuid for get-by-instance db api * Fix error handling in ssh driver * Replace __metaclass__ * Supporting both Python 2 and Python 3 with six * Pass Ironic API url to deploy ramdisk in PXE driver * Remove 'basestring' from objects utils * Allows unicode description for chassis * Fix a typo in the name of logger method exception * Don't use deprecated module commands * Comply with new hacking requirements * Improve the API doc spec for chassis * Improve the API doc spec for node * Updated from global requirements * Fix i18N compliance * Add wrapper for keystone service catalog * Fix test node manager * Expose /drivers on the API * Update mailmap for Joe Gordon * Add mailmap file * Implement /nodes/UUID/vendor_passthru in the API * Add context to TaskManager * Regenerate the sample config file * Conductors maintan driver list in the DB * Group and unify ipmi configurations * Fix a few missing i18n * Fix status codes in node controller * Fix exceptions handling in controllers * Updated from global requirements * Support uniform MAC address with colons * Remove redundant test stubs from conductor/manager * Remove several old TODO messages * Supports paginate query for two get nodes DB APIs * Remove _driver_factory class attribute * Fixes RootController to allow URL without version tag * Don't allow deletion of associated node * Remove duplicated db_api.get_instance() from tests * Updated from global requirements * Do not use string concatenation for localized strings * Remove the NULL state * Add DriverFactory * Adjust native ipmi default wait time * Be more patient with IPMI and BMC * Implement db get_[un]associated_nodes * Remove unused nova specific files * Removes unwanted mox and fixture files * Removes stubs from unit tests * Remove unused class/file * Remove driver validation on node update * Consolidates TestCase and BaseTestCase * Fix policies * Improve error message for ssh * Fix datetime format in FakeCache * Fix power_state set to python object repr * Updated from global requirements * Replaces mox with mock for test_deploy_utils * Replaces mox with mock in api's unit tests * Replaces mox with mock in objects' unit tests * Replaces mox with mock for conductor unit tests * fix ssh driver exec command issues * Fix exceptions error codes * Remove obsolete redhat-eventlet.patch * Replaces mox with mock for test_utils * Replaces mox with mock for ssh driver unit tests * Remove nested 'ipmi' dict from driver_info * Replace tearDown with addCleanup in unit tests * Remove nested 'ssh' dict from driver_info * Remove nested 'pxe' dict from driver_info * Save and validate deployment key in PXE driver * Implement deploy and tear_down conductor methods * Use mock to do unit tests for pxe driver * Code clean in node controller * Use mock to do unit tests for ipminative driver * Replaces mox with mock for ipmitool driver unit tests * Fix parameter name in wsexpose * Rename start_power_state_change to change_node_power_state * Mount iSCSI target and 'dd' in PXE driver * Add tests for api/utils.py * Check for required fields on ports * Replace Cheetah with Jinja2 * Update from global requirements * Upgrade tox to 1.6 * Add API uuid <-> id mapping * Doc string and minor clean up for 41976 * Update error return code to match new Pecan release * Add vendor_passthru method to RPC API * Integer types support in api * Add native ipmi driver * API GET to return only minimal data * Fix broken links * Collection named based on resource type * Remove nova specific tests * Changes documentation hyperlinks to be relative * Replace OpenStack LLC with OpenStack Foundation * Force textmode consoles * Implemented start_power_state_change In Conductor * Updates documentation for tox use * Drop setuptools_git dependency * Fix tests return codes * Fix misused assertTrue in unit tests * Prevent updates while state change is in progress * Use localisation where user visible strings are used * Update only the changed fields * Improve parameters validate in PXE driver * Rename ipmi driver to ipmitool * Remove jsonutils from PXE driver * Expose the vendor_passthru resource * Driver's validation during node update process implemented * Public API * Remove references for the 'task_state' property * Use 'provision_state' in PXE driver * Updating resources with PATCH * Add missing unique constraint * Fix docstring typo * Removed templates directory in api config * Added upper version boundry for six * Sync models with migrations * Optimization reserve and release nodes db api methods * Add missing foreign key * Porting nova pxe driver to ironic * API Nodes states * Fix driver loading * Move glance image service client from nova and cinder into ironic * Implement the root and v1 entry points of the API * Expose subresources for Chassis and Node * Add checks locked nodes to db api * Update the dev docs with driver interface description * Add missing tests for chassis API * Delete controller to make code easy to read and understood * Disable deleting a chassis that contains nodes * Update API documentation * Add Pagination of collections across the API * Fix typo in conductor manager * Remove wsme validate decorator from API * Add missing tests for ports API * Modify is_valid_mac() for support unicode strings * Add DB and RPC method doc strings to hook.py * Delete unused templates * Use fixture from Oslo * Move "opportunistic" db migrations tests from Nova * Build unittests for nodes api * make api test code more readable * Add links to API Objects * Delete Ironic context * Add tests for existing db migrations * Add common code from Oslo for db migrations test * Remove extra pep8/flake8/pyflakes requirements * Sync requirements with OpenStack/requirements * Fix up API tests before updating hacking checks * Add RPC methods for updating nodes * Run extract_messages * Keystone authentiation * Add serializer param to RPC service * Import serialization and nesting from Nova Objects * Implement chassis api actions * update requires to prevent version cap * Change validate() to raise instead of returning T/F * Add helpers for single-node tasks * Implement port api action * Modify gitignore to ignore sqlite * Update resource manager for fixed stevedore issue * Add dbapi functions * Remove suds requirement * Sync install_venv_common from oslo * Move mysql_engine option to [database] group * Re-define 'extra' as dict_or_none * Added Python-2.6 to the classifier * Rename "manager" to "conductor" * Port from nova: Fix local variable 'root_uuid' ref * Created a package for API controllers V1 * Sync requirements with OpenStack/requirements * Remove unused APICoverage class * Sync fileutils from oslo-incubator * Sync strutils from oslo-incubator * Add license header * Update get_by_uuid function doc in chassis * Fix various Python 2.x->3.x compat issues * Improve unit tests for API * Add Chassis object * Add Chassis DB model and DB-API * Delete associated ports after deleting a node * Virtual power driver is superceded by ssh driver * Add conf file generator * Refactored query filters * Add troubleshoot to baremetal PXE template * Add err_msg param to baremetal_deploy_helper * Retry the sfdisk command up to 3 times * Updated API Spec for new Drivers * Improve IPMI's _make_password_file method * Remove spurious print statement from update_node * Port middleware error handler from ceilometer API * Add support for GET /v1/nodes to return a list * Add object support to API service * Remove the unused plugin framework * Improve tests for Node and Port DB objects * SSH driver doesn't need to query database * Create Port object * Add uuid to Port DB model * Delete Flask Dependence * Writing Error: nodess to nodes * Create the Node object * Restructuring driver API and inheritance * Remove explicit distribute depend * Bump version of PBR * Remove deleted[_at] from base object * Make object actions pass positional arguments * Fix relative links in architecture doc * Reword architecture driver description * Remove duplication from README, add link to docs * Port base object from Nova * Fix ironic-rootwrap capability * Add ssh power manager * Prevent IPMI actions from colliding * Add TaskManager tests and fix decorator * Mocked NodeManager can load and mock real drivers * Add docs for task_manager and tests/manager/utils * Fix one typo in index.rst * Add missing 'extra' field to models.nodes * More doc updates * Remove the old README * More doc updates * Minor fixes to sphinx docs * Added API v1 Specification * Add initial sphinx docs, based on README * Initial skeleton for an RPC layer * Log configuration values on API startup * Don't use pecan to configure logging * Move database.backend option import * Remove unused authentication CLI options * Rename TestCase.flags() to TestCase.config() * Copy the RHEL6 eventlet workaround from Oslo * Sync new database config group from oslo-incubator * Minor doc change for manager and resorce_manager * Add support for Sphinx Docs * Update IPMI driver to work with resource manager * Add validate_driver_info to driver classes * Implement Task and Resource managers * Update [reserve|release]_nodes to accept a tag * More updates to the README * Reimplement reserve_nodes and release_nodes * Rename the 'ifaces' table to 'ports' * Change 'nodes' to use more driver-specific JSON * Update driver names and base class * Stop creating a new db IMPL for every request * Fix double "host" option * Sync safe changes from oslo-incubator * Sync rpc changes from oslo-incubator * Sync log changes from oslo-incubator * Sync a rootwrap KillFilter fix from oslo-incubator * Sync oslo-incubator python3 changes * Add steps to README.rst * Fix fake bmc driver * move ironic docs to top level for ease of discovery * Update the README file development section * Add some API definitions to the README * Update the distribute dependency version * Add information to the project README * Fixes test_update_node by testing updated node * Fix pep8 errors and make it pass Jenkins tests * Update IPMI driver for new base class * Add new base and fake driver classes * Delete old base and fake classes * Add a few fixes for the API * Move strong nova depenencies into temporary dir * Update IPMI for new DB schema * Add unit tests for DB API * Remove tests for old DB * Add tests for ironic-dbsync * Remove ironic_manage * Implement GET /node/ifaces/ in API * Update exception.py * Update db models and API * Implement skeleton for a new DB backend * Remove the old db implementation * Implement initial skeleton of a manager service * Implement initial draft of a Pecan-based API * Fix IPMI tests * Move common things to ironic.common * Fix failing db and deploy_helper tests * un-split the db backend * Rename files and fix things * Import add'l files from Nova * update openstack-common.conf and import from oslo * Added .testr.conf * Renamed nova to ironic * Fixed hacking, pep8 and pyflakes errors * Added project infrastructure needs * Fix baremetal get_available_nodes * Improve Python 3.x compatibility * Import and convert to oslo loopingcall * baremetal: VirtualPowerDriver uses mac addresses in bm_interfaces * baremetal: Change input for sfdisk * baremetal: Change node api related to prov_mac_address * Remove "undefined name" pyflake errors * Remove unnecessary LOG initialisation * Define LOG globally in baremetal_deploy_helper * Only call getLogger after configuring logging * baremetal: Integrate provisioning and non-provisioning interfaces * Move console scripts to entrypoints * baremetal: Drop unused columns in bm_nodes * Remove print statements * Delete tests.baremetal.util.new_bm_deployment() * Adds Tilera back-end for baremetal * Change type of ssh_port option from Str to Int * Virtual Power Driver list running vms quoting error * xenapi: Fix reboot with hung volumes * Make bm model's deleted column match database * Correct substring matching of baremetal VPD node names * Read baremetal images from extra_specs namespace * Compute manager should remove dead resources * Add ssh port and key based auth to VPD * Add instance_type_get() to virt api * Don't blindly skip first migration * BM Migration 004: Actually drop column * Update OpenStack LLC to Foundation * Sync nova with oslo DB exception cleanup * Fix exception handling in baremetal API * BM Migrations 2 & 3: Fix drop_column statements * Remove function redefinitions * Move some context checking code from sqlalchemy * Baremetal driver returns accurate list of instance * Identify baremetal nodes by UUID * Improve performance of baremetal list_instances * Better error handling in baremetal spawn & destroy * Wait for baremetal deploy inside driver.spawn * Add better status to baremetal deployments * Use oslo-config-2013.1b4 * Delete baremetal interfaces when their parent node is deleted * VirtualPowerDriver catches ProcessExecutionError * Don't modify injected_files inside PXE driver * Remove nova.db call from baremetal PXE driver * Add a virtual PowerDriver for Baremetal testing * Recache or rebuild missing images on hard_reboot * Use oslo database code * Fixes 'not in' operator usage * Make sure there are no unused import * Enable N302: Import modules only * Correct a format string in virt/baremetal/ipmi.py * Add REST api to manage bare-metal nodes * Baremetal/utils should not log certain exceptions * PXE driver should rmtree directories it created * Add support for Option Groups in LazyPluggable * Remove obsolete baremetal override of MAC addresses * PXE driver should not accept empty kernel UUID * Correcting improper use of the word 'an' * Export the MAC addresses of nodes for bare-metal * Break out a helper function for working with bare metal nodes * Keep self and context out of error notification payload * Tests for PXE bare-metal provisioning helper server * Change ComputerDriver.legacy_nwinfo to raise by default * fix new N402 errors * Remove unused baremetal PXE options * Move global service networking opts to new module * Fix N402 for nova/virt * Cope better with out of sync bm data * Fix baremetal VIFDriver * CLI for bare-metal database sync * attach/detach_volume() take instance as a parameter * Convert short doc strings to be on one line * Check admin context in bm_interface_get_all() * Provide a PXE NodeDriver for the Baremetal driver * Refactor periodic tasks * Add helper methods to nova.paths * Move global path opts in nova.paths * Removes unused imports * Improve baremetal driver error handling * baremetal power driver takes **kwargs * Implement IPMI sub-driver for baremetal compute * Fix tests/baremetal/test_driver.py * Move baremetal options to [BAREMETAL] OptGroup * Remove session.flush() and session.query() monkey patching * Remove unused imports * Removed unused imports * Parameterize database connection in test.py * Baremetal VIF and Volume sub-drivers * New Baremetal provisioning framework * Move baremetal database tests to fixtures * Add exceptions to baremetal/db/api * Add blank nova/virt/baremetal/__init__.py * Move sql options to nova.db.sqlalchemy.session * Use CONF.import_opt() for nova.config opts * Remove nova.config.CONF * remove old baremetal driver * Remove nova.flags * Fix a couple uses of FLAGS * Added separate bare-metal MySQL DB * Switch from FLAGS to CONF in tests * Updated scheduler and compute for multiple capabilities * Switch from FLAGS to CONF in nova.virt * Make ComputeDrivers send hypervisor_hostname * Introduce VirtAPI to nova/virt * Migrate to fileutils and lockutils * Remove ComputeDriver.update_host_status() * Rename imagebackend arguments * Move ensure_tree to utils * Keep the ComputeNode model updated with usage * Don't stuff non-db data into instance dict * Making security group refresh more specific * Use dict style access for image_ref * Remove unused InstanceInfo class * Remove list_instances_detail from compute drivers * maint: remove an unused import in libvirt.driver * Fixes bare-metal spawn error * Refactoring required for blueprint xenapi-live-migration * refactor baremetal/proxy => baremetal/driver * Switch to common logging * Make libvirt LoopingCalls actually wait() * Imports cleanup * Unused imports cleanup (folsom-2) * convert virt drivers to fully dynamic loading * cleanup power state (partially implements bp task-management) * clean-up of the bare-metal framework * Added a instance state update notification * Update pep8 dependency to v1.1 * Alphabetize imports in nova/tests/ * Make use of openstack.common.jsonutils * Alphabetize imports in nova/virt/ * Replaces exceptions.Error with NovaException * Log instance information for baremetal * Improved localization testing * remove unused flag: baremetal_injected_network_template baremetal_uri baremetal_allow_project_net_traffic * Add periodic_fuzzy_delay option * HACKING fixes, TODO authors * Add pybasedir and bindir options * Only raw string literals should be used with _() * Remove unnecessary setting up and down of mox and stubout * Remove unnecessary variables from tests * Move get_info to taking an instance * Exception cleanup * Backslash continuations (nova.tests) * Replace ApiError with new exceptions * Standardize logging delaration and use * remove unused and buggy function from baremetal proxy * Backslash continuations (nova.virt.baremetal) * Remove the last of the gflags shim layer * Implements blueprint heterogeneous-tilera-architecture-support * Deleting test dir from a pull from trunk * Updated to remove built docs * initial commit ironic-2014.1.rc1/requirements.txt0000664000175300017540000000076612316614116020203 0ustar jenkinsjenkins00000000000000pbr>=0.6,<1.0 SQLAlchemy>=0.7.8,<=0.9.99 alembic>=0.4.1 amqplib>=0.6.1 anyjson>=0.3.3 argparse eventlet>=0.13.0 kombu>=2.4.8 lockfile>=0.8 lxml>=2.3 WebOb>=1.2.3 greenlet>=0.3.2 futures>=2.1.3 sqlalchemy-migrate>=0.8.2,!=0.8.4 netaddr>=0.7.6 paramiko>=1.9.0 iso8601>=0.1.9 python-neutronclient>=2.3.4,<3 python-glanceclient>=0.9.0 python-keystoneclient>=0.6.0 stevedore>=0.14 websockify>=0.5.1,<0.6 oslo.config>=1.2.0 oslo.rootwrap pecan>=0.4.5 six>=1.5.2 jsonpatch>=1.1 WSME>=0.6 Jinja2 pyghmi>=0.5.8 ironic-2014.1.rc1/doc/0000775000175300017540000000000012316614636015462 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/doc/source/0000775000175300017540000000000012316614636016762 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/doc/source/dev/0000775000175300017540000000000012316614636017540 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/doc/source/dev/architecture.rst0000664000175300017540000000731712316614116022755 0ustar jenkinsjenkins00000000000000.. _architecture: =================== System Architecture =================== High Level description ====================== An Ironic deployment will be composed of the following components: - A RESTful `API service`_, by which operators and other services may interact with the managed bare metal servers. - A `Conductor service`_, which does the bulk of the work. Functionality is exposed via the `API service`_. The Conductor and API services communicate via RPC. - A Database and `DB API`_ for storing the state of the Conductor and Drivers. - A Deployment Ramdisk or Deployment Agent, which provide control over the hardware which is not available remotely to the Conductor. A ramdisk should be built which contains one of these agents, eg. with `diskimage-builder`_. This ramdisk can be booted on-demand. - **NOTE:** The agent is never run inside a tenant instance. Drivers ======= The internal driver API provides a consistent interface between the Conductor service and the driver implementations. A driver is defined by a class inheriting from the `BaseDriver`_ class, defining certain interfaces; each interface is an instance of the relevant driver module. For example, a fake driver class might look like this:: class FakePower(base.PowerInterface): def get_power_state(self, task, node): return states.NOSTATE def set_power_state(self, task, node, power_state): pass class FakeDriver(base.BaseDriver): def __init__(self): self.power = FakePower() There are three categories of driver interfaces: - `Core` interfaces provide the essential functionality for Ironic within OpenStack, and may be depended upon by other services. All drivers must implement these interfaces. Presently, the Core interfaces are power and deploy. - `Standard` interfaces provide functionality beyond the needs of OpenStack, but which has been standardized across all drivers and becomes part of Ironic's API. If a driver implements this interface, it must adhere to the standard. This is presented to encourage vendors to work together with the Ironic project and implement common features in a consistent way, thus reducing the burden on consumers of the API. Presently, the Standard interfaces are rescue and console. - The `Vendor` interface allows an exemption to the API contract when a vendor wishes to expose unique functionality provided by their hardware and is unable to do so within the core or standard interfaces. In this case, Ironic will merely relay the message from the API service to the appropriate driver. Message Routing =============== Each Conductor registers itself in the database upon start-up, and periodically updates the timestamp of its record. Contained within this registration is a list of the drivers which this Conductor instance supports. This allows all services to maintain a consistent view of which Conductors and which drivers are available at all times. Based on their respective driver, all nodes are mapped across the set of available Conductors using a `consistent hashing algorithm`_. Node-specific tasks are dispatched from the API tier to the appropriate conductor using conductor-specific RPC channels. As Conductor instances join or leave the cluster, nodes may be remapped to different Conductors, thus triggering various driver actions such as take-over or clean-up. .. _API service: ../webapi/v1.html .. _BaseDriver: ../api/ironic.drivers.base.html#ironic.drivers.base.BaseDriver .. _Conductor service: ../api/ironic.conductor.manager.html .. _DB API: ../api/ironic.db.api.html .. _diskimage-builder: https://github.com/openstack/diskimage-builder .. _consistent hashing algorithm: ../api/ironic.common.hash_ring.html ironic-2014.1.rc1/doc/source/dev/db.rst0000664000175300017540000000017612316614116020654 0ustar jenkinsjenkins00000000000000.. _db: ============ DB API Layer ============ .. toctree:: ../api/ironic.db.api ../api/ironic.db.sqlalchemy.models ironic-2014.1.rc1/doc/source/dev/conductor.rst0000664000175300017540000000035212316614116022263 0ustar jenkinsjenkins00000000000000.. _conductor: ========================== Ironic's Conductor Service ========================== .. toctree:: ../api/ironic.conductor.manager ../api/ironic.conductor.resource_manager ../api/ironic.conductor.task_manager ironic-2014.1.rc1/doc/source/dev/dev-quickstart.rst0000664000175300017540000003321212316614116023232 0ustar jenkinsjenkins00000000000000.. _dev-quickstart: ===================== Developer Quick-Start ===================== This is a quick walkthrough to get you started developing code for Ironic. This assumes you are already familiar with submitting code reviews to an OpenStack project. .. seealso:: https://wiki.openstack.org/wiki/GerritWorkflow Install prerequisites:: # Ubuntu/Debian: sudo apt-get install python-dev libssl-dev python-pip libmysqlclient-dev libxml2-dev libxslt-dev libpq-dev git git-review libffi-dev # Fedora/RHEL: sudo yum install python-devel openssl-devel python-pip mysql-devel libxml2-devel libxslt-devel postgresql-devel git git-review libffi-devel sudo easy_install nose sudo pip install virtualenv setuptools-git flake8 tox testrepository You may need to explicitly upgrade virtualenv if you've installed the one from your OS distribution and it is too old (tox will complain). You can upgrade it individually, if you need to:: sudo pip install -U virtualenv Ironic source code should be pulled directly from git:: # from your home or source directory cd ~ git clone https://git.openstack.org/openstack/ironic cd ironic Set up a local environment for development and testing should be done with tox:: # create a virtualenv for development tox -evenv -- echo 'done' Activate the virtual environment whenever you want to work in it. All further commands in this section should be run with the venv active:: source .tox/venv/bin/activate All unit tests should be run using tox. To run Ironic's entire test suite:: # run all tests (unit and pep8) tox To run a specific test, use a positional argument for the unit tests:: # run a specific test for both Python 2.6 and 2.7 tox -epy26,py27 -- test_conductor You may pass options to the test programs using positional arguments:: # run all the Python 2.7 unit tests (in parallel!) tox -epy27 -- --parallel To run only the pep8/flake8 syntax and style checks:: tox -epep8 When you're done, deactivate the virtualenv:: deactivate =============================== Exercising the Services Locally =============================== If you would like to exercise the Ironic services in isolation within a local virtual environment, you can do this without starting any other OpenStack services. For example, this is useful for rapidly prototyping and debugging interactions over the RPC channel, testing database migrations, and so forth. First, install a few system prerequisites:: # install rabbit message broker # Ubuntu/Debian: sudo apt-get install rabbitmq-server # Fedora/RHEL: sudo yum install rabbitmq-server sudo service rabbitmq-server start # optionally, install mysql-server # Ubuntu/Debian: # sudo apt-get install mysql-server # Fedora/RHEL: # sudo yum install mysql-server # sudo service mysqld start Next, clone the client and install it within a virtualenv as well:: # from your home or source directory cd ~ git clone https://git.openstack.org/openstack/python-ironicclient cd python-ironicclient tox -evenv -- echo 'done' source .tox/venv/bin/activate python setup.py develop Export some ENV vars so the client will connect to the local services that you'll start in the next section:: export OS_AUTH_TOKEN=fake-token export IRONIC_URL=http://localhost:6385/ Open another window (or screen session) and activate the virtual environment created in the previous section to run everything else within:: # activate the virtualenv cd ironic source .tox/venv/bin/activate # install ironic within the virtualenv python setup.py develop # copy sample config and modify it as necessary cp etc/ironic/ironic.conf.sample etc/ironic/ironic.conf.local # disable auth since we are not running keystone here sed -i "s/#auth_strategy=keystone/auth_strategy=noauth/" etc/ironic/ironic.conf.local # set a fake host name [useful if you want to test multiple services on the same host] sed -i "s/#host=.*/host=test-host/" etc/ironic/ironic.conf.local # initialize the ironic database # this defaults to storing data in ./ironic/ironic.sqlite # If using MySQL, you need to create the initial database # mysql -u root -e "create schema ironic" # and switch the DB connection from sqlite to something else, eg. mysql # sed -i "s/#connection=.*/connection=mysql:\/\/root@localhost\/ironic/" etc/ironic/ironic.conf.local ironic-dbsync --config-file etc/ironic/ironic.conf.local Start the API service in debug mode and watch its output:: # start the API service ironic-api -v -d --config-file etc/ironic/ironic.conf.local Open one more window (or screen session), again activate the venv, and then start the conductor service and watch its output:: # activate the virtualenv cd ironic source .tox/venv/bin/activate # start the conductor service ironic-conductor -v -d --config-file etc/ironic/ironic.conf.local You should now be able to interact with Ironic via the python client (installed in the first window) and observe both services' debug outputs in the other two windows. This is a good way to test new features or play with the functionality without necessarily starting DevStack. To get started, list the available commands and resources:: # get a list of available commands ironic help # get the list of drivers currently supported by the available conductor(s) ironic driver-list # get a list of nodes (should be empty at this point) ironic node-list Here is an example walkthrough of creating a node:: MAC="aa:bb:cc:dd:ee:ff" # replace with the MAC of a data port on your node IPMI_ADDR="1.2.3.4" # replace with a real IP of the node BMC IPMI_USER="admin" # replace with the BMC's user name IPMI_PASS="pass" # replace with the BMC's password # enroll the node with the "fake" deploy driver and the "ipmitool" power driver # Note that driver info may be added at node creation time with "-i" NODE=$(ironic node-create -d fake_ipmitool -i ipmi_address=$IPMI_ADDR -i ipmi_username=$IPMI_USER | grep ' uuid ' | awk '{print $4}') # driver info may also be added or updated later on ironic node-update $NODE add driver_info/ipmi_password=$IPMI_PASS # add a network port ironic port-create -n $NODE -a $MAC # view the information for the node ironic node-show $NODE # request that the node's driver validate the supplied information ironic node-validate $NODE # you have now enrolled a node sufficiently to be able to control # its power state from ironic! ironic node-set-power-state $NODE on If you make some code changes and want to test their effects, install again with "python setup.py develop", stop the services with Ctrl-C, and restart them. ================================ Deploying Ironic with DevStack ================================ DevStack may be configured to deploy Ironic, setup Nova to use the Ironic driver and provide hardware resources (network, baremetal compute nodes) using a combination of OpenVSwitch and libvirt. It is highly recommended to deploy on an expendable virtual machine and not on your personal work station. .. seealso:: https://devstack.org Prepare the system (Ubuntu 12.04):: sudo apt-get update sudo apt-get install python-software-properties git sudo add-apt-repository cloud-archive:havana sudo apt-get update Clone DevStack:: cd ~ git clone https://github.com/openstack-dev/devstack.git devstack Create devstack/localrc with minimal settings required to enable Ironic:: cd devstack cat >localrc </state .. autotype:: ironic.api.controllers.v1.node.NodeStates :members: Ports ===== .. rest-controller:: ironic.api.controllers.v1.port:PortsController :webprefix: /v1/ports .. autotype:: ironic.api.controllers.v1.port.PortCollection :members: .. autotype:: ironic.api.controllers.v1.port.Port :members: ironic-2014.1.rc1/doc/source/index.rst0000664000175300017540000000423412316614116020617 0ustar jenkinsjenkins00000000000000============================================ Welcome to Ironic's developer documentation! ============================================ Introduction ============ Ironic is an Incubated OpenStack project which aims to provision bare metal (as opposed to virtual) machines by leveraging common technologies such as PXE boot and IPMI to cover a wide range of hardware, while supporting pluggable drivers to allow vendor-specific functionality to be added. If one thinks of traditional hypervisor functionality (eg, creating a VM, enumerating virtual devices, managing the power state, loading an OS onto the VM, and so on), then Ironic may be thought of as a *hypervisor API* gluing together multiple drivers, each of which implement some portion of that functionality with respect to physical hardware. For an in-depth look at the project's scope and structure, see the :doc:`dev/architecture` page. Status: Alpha Quality ===================== Ironic is targeting inclusion in the OpenStack Icehouse release. The current codebase should be considered "alpha" quality. All major functional components exist but there are many known bugs which will prevent general use at this time. Additionally, usage documentation still needs to be written. If you are looking for the preceding baremetal service, which was included in OpenStack Grizzly and Havana releases, please see Nova's `Baremetal driver`_. .. TODO .. - installation .. - configuration .. - DB and AMQP .. - API and Conductor services .. - integration with other OS services .. - any driver-specific configuration .. - hardware enrollment .. - manual vs automatic .. - hw plugins Developer Documentation ======================= Overview -------- .. toctree:: :maxdepth: 1 dev/architecture dev/contributing dev/dev-quickstart Client API Reference -------------------- .. toctree:: :maxdepth: 1 webapi/v1 Python API Quick Reference -------------------------- .. toctree:: :maxdepth: 1 dev/api dev/common dev/db dev/drivers dev/conductor Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` .. _Baremetal Driver: https://wiki.openstack.org/wiki/Baremetal ironic-2014.1.rc1/etc/0000775000175300017540000000000012316614636015470 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/etc/apache2/0000775000175300017540000000000012316614636016773 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/etc/apache2/ironic0000664000175300017540000000242012316614116020170 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 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-2014.1.rc1/etc/ironic/0000775000175300017540000000000012316614636016753 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/etc/ironic/ironic.conf.sample0000664000175300017540000005662312316614116022372 0ustar jenkinsjenkins00000000000000[DEFAULT] # # Options defined in ironic.netconf # # IP address of this host. (string value) #my_ip=10.0.0.1 # Use IPv6. (boolean value) #use_ipv6=false # # Options defined in ironic.api.app # # Method to use for authentication: noauth or keystone. # (string value) #auth_strategy=keystone # # Options defined in ironic.common.exception # # Make exception message format errors fatal. (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 is (2^hash_partition_exponent). (integer value) #hash_partition_exponent=16 # [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 # # Options defined in ironic.common.images # # Force backing images to raw format. (boolean value) #force_raw_images=true # # Options defined in ironic.common.paths # # Directory where the ironic python module is installed. # (string value) #pybasedir=/usr/lib/python/site-packages/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.policy # # JSON file representing policy. (string value) #policy_file=policy.json # Rule checked when requested rule is not found. (string # value) #policy_default_rule=default # # Options defined in ironic.common.service # # Seconds between running periodic tasks. (integer value) #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=ironic # # 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 # Explicitly specify the temporary working directory. (string # value) #tempdir= # # Options defined in ironic.openstack.common.eventlet_backdoor # # port for eventlet backdoor to listen (integer value) #backdoor_port= # # Options defined in ironic.openstack.common.lockutils # # Whether to disable inter-process locks. (boolean value) #disable_process_locking=false # Directory to use for lock files. (string value) #lock_path= # # Options defined in ironic.openstack.common.log # # Print debugging output (set logging level to DEBUG instead # of default WARNING level). (boolean value) #debug=false # Print more verbose output (set logging level to INFO instead # of default WARNING level). (boolean value) #verbose=false # Log output to standard error (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)s %(tenant)s] %(instance)s%(message)s # format string to use for log messages without context # (string value) #logging_default_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s # data to append to log format when level 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 TRACE %(name)s %(instance)s # list of logger=LEVEL pairs (list value) #default_log_levels=amqp=WARN,amqplib=WARN,boto=WARN,keystone=INFO,qpid=WARN,sqlalchemy=WARN,suds=INFO,iso8601=WARN # publish error events (boolean value) #publish_errors=false # make deprecations fatal (boolean value) #fatal_deprecations=false # If an instance is passed with the log message, format it # like this (string value) #instance_format="[instance: %(uuid)s] " # If an instance UUID is passed with the log message, format # it like this (string value) #instance_uuid_format="[instance: %(uuid)s] " # The name of logging configuration file. It does not disable # existing loggers, but just appends specified logging # configuration to any other existing logging options. Please # see the Python logging module documentation for details on # logging configuration files. (string value) # Deprecated group/name - [DEFAULT]/log_config #log_config_append= # DEPRECATED. A logging.Formatter log message format string # which may use any of the available logging.LogRecord # attributes. This option is deprecated. Please use # logging_context_format_string and # logging_default_format_string instead. (string value) #log_format= # Format string for %%(asctime)s in log records. Default: # %(default)s (string value) #log_date_format=%Y-%m-%d %H:%M:%S # (Optional) Name of log file to output to. If no default is # set, logging will go to stdout. (string value) # Deprecated group/name - [DEFAULT]/logfile #log_file= # (Optional) The base directory used for relative --log-file # paths (string value) # Deprecated group/name - [DEFAULT]/logdir #log_dir= # Use syslog for logging. (boolean value) #use_syslog=false # syslog facility to receive log lines (string value) #syslog_log_facility=LOG_USER # # Options defined in ironic.openstack.common.notifier.api # # Driver or drivers to handle sending notifications (multi # valued) #notification_driver= # Default notification level for outgoing notifications # (string value) #default_notification_level=INFO # Default publisher_id for outgoing notifications (string # value) #default_publisher_id= # # Options defined in ironic.openstack.common.notifier.rpc_notifier # # AMQP topic used for OpenStack notifications (list value) #notification_topics=notifications # # Options defined in ironic.openstack.common.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 ironic.openstack.common.rpc # # The messaging module to use, defaults to kombu. (string # value) #rpc_backend=ironic.openstack.common.rpc.impl_kombu # Size of RPC thread pool (integer value) #rpc_thread_pool_size=64 # Size of RPC connection pool (integer value) #rpc_conn_pool_size=30 # Seconds to wait for a response from call or multicall # (integer value) #rpc_response_timeout=60 # Seconds to wait before a cast expires (TTL). Only supported # by impl_zmq. (integer value) #rpc_cast_timeout=30 # Modules of exceptions that are permitted to be recreated # upon receiving exception data from an rpc call. (list value) #allowed_rpc_exception_modules=nova.exception,cinder.exception,exceptions # If passed, use a fake RabbitMQ provider (boolean value) #fake_rabbit=false # AMQP exchange to connect to if using RabbitMQ or Qpid # (string value) #control_exchange=openstack # # Options defined in ironic.openstack.common.rpc.amqp # # Use durable queues in amqp. (boolean value) # Deprecated group/name - [DEFAULT]/rabbit_durable_queues #amqp_durable_queues=false # Auto-delete queues in amqp. (boolean value) #amqp_auto_delete=false # # Options defined in ironic.openstack.common.rpc.impl_kombu # # If SSL is enabled, the SSL version to use. Valid values are # TLSv1, SSLv23 and SSLv3. SSLv2 might be available on some # distributions. (string value) #kombu_ssl_version= # SSL key file (valid only if SSL enabled) (string value) #kombu_ssl_keyfile= # SSL cert file (valid only if SSL enabled) (string value) #kombu_ssl_certfile= # SSL certification authority file (valid only if SSL enabled) # (string value) #kombu_ssl_ca_certs= # The RabbitMQ broker address where a single node is used # (string value) #rabbit_host=localhost # The RabbitMQ broker port where a single node is used # (integer value) #rabbit_port=5672 # RabbitMQ HA cluster host:port pairs (list value) #rabbit_hosts=$rabbit_host:$rabbit_port # Connect over SSL for RabbitMQ (boolean value) #rabbit_use_ssl=false # The RabbitMQ userid (string value) #rabbit_userid=guest # The RabbitMQ password (string value) #rabbit_password=guest # The RabbitMQ virtual host (string value) #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) #rabbit_retry_backoff=2 # Maximum number of RabbitMQ connection retries. Default is 0 # (infinite retry count) (integer value) #rabbit_max_retries=0 # Use HA queues in RabbitMQ (x-ha-policy: all). If you change # this option, you must wipe the RabbitMQ database. (boolean # value) #rabbit_ha_queues=false # # Options defined in ironic.openstack.common.rpc.impl_qpid # # Qpid broker hostname (string value) #qpid_hostname=localhost # Qpid broker port (integer value) #qpid_port=5672 # Qpid HA cluster host:port pairs (list value) #qpid_hosts=$qpid_hostname:$qpid_port # Username for qpid connection (string value) #qpid_username= # Password for qpid connection (string value) #qpid_password= # Space separated list of SASL mechanisms to use for auth # (string value) #qpid_sasl_mechanisms= # Seconds between connection keepalive heartbeats (integer # value) #qpid_heartbeat=60 # Transport to use, either 'tcp' or 'ssl' (string value) #qpid_protocol=tcp # Disable Nagle algorithm (boolean value) #qpid_tcp_nodelay=true # The qpid topology version to use. Version 1 is what was # originally used by impl_qpid. Version 2 includes some # backwards-incompatible changes that allow broker federation # to work. Users should update to version 2 when they are # able to take everything down, as it requires a clean break. # (integer value) #qpid_topology_version=1 # # Options defined in ironic.openstack.common.rpc.impl_zmq # # 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) #rpc_zmq_matchmaker=ironic.openstack.common.rpc.matchmaker.MatchMakerLocalhost # ZeroMQ receiver listening port (integer value) #rpc_zmq_port=9501 # 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=ironic # # Options defined in ironic.openstack.common.rpc.matchmaker # # Heartbeat frequency (integer value) #matchmaker_heartbeat_freq=300 # Heartbeat time-to-live. (integer value) #matchmaker_heartbeat_ttl=600 [api] # # Options defined in ironic.api # # The listen IP for the Ironic API server. (string value) #host_ip=0.0.0.0 # The port for the Ironic API server. (integer value) #port=6385 # The maximum number of items returned in a single response # from a collection resource. (integer value) #max_limit=1000 [conductor] # # 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= # Seconds between conductor heart beats. (integer value) #heartbeat_interval=10 # Maximum time (in seconds) since the last check-in of a # conductor. (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) for waiting callback from deploy ramdisk. # 0 - unlimited. (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 [database] # # Options defined in ironic.db.sqlalchemy.models # # MySQL engine to use. (string value) #mysql_engine=InnoDB # # Options defined in ironic.openstack.common.db.options # # The file name to use with SQLite (string value) #sqlite_db=ironic.sqlite # If True, SQLite uses synchronous mode (boolean value) #sqlite_synchronous=true # The backend to use for db (string value) # Deprecated group/name - [DEFAULT]/db_backend #backend=sqlalchemy # The SQLAlchemy connection string used 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 SQL mode to be used for MySQL sessions (default is # empty, meaning do not override any server-side SQL mode # setting) (string value) #mysql_sql_mode= # 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 db connection retries during startup. (setting -1 # implies 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= # 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 db connection retries (integer value) #db_retry_interval=1 # Whether to increase interval between db connection retries, # up to db_max_retry_interval (boolean value) #db_inc_retry_interval=true # max seconds between db connection retries, if # db_inc_retry_interval is enabled (integer value) #db_max_retry_interval=10 # maximum db connection retries before error is raised. # (setting -1 implies an infinite retry count) (integer value) #db_max_retries=20 [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= # # Options defined in ironic.common.image_service # # Default glance hostname or IP address. (string value) #glance_host=$my_ip # Default glance port. (integer value) #glance_port=9292 # Default protocol to use when connecting to glance. Set to # https for SSL. (string value) #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. (string 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 # Default protocol to use when connecting to glance. Set to # https for SSL. (string value) #auth_strategy=keystone [ipmi] # # Options defined in ironic.drivers.modules.ipminative # # Maximum time in seconds to retry IPMI operations. (integer # value) #retry_timeout=60 [keystone_authtoken] # # Options defined in keystoneclient.middleware.auth_token # # Prefix to prepend at the beginning of the path (string # value) #auth_admin_prefix= # Host providing the admin Identity API endpoint (string # value) #auth_host=127.0.0.1 # Port of the admin Identity API endpoint (integer value) #auth_port=35357 # Protocol of the admin Identity API endpoint(http or https) # (string value) #auth_protocol=https # 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. (boolean 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 # Single shared secret with the Keystone configuration used # for bootstrapping a Keystone installation, or otherwise # bypassing the normal authentication process. (string value) #admin_token= # Keystone account username (string value) #admin_user= # Keystone account password (string value) #admin_password= # Keystone service account tenant name to validate user tokens # (string value) #admin_tenant_name=admin # Env key for the swift cache (string value) #cache= # Required if Keystone server requires client certificate # (string value) #certfile= # Required if Keystone 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 # 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 - [DEFAULT]/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=300 # (optional) if defined, indicate whether token data should be # authenticated or authenticated and encrypted. Acceptable # values are MAC or ENCRYPT. 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) #memcache_security_strategy= # (optional, mandatory if memcache_security_strategy is # defined) this string is used for key derivation. (string # value) #memcache_secret_key= # (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 [matchmaker_redis] # # Options defined in ironic.openstack.common.rpc.matchmaker_redis # # Host to locate redis (string value) #host=127.0.0.1 # Use this port to connect to redis host. (integer value) #port=6379 # Password for Redis server. (optional) (string value) #password= [matchmaker_ring] # # Options defined in ironic.openstack.common.rpc.matchmaker_ring # # Matchmaker ring file (JSON) (string value) # Deprecated group/name - [DEFAULT]/matchmaker_ringfile #ringfile=/etc/oslo/matchmaker_ring.json [neutron] # # Options defined in ironic.common.neutron # # URL for connecting to neutron. (string value) #url=http://127.0.0.1:9696 # Timeout value for connecting to neutron in seconds. (integer # value) #url_timeout=30 [pxe] # # Options defined in ironic.drivers.modules.pxe # # Additional append parameters for baremetal PXE boot. (string # value) #pxe_append_params=nofb nomodeset vga=normal # Template file for PXE configuration. (string value) #pxe_config_template=$pybasedir/drivers/modules/pxe_config.template # IP address of Ironic compute node's tftp server. (string # value) #tftp_server=$my_ip # Ironic compute node's tftp root path. (string value) #tftp_root=/tftpboot # Directory where images are stored on disk. (string value) #images_path=/var/lib/ironic/images/ # Directory where master tftp images are stored on disk. # (string value) #tftp_master_path=/tftpboot/master_images # Directory where master instance images are stored on disk. # (string value) #instance_master_path=/var/lib/ironic/master_images # Neutron bootfile DHCP parameter. (string value) #pxe_bootfile_name=pxelinux.0 [rpc_notifier2] # # Options defined in ironic.openstack.common.notifier.rpc_notifier2 # # AMQP topic(s) used for OpenStack notifications (list value) #topics=notifications [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 [ssh] # # Options defined in ironic.drivers.modules.ssh # # libvirt uri (string value) #libvirt_uri=qemu:///system [ssl] # # Options defined in ironic.openstack.common.sslutils # # CA certificate file to use to verify connecting clients # (string value) #ca_file= # Certificate file to use when starting the server securely # (string value) #cert_file= # Private key file to use when starting the server securely # (string value) #key_file= ironic-2014.1.rc1/etc/ironic/rootwrap.conf0000664000175300017540000000165412316614116021476 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-2014.1.rc1/etc/ironic/policy.json0000664000175300017540000000016712316614116021142 0ustar jenkinsjenkins00000000000000{ "admin": "role:admin or role:administrator", "admin_api": "is_admin:True", "default": "rule:admin_api" } ironic-2014.1.rc1/etc/ironic/rootwrap.d/0000775000175300017540000000000012316614636021052 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/etc/ironic/rootwrap.d/ironic-manage-ipmi.filters0000664000175300017540000000055012316614116026102 0ustar jenkinsjenkins00000000000000# ironic-rootwrap command filters for manager nodes # This file should be owned by (and only-writeable by) the root user [Filters] # ironic/manager/ipmi.py: 'ipmitool', .. ipmitool: CommandFilter, /usr/bin/ipmitool, root # ironic/manager/ipmi.py: 'kill', '-TERM', str(console_pid) kill_shellinaboxd: KillFilter, root, /usr/local/bin/shellinaboxd, -15, -TERM ironic-2014.1.rc1/etc/ironic/rootwrap.d/ironic-images.filters0000664000175300017540000000032612316614116025164 0ustar jenkinsjenkins00000000000000# ironic-rootwrap command filters to maniputalte 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-2014.1.rc1/etc/ironic/rootwrap.d/ironic-utils.filters0000664000175300017540000000063112316614116025056 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 sfdisk: CommandFilter, sfdisk, root dd: CommandFilter, dd, root blkid: CommandFilter, blkid, root # ironic/common/utils.py mkswap: CommandFilter, mkswap, root mkfs: CommandFilter, mkfs, root ironic-2014.1.rc1/ironic/0000775000175300017540000000000012316614636016200 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/objects/0000775000175300017540000000000012316614636017631 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/objects/base.py0000664000175300017540000004415212316614116021114 0ustar jenkinsjenkins00000000000000# Copyright 2013 IBM Corp. # # 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 common internal object model""" import collections import six from ironic.common import exception from ironic.objects import utils as obj_utils from ironic.openstack.common import context from ironic.openstack.common import log as logging from ironic.openstack.common.rpc import common as rpc_common from ironic.openstack.common.rpc import serializer as rpc_serializer LOG = logging.getLogger('object') def get_attrname(name): """Return the mangled name of the attribute's underlying storage.""" return '_%s' % name def make_class_properties(cls): # NOTE(danms): Inherit IronicObject's base fields only cls.fields.update(IronicObject.fields) for name, typefn in cls.fields.iteritems(): def getter(self, name=name): attrname = get_attrname(name) if not hasattr(self, attrname): self.obj_load_attr(name) return getattr(self, attrname) def setter(self, value, name=name, typefn=typefn): self._changed_fields.add(name) try: return setattr(self, get_attrname(name), typefn(value)) except Exception: attr = "%s.%s" % (self.obj_name(), name) LOG.exception(_('Error setting %(attr)s') % {'attr': attr}) raise setattr(cls, name, property(getter, setter)) class IronicObjectMetaclass(type): """Metaclass that allows tracking of object classes.""" # NOTE(danms): This is what controls whether object operations are # remoted. If this is not None, use it to remote things over RPC. indirection_api = None def __init__(cls, names, bases, dict_): if not hasattr(cls, '_obj_classes'): # This will be set in the 'IronicObject' class. cls._obj_classes = collections.defaultdict(list) else: # Add the subclass to IronicObject._obj_classes make_class_properties(cls) cls._obj_classes[cls.obj_name()].append(cls) # These are decorators that mark an object's method as remotable. # If the metaclass is configured to forward object methods to an # indirection service, these will result in making an RPC call # instead of directly calling the implementation in the object. Instead, # the object implementation on the remote end will perform the # requested action and the result will be returned here. def remotable_classmethod(fn): """Decorator for remotable classmethods.""" def wrapper(cls, context, *args, **kwargs): if IronicObject.indirection_api: result = IronicObject.indirection_api.object_class_action( context, cls.obj_name(), fn.__name__, cls.version, args, kwargs) else: result = fn(cls, context, *args, **kwargs) if isinstance(result, IronicObject): result._context = context return result return classmethod(wrapper) # See comment above for remotable_classmethod() # # Note that this will use either the provided context, or the one # stashed in the object. If neither are present, the object is # "orphaned" and remotable methods cannot be called. def remotable(fn): """Decorator for remotable object methods.""" def wrapper(self, *args, **kwargs): ctxt = self._context try: if isinstance(args[0], (context.RequestContext, rpc_common.CommonRpcContext)): ctxt = args[0] args = args[1:] except IndexError: pass if ctxt is None: raise exception.OrphanedObjectError(method=fn.__name__, objtype=self.obj_name()) if IronicObject.indirection_api: updates, result = IronicObject.indirection_api.object_action( ctxt, self, fn.__name__, args, kwargs) for key, value in updates.iteritems(): if key in self.fields: self[key] = self._attr_from_primitive(key, value) self._changed_fields = set(updates.get('obj_what_changed', [])) return result else: return fn(self, ctxt, *args, **kwargs) return wrapper # Object versioning rules # # Each service has its set of objects, each with a version attached. When # a client attempts to call an object method, the server checks to see if # the version of that object matches (in a compatible way) its object # implementation. If so, cool, and if not, fail. def check_object_version(server, client): try: client_major, _client_minor = client.split('.') server_major, _server_minor = server.split('.') client_minor = int(_client_minor) server_minor = int(_server_minor) except ValueError: raise exception.IncompatibleObjectVersion( _('Invalid version string')) if client_major != server_major: raise exception.IncompatibleObjectVersion( dict(client=client_major, server=server_major)) if client_minor > server_minor: raise exception.IncompatibleObjectVersion( dict(client=client_minor, server=server_minor)) @six.add_metaclass(IronicObjectMetaclass) class IronicObject(object): """Base class and object factory. This forms the base of all objects that can be remoted or instantiated via RPC. Simply defining a class that inherits from this base class will make it remotely instantiatable. Objects should implement the necessary "get" classmethod routines as well as "save" object methods as appropriate. """ # Version of this object (see rules above check_object_version()) version = '1.0' # The fields present in this object as key:typefn pairs. For example: # # fields = { 'foo': int, # 'bar': str, # 'baz': lambda x: str(x).ljust(8), # } # # NOTE(danms): The base IronicObject class' fields will be inherited # by subclasses, but that is a special case. Objects inheriting from # other objects will not receive this merging of fields contents. fields = { 'created_at': obj_utils.datetime_or_str_or_none, 'updated_at': obj_utils.datetime_or_str_or_none, } obj_extra_fields = [] def __init__(self): self._changed_fields = set() self._context = None @classmethod def obj_name(cls): """Return a canonical name for this object which will be used over the wire for remote hydration. """ return cls.__name__ @classmethod def obj_class_from_name(cls, objname, objver): """Returns a class from the registry based on a name and version.""" if objname not in cls._obj_classes: LOG.error(_('Unable to instantiate unregistered object type ' '%(objtype)s') % dict(objtype=objname)) raise exception.UnsupportedObjectError(objtype=objname) compatible_match = None for objclass in cls._obj_classes[objname]: if objclass.version == objver: return objclass try: check_object_version(objclass.version, objver) compatible_match = objclass except exception.IncompatibleObjectVersion: pass if compatible_match: return compatible_match raise exception.IncompatibleObjectVersion(objname=objname, objver=objver) _attr_created_at_from_primitive = obj_utils.dt_deserializer _attr_updated_at_from_primitive = obj_utils.dt_deserializer def _attr_from_primitive(self, attribute, value): """Attribute deserialization dispatcher. This calls self._attr_foo_from_primitive(value) for an attribute foo with value, if it exists, otherwise it assumes the value is suitable for the attribute's setter method. """ handler = '_attr_%s_from_primitive' % attribute if hasattr(self, handler): return getattr(self, handler)(value) return value @classmethod def obj_from_primitive(cls, primitive, context=None): """Simple base-case hydration. This calls self._attr_from_primitive() for each item in fields. """ if primitive['ironic_object.namespace'] != 'ironic': # NOTE(danms): We don't do anything with this now, but it's # there for "the future" raise exception.UnsupportedObjectError( objtype='%s.%s' % (primitive['ironic_object.namespace'], primitive['ironic_object.name'])) objname = primitive['ironic_object.name'] objver = primitive['ironic_object.version'] objdata = primitive['ironic_object.data'] objclass = cls.obj_class_from_name(objname, objver) self = objclass() self._context = context for name in self.fields: if name in objdata: setattr(self, name, self._attr_from_primitive(name, objdata[name])) changes = primitive.get('ironic_object.changes', []) self._changed_fields = set([x for x in changes if x in self.fields]) return self _attr_created_at_to_primitive = obj_utils.dt_serializer('created_at') _attr_updated_at_to_primitive = obj_utils.dt_serializer('updated_at') def _attr_to_primitive(self, attribute): """Attribute serialization dispatcher. This calls self._attr_foo_to_primitive() for an attribute foo, if it exists, otherwise it assumes the attribute itself is primitive-enough to be sent over the RPC wire. """ handler = '_attr_%s_to_primitive' % attribute if hasattr(self, handler): return getattr(self, handler)() else: return getattr(self, attribute) def obj_to_primitive(self): """Simple base-case dehydration. This calls self._attr_to_primitive() for each item in fields. """ primitive = dict() for name in self.fields: if hasattr(self, get_attrname(name)): primitive[name] = self._attr_to_primitive(name) obj = {'ironic_object.name': self.obj_name(), 'ironic_object.namespace': 'ironic', 'ironic_object.version': self.version, 'ironic_object.data': primitive} if self.obj_what_changed(): obj['ironic_object.changes'] = list(self.obj_what_changed()) return obj def obj_load_attr(self, attrname): """Load an additional attribute from the real object. This should use self._conductor, and cache any data that might be useful for future load operations. """ raise NotImplementedError( _("Cannot load '%(attrname)s' in the base class") % {'attrname': attrname}) def save(self, context): """Save the changed fields back to the store. This is optional for subclasses, but is presented here in the base class for consistency among those that do. """ raise NotImplementedError(_("Cannot save anything in the base class")) def obj_get_changes(self): """Returns a dict of changed fields and their new values.""" changes = {} for key in self.obj_what_changed(): changes[key] = self[key] return changes def obj_what_changed(self): """Returns a set of fields that have been modified.""" return self._changed_fields def obj_reset_changes(self, fields=None): """Reset the list of fields that have been changed. Note that this is NOT "revert to previous values" """ if fields: self._changed_fields -= set(fields) else: self._changed_fields.clear() # dictish syntactic sugar def iteritems(self): """For backwards-compatibility with dict-based objects. NOTE(danms): May be removed in the future. """ for name in self.fields.keys() + self.obj_extra_fields: if (hasattr(self, get_attrname(name)) or name in self.obj_extra_fields): yield name, getattr(self, name) items = lambda self: list(self.iteritems()) def __getitem__(self, name): """For backwards-compatibility with dict-based objects. NOTE(danms): May be removed in the future. """ return getattr(self, name) def __setitem__(self, name, value): """For backwards-compatibility with dict-based objects. NOTE(danms): May be removed in the future. """ setattr(self, name, value) def __contains__(self, name): """For backwards-compatibility with dict-based objects. NOTE(danms): May be removed in the future. """ return hasattr(self, get_attrname(name)) def get(self, key, value=None): """For backwards-compatibility with dict-based objects. NOTE(danms): May be removed in the future. """ return self[key] def update(self, updates): """For backwards-compatibility with dict-base objects. NOTE(danms): May be removed in the future. """ for key, value in updates.items(): self[key] = value def as_dict(self): return dict((k, getattr(self, k)) for k in self.fields if hasattr(self, k)) class ObjectListBase(object): """Mixin class for lists of objects. This mixin class can be added as a base class for an object that is implementing a list of objects. It adds a single field of 'objects', which is the list store, and behaves like a list itself. It supports serialization of the list of objects automatically. """ fields = { 'objects': list, } def __iter__(self): """List iterator interface.""" return iter(self.objects) def __len__(self): """List length.""" return len(self.objects) def __getitem__(self, index): """List index access.""" if isinstance(index, slice): new_obj = self.__class__() new_obj.objects = self.objects[index] # NOTE(danms): We must be mixed in with an IronicObject! new_obj.obj_reset_changes() new_obj._context = self._context return new_obj return self.objects[index] def __contains__(self, value): """List membership test.""" return value in self.objects def count(self, value): """List count of value occurrences.""" return self.objects.count(value) def index(self, value): """List index of value.""" return self.objects.index(value) def _attr_objects_to_primitive(self): """Serialization of object list.""" return [x.obj_to_primitive() for x in self.objects] def _attr_objects_from_primitive(self, value): """Deserialization of object list.""" objects = [] for entity in value: obj = IronicObject.obj_from_primitive(entity, context=self._context) objects.append(obj) return objects class IronicObjectSerializer(rpc_serializer.Serializer): """A IronicObject-aware Serializer. This implements the Oslo Serializer interface and provides the ability to serialize and deserialize IronicObject entities. Any service that needs to accept or return IronicObjects as arguments or result values should pass this to its RpcProxy and RpcDispatcher objects. """ def _process_iterable(self, context, action_fn, values): """Process an iterable, taking an action on each value. :param:context: Request context :param:action_fn: Action to take on each item in values :param:values: Iterable container of things to take action on :returns: A new container of the same type (except set) with items from values having had action applied. """ iterable = values.__class__ if iterable == set: # NOTE(danms): A set can't have an unhashable value inside, such as # a dict. Convert sets to tuples, which is fine, since we can't # send them over RPC anyway. iterable = tuple return iterable([action_fn(context, value) for value in values]) def serialize_entity(self, context, entity): if isinstance(entity, (tuple, list, set)): entity = self._process_iterable(context, self.serialize_entity, entity) elif (hasattr(entity, 'obj_to_primitive') and callable(entity.obj_to_primitive)): entity = entity.obj_to_primitive() return entity def deserialize_entity(self, context, entity): if isinstance(entity, dict) and 'ironic_object.name' in entity: entity = IronicObject.obj_from_primitive(entity, context=context) elif isinstance(entity, (tuple, list, set)): entity = self._process_iterable(context, self.deserialize_entity, entity) return entity def obj_to_primitive(obj): """Recursively turn an object into a python primitive. An IronicObject becomes a dict, and anything that implements ObjectListBase becomes a list. """ if isinstance(obj, ObjectListBase): return [obj_to_primitive(x) for x in obj] elif isinstance(obj, IronicObject): result = {} for key, value in obj.iteritems(): result[key] = obj_to_primitive(value) return result else: return obj ironic-2014.1.rc1/ironic/objects/utils.py0000664000175300017540000000707212316614116021342 0ustar jenkinsjenkins00000000000000# Copyright 2013 IBM Corp. # # 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. """Utility methods for objects""" import ast import datetime import iso8601 import netaddr import six from ironic.openstack.common import timeutils def datetime_or_none(dt): """Validate a datetime or None value.""" if dt is None: return None elif isinstance(dt, datetime.datetime): if dt.utcoffset() is None: # NOTE(danms): Legacy objects from sqlalchemy are stored in UTC, # but are returned without a timezone attached. # As a transitional aid, assume a tz-naive object is in UTC. return dt.replace(tzinfo=iso8601.iso8601.Utc()) else: return dt raise ValueError(_("A datetime.datetime is required here")) def datetime_or_str_or_none(val): if isinstance(val, six.string_types): return timeutils.parse_isotime(val) return datetime_or_none(val) def int_or_none(val): """Attempt to parse an integer value, or None.""" if val is None: return val else: return int(val) def str_or_none(val): """Attempt to stringify a value to unicode, or None.""" if val is None: return val else: return six.text_type(val) def dict_or_none(val): """Attempt to dictify a value, or None.""" if val is None: return {} elif isinstance(val, six.string_types): return dict(ast.literal_eval(val)) else: try: return dict(val) except ValueError: return {} def list_or_none(val): """Attempt to listify a value, or None.""" if val is None: return [] elif isinstance(val, six.string_types): return list(ast.literal_eval(val)) else: try: return list(val) except ValueError: return [] def ip_or_none(version): """Return a version-specific IP address validator.""" def validator(val, version=version): if val is None: return val else: return netaddr.IPAddress(val, version=version) return validator def nested_object_or_none(objclass): def validator(val, objclass=objclass): if val is None or isinstance(val, objclass): return val raise ValueError(_("An object of class %s is required here") % objclass) return validator def dt_serializer(name): """Return a datetime serializer for a named attribute.""" def serializer(self, name=name): if getattr(self, name) is not None: return timeutils.isotime(getattr(self, name)) else: return None return serializer def dt_deserializer(instance, val): """A deserializer method for datetime attributes.""" if val is None: return None else: return timeutils.parse_isotime(val) def obj_serializer(name): def serializer(self, name=name): if getattr(self, name) is not None: return getattr(self, name).obj_to_primitive() else: return None return serializer ironic-2014.1.rc1/ironic/objects/node.py0000664000175300017540000000640612316614116021127 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. from ironic.db import api as db_api from ironic.objects import base from ironic.objects import utils class Node(base.IronicObject): dbapi = db_api.get_instance() fields = { 'id': int, 'uuid': utils.str_or_none, 'chassis_id': utils.int_or_none, 'instance_uuid': utils.str_or_none, 'driver': utils.str_or_none, 'driver_info': utils.dict_or_none, 'properties': utils.dict_or_none, 'reservation': utils.str_or_none, # One of states.POWER_ON|POWER_OFF|NOSTATE|ERROR 'power_state': utils.str_or_none, # Set to one of states.POWER_ON|POWER_OFF when a power operation # starts, and set to NOSTATE when the operation finishes # (successfully or unsuccessfully). 'target_power_state': utils.str_or_none, 'provision_state': utils.str_or_none, 'provision_updated_at': utils.datetime_or_str_or_none, 'target_provision_state': utils.str_or_none, 'maintenance': bool, 'console_enabled': bool, # Any error from the most recent (last) asynchronous transaction # that started but failed to finish. 'last_error': utils.str_or_none, 'extra': utils.dict_or_none, } @staticmethod def _from_db_object(node, db_node): """Converts a database entity to a formal object.""" for field in node.fields: node[field] = db_node[field] node.obj_reset_changes() return node @base.remotable_classmethod def get_by_uuid(cls, context, uuid): """Find a node based on uuid and return a Node object. :param uuid: the uuid of a node. :returns: a :class:`Node` object. """ db_node = cls.dbapi.get_node(uuid) return Node._from_db_object(cls(), db_node) @base.remotable def save(self, context): """Save updates to this Node. Column-wise updates will be made based on the result of self.what_changed(). If target_power_state is provided, it will be checked against the in-database copy of the node before updates are made. :param context: Security context """ updates = self.obj_get_changes() self.dbapi.update_node(self.uuid, updates) self.obj_reset_changes() @base.remotable def refresh(self, context): current = self.__class__.get_by_uuid(context, uuid=self.uuid) for field in self.fields: if (hasattr(self, base.get_attrname(field)) and self[field] != current[field]): self[field] = current[field] ironic-2014.1.rc1/ironic/objects/chassis.py0000664000175300017540000000533112316614116021633 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. from ironic.db import api as dbapi from ironic.objects import base from ironic.objects import utils class Chassis(base.IronicObject): dbapi = dbapi.get_instance() fields = { 'id': int, 'uuid': utils.str_or_none, 'extra': utils.dict_or_none, 'description': utils.str_or_none, } @staticmethod def _from_db_object(chassis, db_chassis): """Converts a database entity to a formal :class:`Chassis` object. :param chassis: An object of :class:`Chassis`. :param db_chassis: A DB model of a chassis. :return: a :class:`Chassis` object. """ for field in chassis.fields: chassis[field] = db_chassis[field] chassis.obj_reset_changes() return chassis @base.remotable_classmethod def get_by_uuid(cls, context, uuid=None): """Find a chassis based on uuid and return a :class:`Chassis` object. :param uuid: the uuid of a chassis. :param context: Security context :returns: a :class:`Chassis` object. """ db_chassis = cls.dbapi.get_chassis(uuid) return Chassis._from_db_object(cls(), db_chassis) @base.remotable def save(self, context): """Save updates to this Chassis. Updates will be made column by column based on the result of self.what_changed(). :param context: Security context """ updates = self.obj_get_changes() self.dbapi.update_chassis(self.uuid, updates) self.obj_reset_changes() @base.remotable def refresh(self, context): """Loads and applies updates for this Chassis. Loads a :class:`Chassis` with the same uuid from the database and checks for updated attributes. Updates are applied from the loaded chassis column by column, if there are any updates. :param context: Security context """ current = self.__class__.get_by_uuid(context, uuid=self.uuid) for field in self.fields: if (hasattr(self, base.get_attrname(field)) and self[field] != current[field]): self[field] = current[field] ironic-2014.1.rc1/ironic/objects/port.py0000664000175300017540000000470312316614116021164 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. from ironic.db import api as dbapi from ironic.objects import base from ironic.objects import utils class Port(base.IronicObject): dbapi = dbapi.get_instance() fields = { 'id': int, 'uuid': utils.str_or_none, 'node_id': utils.int_or_none, 'address': utils.str_or_none, 'extra': utils.dict_or_none, } @staticmethod def _from_db_object(port, db_port): """Converts a database entity to a formal object.""" for field in port.fields: port[field] = db_port[field] port.obj_reset_changes() return port @base.remotable_classmethod def get_by_uuid(cls, context, uuid=None): """Find a port based on uuid and return a Port object. :param uuid: the uuid of a port. :returns: a :class:`Port` object. """ db_port = cls.dbapi.get_port(uuid) return Port._from_db_object(cls(), db_port) @base.remotable def save(self, context): """Save updates to this Port. Updates will be made column by column based on the result of self.what_changed(). :param context: Security context """ updates = self.obj_get_changes() self.dbapi.update_port(self.uuid, updates) self.obj_reset_changes() @base.remotable def refresh(self, context): """Loads updates for this Port. Loads a port with the same uuid from the database and checks for updated attributes. Updates are applied from the loaded port column by column, if there are any updates. :param context: Security context """ current = self.__class__.get_by_uuid(context, uuid=self.uuid) for field in self.fields: if (hasattr(self, base.get_attrname(field)) and self[field] != current[field]): self[field] = current[field] ironic-2014.1.rc1/ironic/objects/__init__.py0000664000175300017540000000302312316614116021731 0ustar jenkinsjenkins00000000000000# Copyright 2013 IBM Corp. # # 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 ironic.objects import chassis from ironic.objects import conductor from ironic.objects import node from ironic.objects import port def objectify(klass): """Decorator to convert database results into specified objects.""" def the_decorator(fn): @functools.wraps(fn) def wrapper(*args, **kwargs): result = fn(*args, **kwargs) try: return klass._from_db_object(klass(), result) except TypeError: # TODO(deva): handle lists of objects better # once support for those lands and is imported. return [klass._from_db_object(klass(), obj) for obj in result] return wrapper return the_decorator Chassis = chassis.Chassis Conductor = conductor.Conductor Node = node.Node Port = port.Port __all__ = (Chassis, Conductor, Node, Port, objectify) ironic-2014.1.rc1/ironic/objects/conductor.py0000664000175300017540000000443012316614116022175 0ustar jenkinsjenkins00000000000000# coding=utf-8 # # Copyright 2013 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 ironic.db import api as db_api from ironic.objects import base from ironic.objects import utils class Conductor(base.IronicObject): dbapi = db_api.get_instance() fields = { 'id': int, 'drivers': utils.list_or_none, 'hostname': str, } @staticmethod def _from_db_object(conductor, db_obj): """Converts a database entity to a formal object.""" for field in conductor.fields: conductor[field] = db_obj[field] conductor.obj_reset_changes() return conductor @base.remotable_classmethod def get_by_hostname(cls, context, hostname): """Get a Conductor record by its hostname. :param hostname: the hostname on which a Conductor is running :returns: a :class:`Conductor` object. """ db_obj = cls.dbapi.get_conductor(hostname) return Conductor._from_db_object(cls(), db_obj) def save(self, context): """Save is not supported by Conductor objects.""" raise NotImplementedError( _('Cannot update a conductor record directly.')) @base.remotable def refresh(self, context): current = self.__class__.get_by_hostname(context, hostname=self.hostname) for field in self.fields: if (hasattr(self, base.get_attrname(field)) and self[field] != current[field]): self[field] = current[field] @base.remotable def touch(self, context): """Touch this conductor's DB record, marking it as up-to-date.""" self.dbapi.touch_conductor(self.hostname) ironic-2014.1.rc1/ironic/conductor/0000775000175300017540000000000012316614636020200 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/conductor/manager.py0000664000175300017540000011444212316614116022163 0ustar jenkinsjenkins00000000000000# coding=utf-8 # Copyright 2013 Hewlett-Packard Development Company, L.P. # Copyright 2013 International Business Machines 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. """Conduct all activity related to bare-metal deployments. A single instance of :py:class:`ironic.conductor.manager.ConductorManager` is created within the *ironic-conductor* process, and is responsible for performing all actions on bare metal resources (Chassis, Nodes, and Ports). Commands are received via RPC calls. The conductor service also performs periodic tasks, eg. to monitor the status of active deployments. Drivers are loaded via entrypoints by the :py:class:`ironic.common.driver_factory` class. Each driver is instantiated only once, when the ConductorManager service starts. In this way, a single ConductorManager may use multiple drivers, and manage heterogeneous hardware. When multiple :py:class:`ConductorManager` are run on different hosts, they are all active and cooperatively manage all nodes in the deployment. Nodes are locked by each conductor when performing actions which change the state of that node; these locks are represented by the :py:class:`ironic.conductor.task_manager.TaskManager` class. A :py:class:`ironic.common.hash_ring.HashRing` is used to distribute nodes across the set of active conductors which support each node's driver. Rebalancing this ring can trigger various actions by each conductor, such as building or tearing down the TFTP environment for a node, notifying Neutron of a change, etc. """ import collections import datetime from eventlet import greenpool from oslo.config import cfg from ironic.common import driver_factory from ironic.common import exception from ironic.common import hash_ring as hash from ironic.common import neutron from ironic.common import service from ironic.common import states from ironic.conductor import task_manager from ironic.conductor import utils from ironic.db import api as dbapi from ironic.objects import base as objects_base from ironic.openstack.common import excutils from ironic.openstack.common import lockutils from ironic.openstack.common import log from ironic.openstack.common import periodic_task from ironic.openstack.common.rpc import common as messaging from ironic.openstack.common import timeutils MANAGER_TOPIC = 'ironic.conductor_manager' WORKER_SPAWN_lOCK = "conductor_worker_spawn" LOG = log.getLogger(__name__) conductor_opts = [ cfg.StrOpt('api_url', default=None, help=('URL of Ironic API service. If not set ironic can ' 'get the current value from the keystone service ' 'catalog.')), cfg.IntOpt('heartbeat_interval', default=10, help='Seconds between conductor heart beats.'), cfg.IntOpt('heartbeat_timeout', default=60, help='Maximum time (in seconds) since the last check-in ' 'of a conductor.'), cfg.IntOpt('sync_power_state_interval', default=60, help='Interval between syncing the node power state to the ' 'database, in seconds.'), cfg.IntOpt('check_provision_state_interval', default=60, help='Interval between checks of provision timeouts, ' 'in seconds.'), cfg.IntOpt('deploy_callback_timeout', default=1800, help='Timeout (seconds) for waiting callback from deploy ' 'ramdisk. 0 - unlimited.'), cfg.BoolOpt('force_power_state_during_sync', default=True, help='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).'), cfg.IntOpt('power_state_sync_max_retries', default=3, help='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') ] CONF = cfg.CONF CONF.register_opts(conductor_opts, 'conductor') class ConductorManager(service.PeriodicService): """Ironic Conductor service main class.""" RPC_API_VERSION = '1.13' def __init__(self, host, topic): serializer = objects_base.IronicObjectSerializer() super(ConductorManager, self).__init__(host, topic, serializer=serializer) self.power_state_sync_count = collections.defaultdict(int) def start(self): super(ConductorManager, self).start() self.dbapi = dbapi.get_instance() # create a DriverFactory instance, which initializes the stevedore # extension manager, when the service starts. # TODO(deva): Enable re-loading of the DriverFactory to load new # extensions without restarting the whole service. df = driver_factory.DriverFactory() self.drivers = df.names """List of driver names which this conductor supports.""" try: self.dbapi.register_conductor({'hostname': self.host, 'drivers': self.drivers}) except exception.ConductorAlreadyRegistered: LOG.warn(_("A conductor with hostname %(hostname)s " "was previously registered. Updating registration") % {'hostname': self.host}) self.dbapi.unregister_conductor(self.host) self.dbapi.register_conductor({'hostname': self.host, 'drivers': self.drivers}) self.driver_rings = self._get_current_driver_rings() """Consistent hash ring which maps drivers to conductors.""" self._worker_pool = greenpool.GreenPool(size=CONF.rpc_thread_pool_size) """GreenPool of background workers for performing tasks async.""" def stop(self): self.dbapi.unregister_conductor(self.host) super(ConductorManager, self).stop() def initialize_service_hook(self, service): pass def process_notification(self, notification): LOG.debug(_('Received notification: %r') % notification.get('event_type')) # TODO(deva) def periodic_tasks(self, context, raise_on_error=False): """Periodic tasks are run at pre-specified interval.""" return self.run_periodic_tasks(context, raise_on_error=raise_on_error) @messaging.client_exceptions(exception.InvalidParameterValue, exception.NodeLocked, exception.NodeInWrongPowerState) def update_node(self, context, node_obj): """Update a node with the supplied data. This method is the main "hub" for PUT and PATCH requests in the API. It ensures that the requested change is safe to perform, validates the parameters with the node's driver, if necessary. :param context: an admin context :param node_obj: a changed (but not saved) node object. """ node_id = node_obj.uuid LOG.debug(_("RPC update_node called for node %s.") % node_id) delta = node_obj.obj_what_changed() if 'power_state' in delta: raise exception.IronicException(_( "Invalid method call: update_node can not change node state.")) driver_name = node_obj.get('driver') if 'driver' in delta else None with task_manager.acquire(context, node_id, shared=False, driver_name=driver_name) as task: # TODO(deva): Determine what value will be passed by API when # instance_uuid needs to be unset, and handle it. if 'instance_uuid' in delta: task.driver.power.validate(task, node_obj) node_obj['power_state'] = \ task.driver.power.get_power_state(task, node_obj) if node_obj['power_state'] != states.POWER_OFF: raise exception.NodeInWrongPowerState( node=node_id, pstate=node_obj['power_state']) # update any remaining parameters, then save node_obj.save(context) return node_obj @messaging.client_exceptions(exception.NoFreeConductorWorker, exception.NodeLocked) def change_node_power_state(self, context, node_id, new_state): """RPC method to encapsulate changes to a node's state. Perform actions such as power on, power off. The validation and power action are performed in background (async). Once the power action is finished and successful, it updates the power_state for the node with the new power state. :param context: an admin context. :param node_id: the id or uuid of a node. :param new_state: the desired power state of the node. :raises: NoFreeConductorWorker when there is no free worker to start async task. """ LOG.debug(_("RPC change_node_power_state called for node %(node)s. " "The desired new state is %(state)s.") % {'node': node_id, 'state': new_state}) task = task_manager.TaskManager(context, node_id, shared=False) try: # Start requested action in the background. thread = self._spawn_worker(utils.node_power_action, task, task.node, new_state) # Release node lock at the end. thread.link(lambda t: task.release_resources()) except Exception: with excutils.save_and_reraise_exception(): # Release node lock if error occurred. task.release_resources() @messaging.client_exceptions(exception.NoFreeConductorWorker, exception.NodeLocked, exception.InvalidParameterValue, exception.UnsupportedDriverExtension) def vendor_passthru(self, context, node_id, driver_method, info): """RPC method to encapsulate vendor action. Synchronously validate driver specific info or get driver status, and if successful, start background worker to perform vendor action asynchronously. :param context: an admin context. :param node_id: the id or uuid of a node. :param driver_method: the name of the vendor method. :param info: vendor method args. :raises: InvalidParameterValue if supplied info is not valid. :raises: UnsupportedDriverExtension if current driver does not have vendor interface or method is unsupported. :raises: NoFreeConductorWorker when there is no free worker to start async task. """ LOG.debug(_("RPC vendor_passthru called for node %s.") % node_id) # NOTE(max_lobur): Even though not all vendor_passthru calls may # require an exclusive lock, we need to do so to guarantee that the # state doesn't unexpectedly change between doing a vendor.validate # and vendor.vendor_passthru. task = task_manager.TaskManager(context, node_id, shared=False) try: if not getattr(task.driver, 'vendor', None): raise exception.UnsupportedDriverExtension( driver=task.node.driver, extension='vendor passthru') task.driver.vendor.validate(task, task.node, method=driver_method, **info) # Start requested action in the background. thread = self._spawn_worker(task.driver.vendor.vendor_passthru, task, task.node, method=driver_method, **info) # Release node lock at the end of async action. thread.link(lambda t: task.release_resources()) except Exception: with excutils.save_and_reraise_exception(): # Release node lock if error occurred. task.release_resources() @messaging.client_exceptions(exception.NoFreeConductorWorker, exception.NodeLocked, exception.NodeInMaintenance, exception.InstanceDeployFailure) def do_node_deploy(self, context, node_id): """RPC method to initiate deployment to a node. Initiate the deployment of a node. Validations are done synchronously and the actual deploy work is performed in background (asynchronously). :param context: an admin context. :param node_id: the id or uuid of a node. :raises: InstanceDeployFailure :raises: NodeInMaintenance if the node is in maintenance mode. :raises: NoFreeConductorWorker when there is no free worker to start async task. """ LOG.debug(_("RPC do_node_deploy called for node %s.") % node_id) task = task_manager.TaskManager(context, node_id, shared=False) node = task.node try: if node.provision_state is not states.NOSTATE: raise exception.InstanceDeployFailure(_( "RPC do_node_deploy called for %(node)s, but provision " "state is already %(state)s.") % {'node': node.uuid, 'state': node.provision_state}) if node.maintenance: raise exception.NodeInMaintenance(op=_('provisioning'), node=node.uuid) try: task.driver.deploy.validate(task, node) except exception.InvalidParameterValue as e: raise exception.InstanceDeployFailure(_( "RPC do_node_deploy failed to validate deploy info. " "Error: %(msg)s") % {'msg': e}) # Set target state to expose that work is in progress node.provision_state = states.DEPLOYING node.target_provision_state = states.DEPLOYDONE node.last_error = None node.save(context) # Start requested action in the background. thread = self._spawn_worker(self._do_node_deploy, context, task) # Release node lock at the end. thread.link(lambda t: task.release_resources()) except Exception: with excutils.save_and_reraise_exception(): # Release node lock if error occurred. task.release_resources() def _do_node_deploy(self, context, task): """Prepare the environment and deploy a node.""" node = task.node try: task.driver.deploy.prepare(task, node) new_state = task.driver.deploy.deploy(task, node) except Exception as e: with excutils.save_and_reraise_exception(): node.last_error = _("Failed to deploy. Error: %s") % e node.provision_state = states.DEPLOYFAIL node.target_provision_state = states.NOSTATE else: # NOTE(deva): Some drivers may return states.DEPLOYWAIT # eg. if they are waiting for a callback if new_state == states.DEPLOYDONE: node.target_provision_state = states.NOSTATE node.provision_state = states.ACTIVE else: node.provision_state = new_state finally: node.save(context) @messaging.client_exceptions(exception.NoFreeConductorWorker, exception.NodeLocked, exception.InstanceDeployFailure) def do_node_tear_down(self, context, node_id): """RPC method to tear down an existing node deployment. Validate driver specific information synchronously, and then spawn a background worker to tear down the node asynchronously. :param context: an admin context. :param node_id: the id or uuid of a node. :raises: InstanceDeployFailure :raises: NoFreeConductorWorker when there is no free worker to start async task """ LOG.debug(_("RPC do_node_tear_down called for node %s.") % node_id) task = task_manager.TaskManager(context, node_id, shared=False) node = task.node try: if node.provision_state not in [states.ACTIVE, states.DEPLOYFAIL, states.ERROR, states.DEPLOYWAIT]: raise exception.InstanceDeployFailure(_( "RPC do_node_tear_down " "not allowed for node %(node)s in state %(state)s") % {'node': node_id, 'state': node.provision_state}) try: task.driver.deploy.validate(task, node) except exception.InvalidParameterValue as e: raise exception.InstanceDeployFailure(_( "RPC do_node_tear_down failed to validate deploy info. " "Error: %(msg)s") % {'msg': e}) node.provision_state = states.DELETING node.target_provision_state = states.DELETED node.last_error = None node.save(context) # Start requested action in the background. thread = self._spawn_worker(self._do_node_tear_down, context, task) # Release node lock at the end. thread.link(lambda t: task.release_resources()) except Exception: with excutils.save_and_reraise_exception(): # Release node lock if error occurred. task.release_resources() def _do_node_tear_down(self, context, task): """Internal RPC method to tear down an existing node deployment.""" node = task.node try: task.driver.deploy.clean_up(task, node) new_state = task.driver.deploy.tear_down(task, node) except Exception as e: with excutils.save_and_reraise_exception(): node.last_error = _("Failed to tear down. Error: %s") % e node.provision_state = states.ERROR node.target_provision_state = states.NOSTATE else: # NOTE(deva): Some drivers may return states.DELETING # eg. if they are waiting for a callback if new_state == states.DELETED: node.target_provision_state = states.NOSTATE node.provision_state = states.NOSTATE else: node.provision_state = new_state finally: node.save(context) @periodic_task.periodic_task(spacing=CONF.conductor.heartbeat_interval) def _conductor_service_record_keepalive(self, context): self.dbapi.touch_conductor(self.host) def _handle_sync_power_state_max_retries_exceeded(self, task, actual_power_state): node = task.node msg = (_("During sync_power_state, max retries exceeded " "for node %(node)s, node state %(actual)s " "does not match expected state '%(state)s'. " "Updating DB state to '%(actual)s' " "Switching node to maintenance mode."), {'node': node.uuid, 'actual': actual_power_state, 'state': node.power_state}) node.power_state = actual_power_state node.last_error = msg node.maintenance = True node.save(task.context) LOG.error(msg) def _do_sync_power_state(self, task): node = task.node power_state = None try: power_state = task.driver.power.get_power_state(task, node) except Exception as e: # TODO(rloo): change to IronicException, after # https://bugs.launchpad.net/ironic/+bug/1267693 LOG.warning(_("During sync_power_state, could not get power " "state for node %(node)s. Error: %(err)s."), {'node': node.uuid, 'err': e}) self.power_state_sync_count[node.uuid] += 1 if (self.power_state_sync_count[node.uuid] >= CONF.conductor.power_state_sync_max_retries): self._handle_sync_power_state_max_retries_exceeded(task, power_state) return if node.power_state is None: LOG.info(_("During sync_power_state, node %(node)s has no " "previous known state. Recording current state " "'%(state)s'."), {'node': node.uuid, 'state': power_state}) node.power_state = power_state node.save(task.context) if power_state == node.power_state: if node.uuid in self.power_state_sync_count: del self.power_state_sync_count[node.uuid] return if not CONF.conductor.force_power_state_during_sync: LOG.warning(_("During sync_power_state, node %(node)s state " "does not match expected state '%(state)s'. " "Updating recorded state to '%(actual)s'."), {'node': node.uuid, 'actual': power_state, 'state': node.power_state}) node.power_state = power_state node.save(task.context) return if (self.power_state_sync_count[node.uuid] >= CONF.conductor.power_state_sync_max_retries): self._handle_sync_power_state_max_retries_exceeded(task, power_state) return # Force actual power_state of node equal to DB power_state of node LOG.warning(_("During sync_power_state, node %(node)s state " "'%(actual)s' does not match expected state. " "Changing hardware state to '%(state)s'."), {'node': node.uuid, 'actual': power_state, 'state': node.power_state}) try: # node_power_action will update the node record # so don't do that again here. utils.node_power_action(task, task.node, node.power_state) except Exception as e: # TODO(rloo): change to IronicException after # https://bugs.launchpad.net/ironic/+bug/1267693 LOG.error(_("Failed to change power state of node %(node)s " "to '%(state)s'."), {'node': node.uuid, 'state': node.power_state}) attempts_left = (CONF.conductor.power_state_sync_max_retries - self.power_state_sync_count[node.uuid]) - 1 msg = (_("%(left)s attempts remaining to " "sync_power_state for node %(node)s"), {'left': attempts_left, 'node': node.uuid}) LOG.warning(msg) finally: # Update power state sync count for current node self.power_state_sync_count[node.uuid] += 1 @periodic_task.periodic_task( spacing=CONF.conductor.sync_power_state_interval) def _sync_power_states(self, context): filters = {'reserved': False, 'maintenance': False} columns = ['id', 'uuid', 'driver'] node_list = self.dbapi.get_nodeinfo_list(columns=columns, filters=filters) for (node_id, node_uuid, driver) in node_list: # only sync power states for nodes mapped to this conductor mapped_hosts = self.driver_rings[driver].get_hosts(node_uuid) if self.host not in mapped_hosts: continue try: # prevent nodes in DEPLOYWAIT state from locking node = self.dbapi.get_node(node_uuid) if node.provision_state == states.DEPLOYWAIT: continue with task_manager.acquire(context, node_id) as task: self._do_sync_power_state(task) except exception.NodeNotFound: LOG.info(_("During sync_power_state, node %(node)s was not " "found and presumed deleted by another process.") % {'node': node_uuid}) continue except exception.NodeLocked: LOG.info(_("During sync_power_state, node %(node)s was " "already locked by another process. Skip.") % {'node': node_uuid}) continue @periodic_task.periodic_task( spacing=CONF.conductor.check_provision_state_interval) def _check_deploy_timeouts(self, context): if not CONF.conductor.deploy_callback_timeout: return filters = {'reserved': False, 'maintenance': False} columns = ['uuid', 'driver', 'provision_state', 'provision_updated_at'] node_list = self.dbapi.get_nodeinfo_list(columns=columns, filters=filters) for (node_uuid, driver, state, update_time) in node_list: mapped_hosts = self.driver_rings[driver].get_hosts(node_uuid) if self.host not in mapped_hosts: continue if state == states.DEPLOYWAIT: limit = (timeutils.utcnow() - datetime.timedelta( seconds=CONF.conductor.deploy_callback_timeout)) if timeutils.normalize_time(update_time) <= limit: try: task = task_manager.TaskManager(context, node_uuid) except (exception.NodeLocked, exception.NodeNotFound): continue node = task.node node.provision_state = states.DEPLOYFAIL node.target_provision_state = states.NOSTATE msg = (_('Timeout reached when waiting callback for ' 'node %s') % node_uuid) node.last_error = msg LOG.error(msg) node.save(task.context) try: thread = self._spawn_worker( utils.cleanup_after_timeout, task) thread.link(lambda t: task.release_resources()) except exception.NoFreeConductorWorker: task.release_resources() def _get_current_driver_rings(self): """Build the current hash ring for this ConductorManager's drivers.""" ring = {} d2c = self.dbapi.get_active_driver_dict() for driver in self.drivers: ring[driver] = hash.HashRing(d2c[driver]) return ring def rebalance_node_ring(self): """Perform any actions necessary when rebalancing the consistent hash. This may trigger several actions, such as calling driver.deploy.prepare for nodes which are now mapped to this conductor. """ # TODO(deva): implement this pass @messaging.client_exceptions(exception.NodeLocked) def validate_driver_interfaces(self, context, node_id): """Validate the `core` and `standardized` interfaces for drivers. :param context: request context. :param node_id: node id or uuid. :returns: a dictionary containing the results of each interface validation. """ LOG.debug(_('RPC validate_driver_interfaces called for node %s.') % node_id) ret_dict = {} with task_manager.acquire(context, node_id, shared=True) as task: for iface_name in (task.driver.core_interfaces + task.driver.standard_interfaces): iface = getattr(task.driver, iface_name, None) result = reason = None if iface: try: iface.validate(task, task.node) result = True except (exception.InvalidParameterValue, exception.UnsupportedDriverExtension) as e: result = False reason = str(e) else: reason = _('not supported') ret_dict[iface_name] = {} ret_dict[iface_name]['result'] = result if reason is not None: ret_dict[iface_name]['reason'] = reason return ret_dict @messaging.client_exceptions(exception.NodeLocked, exception.NodeMaintenanceFailure) def change_node_maintenance_mode(self, context, node_id, mode): """Set node maintenance mode on or off. :param context: request context. :param node_id: node id or uuid. :param mode: True or False. :raises: NodeMaintenanceFailure """ LOG.debug(_("RPC change_node_maintenance_mode called for node %(node)s" " with maintanence mode: %(mode)s") % {'node': node_id, 'mode': mode}) with task_manager.acquire(context, node_id, shared=True) as task: node = task.node if mode is not node.maintenance: node.maintenance = mode node.save(context) else: msg = _("The node is already in maintenance mode") if mode \ else _("The node is not in maintenance mode") raise exception.NodeMaintenanceFailure(node=node_id, reason=msg) return node @lockutils.synchronized(WORKER_SPAWN_lOCK, 'ironic-') def _spawn_worker(self, func, *args, **kwargs): """Create a greenthread to run func(*args, **kwargs). Spawns a greenthread if there are free slots in pool, otherwise raises exception. Execution control returns immediately to the caller. :returns: GreenThread object. :raises: NoFreeConductorWorker if worker pool is currently full. """ if self._worker_pool.free(): return self._worker_pool.spawn(func, *args, **kwargs) else: raise exception.NoFreeConductorWorker() @messaging.client_exceptions(exception.NodeLocked, exception.NodeAssociated, exception.NodeInWrongPowerState) def destroy_node(self, context, node_id): """Delete a node. :param context: request context. :param node_id: node id or uuid. :raises: NodeLocked if node is locked by another conductor. :raises: NodeAssociated if the node contains an instance associated with it. :raises: NodeInWrongPowerState if the node is not powered off. """ with task_manager.acquire(context, node_id) as task: node = task.node if node.instance_uuid is not None: raise exception.NodeAssociated(node=node.uuid, instance=node.instance_uuid) if node.power_state not in [states.POWER_OFF, states.NOSTATE]: msg = (_("Node %s can't be deleted because it's not " "powered off") % node.uuid) raise exception.NodeInWrongPowerState(msg) self.dbapi.destroy_node(node_id) @messaging.client_exceptions(exception.NodeLocked, exception.UnsupportedDriverExtension, exception.NodeConsoleNotEnabled, exception.InvalidParameterValue) def get_console_information(self, context, node_id): """Get connection information about the console. :param context: request context. :param node_id: node id or uuid. :raises: UnsupportedDriverExtension if the node's driver doesn't support console. :raises: NodeConsoleNotEnabled if the console is not enabled. :raises: InvalidParameterValue when the wrong driver info is specified. """ LOG.debug(_('RPC get_console_information called for node %s') % node_id) with task_manager.acquire(context, node_id, shared=True) as task: node = task.node if not getattr(task.driver, 'console', None): raise exception.UnsupportedDriverExtension(driver=node.driver, extension='console') if not node.console_enabled: raise exception.NodeConsoleNotEnabled(node=node_id) task.driver.console.validate(task, node) return task.driver.console.get_console(task, node) @messaging.client_exceptions(exception.NoFreeConductorWorker, exception.NodeLocked, exception.UnsupportedDriverExtension, exception.InvalidParameterValue) def set_console_mode(self, context, node_id, enabled): """Enable/Disable the console. Validate driver specific information synchronously, and then spawn a background worker to set console mode asynchronously. :param context: request context. :param node_id: node id or uuid. :param enabled: Boolean value; whether the console is enabled or disabled. :raises: UnsupportedDriverExtension if the node's driver doesn't support console. :raises: InvalidParameterValue when the wrong driver info is specified. :raises: NoFreeConductorWorker when there is no free worker to start async task """ LOG.debug(_('RPC set_console_mode called for node %(node)s with ' 'enabled %(enabled)s') % {'node': node_id, 'enabled': enabled}) task = task_manager.TaskManager(context, node_id, shared=False) node = task.node try: if not getattr(task.driver, 'console', None): exc = exception.UnsupportedDriverExtension(driver=node.driver, extension='console') node.last_error = exc.format_message() node.save(context) raise exc task.driver.console.validate(task, node) if enabled == node.console_enabled: op = _('enabled') if enabled else _('disabled') LOG.info(_("No console action was triggered because the " "console is already %s") % op) else: node.last_error = None node.save(context) # Start the requested action in the background. thread = self._spawn_worker(self._set_console_mode, task, enabled) # Release node lock at the end. thread.link(lambda t: task.release_resources()) except Exception: with excutils.save_and_reraise_exception(): # Release node lock if error occurred. task.release_resources() def _set_console_mode(self, task, enabled): """Internal method to set console mode on a node.""" node = task.node try: if enabled: task.driver.console.start_console(task, node) else: task.driver.console.stop_console(task, node) except Exception as e: with excutils.save_and_reraise_exception(): op = _('enabling') if enabled else _('disabling') msg = (_('Error %(op)s the console on node %(node)s. ' 'Reason: %(error)s') % {'op': op, 'node': node.uuid, 'error': e}) node.last_error = msg else: node.console_enabled = enabled node.last_error = None finally: node.save(task.context) @messaging.client_exceptions(exception.NodeLocked, exception.FailedToUpdateMacOnPort) def update_port(self, context, port_obj): """Update a port. :param context: request context. :param port_obj: a changed (but not saved) port object. :raises: FailedToUpdateMacOnPort if MAC address changed and update Neutron failed. """ port_uuid = port_obj.uuid LOG.debug(_("RPC update_port called for port %s."), port_uuid) with task_manager.acquire(context, port_obj.node_id) as task: node = task.node if 'address' in port_obj.obj_what_changed(): vif = port_obj.extra.get('vif_port_id') if vif: api = neutron.NeutronAPI(context) api.update_port_address(vif, port_obj.address) # Log warning if there is no vif_port_id and an instance # is associated with the node. elif node.instance_uuid: LOG.warning(_("No VIF found for instance %(instance)s " "port %(port)s when attempting to update Neutron " "port MAC address."), {'port': port_uuid, 'instance': node.instance_uuid}) port_obj.save(context) return port_obj ironic-2014.1.rc1/ironic/conductor/task_manager.py0000664000175300017540000002154512316614116023206 0ustar jenkinsjenkins00000000000000# coding=utf-8 # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """ A context manager to peform a series of tasks on a set of resources. :class:`TaskManager` is a context manager, created on-demand to synchronize locking and simplify operations across a set of :class:`NodeResource` instances. Each NodeResource holds the data model for a node and its associated ports, as well as references to the driver singleton appropriate for that node. The :class:`TaskManager` will, by default, acquire an exclusive lock on its resources for the duration that the TaskManager instance exists. You may create a TaskManager instance without locking by passing "shared=True" when creating it, but certain operations on the resources held by such an instance of TaskManager will not be possible. Requiring this exclusive lock guards against parallel operations interfering with each other. A shared lock is useful when performing non-interfering operations, such as validating the driver interfaces or the vendor_passthru method. An exclusive lock is stored in the database to coordinate between :class:`ironic.conductor.manager` instances, that are typically deployed on different hosts. :class:`TaskManager` methods, as well as driver methods, may be decorated to determine whether their invocation requires an exclusive lock. If you have a task with just a single node, the TaskManager instance exposes additional properties to access the node, driver, and ports in a short-hand fashion. For example: with task_manager.acquire(node_id) as task: driver = task.node.driver driver.power.power_on(task.node) If you need to execute task-requiring code in the background thread the TaskManager provides the interface to manage resource locks manually. Common approach is to use manager._spawn_worker method and release resources using link method of the returned thread object. For example (somewhere inside conductor manager):: task = task_manager.TaskManager(context, node_id, shared=False) try: # Start requested action in the background. thread = self._spawn_worker(utils.node_power_action, task, task.node, new_state) # Release node lock at the end. thread.link(lambda t: task.release_resources()) except Exception: with excutils.save_and_reraise_exception(): # Release node lock if error occurred. task.release_resources() The linked callback will be called whenever: - background task finished with no errors. - background task has crashed with exception. - callback was added after the background task has finished or crashed. """ from oslo.config import cfg from ironic.openstack.common import excutils from ironic.common import driver_factory from ironic.common import exception from ironic.db import api as dbapi CONF = cfg.CONF def require_exclusive_lock(f): """Decorator to require an exclusive lock. Decorated functions must take a :class:`TaskManager` as the first parameter. Decorated class methods should take a :class:`TaskManager` as the first parameter after "self". """ def wrapper(*args, **kwargs): task = args[0] if isinstance(args[0], TaskManager) else args[1] if task.shared: raise exception.ExclusiveLockRequired() return f(*args, **kwargs) return wrapper def acquire(context, node_ids, shared=False, driver_name=None): """Shortcut for acquiring a lock on one or more Nodes. :param context: Request context. :param node_ids: A list of ids or uuids of nodes to lock. :param shared: Boolean indicating whether to take a shared or exclusive lock. Default: False. :param driver_name: Name of Driver. Default: None. :returns: An instance of :class:`TaskManager`. """ return TaskManager(context, node_ids, shared, driver_name) class TaskManager(object): """Context manager for tasks. This class wraps the locking, driver loading, and acquisition of related resources (eg, Nodes and Ports) when beginning a unit of work. """ def __init__(self, context, node_ids, shared=False, driver_name=None): """Create a new TaskManager. Acquire a lock atomically on a non-empty set of nodes. The lock can be either shared or exclusive. Shared locks may be used for read-only or non-disruptive actions only, and must be considerate to what other threads may be doing on the nodes at the same time. :param context: request context :param node_ids: A list of ids or uuids of nodes to lock. :param shared: Boolean indicating whether to take a shared or exclusive lock. Default: False. :param driver_name: The name of the driver to load, if different from the Node's current driver. :raises: DriverNotFound :raises: NodeAlreadyLocked """ self.context = context self.resources = [] self.shared = shared self.dbapi = dbapi.get_instance() # instead of generating an exception, DTRT and convert to a list if not isinstance(node_ids, list): node_ids = [node_ids] locked_node_list = [] try: for id in node_ids: if not self.shared: # NOTE(deva): Only lock one node at a time so we can ensure # that only the right nodes are unlocked. # However, reserve_nodes takes and returns a # list. This should be refactored. node = self.dbapi.reserve_nodes(CONF.host, [id])[0] locked_node_list.append(node.id) else: node = self.dbapi.get_node(id) ports = self.dbapi.get_ports_by_node(id) driver = driver_factory.get_driver(driver_name or node.driver) self.resources.append(NodeResource(node, ports, driver)) except Exception: with excutils.save_and_reraise_exception(): if locked_node_list: self.dbapi.release_nodes(CONF.host, locked_node_list) def release_resources(self): """Release any resources for which this TaskManager was holding an exclusive lock. """ if not self.shared: if self.resources: node_ids = [r.node.id for r in self.resources] try: self.dbapi.release_nodes(CONF.host, node_ids) except exception.NodeNotFound: # squelch the exception if the node was deleted # within the task's context. pass self.resources = [] @property def node(self): """Special accessor for single-node tasks.""" if len(self.resources) == 1: return self.resources[0].node else: raise AttributeError(_("Multi-node TaskManager " "has no attribute 'node'")) @property def ports(self): """Special accessor for single-node tasks.""" if len(self.resources) == 1: return self.resources[0].ports else: raise AttributeError(_("Multi-node TaskManager " "has no attribute 'ports'")) @property def driver(self): """Special accessor for single-node tasks.""" if len(self.resources) == 1: return self.resources[0].driver else: raise AttributeError(_("Multi-node TaskManager " "has no attribute 'driver'")) @property def node_manager(self): """Special accessor for single-node manager.""" if len(self.resources) == 1: return self.resources[0] else: raise AttributeError(_("Multi-node TaskManager " "can't select single node manager from the list")) def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self.release_resources() class NodeResource(object): """Wrapper to hold a Node, its associated Port(s), and its Driver.""" def __init__(self, node, ports, driver): self.node = node self.ports = ports self.driver = driver ironic-2014.1.rc1/ironic/conductor/utils.py0000664000175300017540000001307012316614116021704 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. from ironic.common import exception from ironic.common import states from ironic.conductor import task_manager from ironic.openstack.common import excutils from ironic.openstack.common import log LOG = log.getLogger(__name__) @task_manager.require_exclusive_lock def node_set_boot_device(task, node, device, persistent=False): """Set the boot device for a node. :param task: a TaskManager instance. :param node: The Node. :param device: Boot device. Values are vendor-specific. :param persistent: Whether to set next-boot, or make the change permanent. Default: False. """ try: task.driver.vendor.vendor_passthru(task, node, device=device, persistent=persistent, method='set_boot_device') except exception.UnsupportedDriverExtension: # NOTE(deva): Some drivers, like SSH, do not support set_boot_device. # This is not a fatal exception. pass @task_manager.require_exclusive_lock def node_power_action(task, node, state): """Change power state or reset for a node. Validate whether the given power transition is possible and perform power action. :param task: a TaskManager instance. :param node: the Node object to act upon. :param state: Any power state from ironic.common.states. If the state is 'REBOOT' then a reboot will be attempted, otherwise the node power state is directly set to 'state'. :raises: InvalidParameterValue when the wrong state is specified or the wrong driver info is specified. :raises: other exceptions by the node's power driver if something wrong occurred during the power action. """ context = task.context new_state = states.POWER_ON if state == states.REBOOT else state try: task.driver.power.validate(task, node) if state != states.REBOOT: curr_state = task.driver.power.get_power_state(task, node) except Exception as e: with excutils.save_and_reraise_exception(): node['last_error'] = \ _("Failed to change power state to '%(target)s'. " "Error: %(error)s") % { 'target': new_state, 'error': e} node.save(context) if state != states.REBOOT and curr_state == new_state: # Neither the ironic service nor the hardware has erred. The # node is, for some reason, already in the requested state, # though we don't know why. eg, perhaps the user previously # requested the node POWER_ON, the network delayed those IPMI # packets, and they are trying again -- but the node finally # responds to the first request, and so the second request # gets to this check and stops. # This isn't an error, so we'll clear last_error field # (from previous operation), log a warning, and return. node['last_error'] = None node.save(context) LOG.warn(_("Not going to change_node_power_state because " "current state = requested state = '%(state)s'.") % {'state': curr_state}) return # Set the target_power_state and clear any last_error, since we're # starting a new operation. This will expose to other processes # and clients that work is in progress. node['target_power_state'] = new_state node['last_error'] = None node.save(context) # take power action try: if state != states.REBOOT: task.driver.power.set_power_state(task, node, new_state) else: task.driver.power.reboot(task, node) except Exception as e: with excutils.save_and_reraise_exception(): node['last_error'] = \ _("Failed to change power state to '%(target)s'. " "Error: %(error)s") % { 'target': new_state, 'error': e} else: # success! node['power_state'] = new_state finally: node['target_power_state'] = states.NOSTATE node.save(context) @task_manager.require_exclusive_lock def cleanup_after_timeout(task): """Cleanup deploy task after timeout. :param task: a TaskManager instance. """ node = task.node context = task.context error_msg = _('Cleanup failed for node %(node)s after deploy timeout: ' ' %(error)s') try: task.driver.deploy.clean_up(task, node) except exception.IronicException as e: msg = error_msg % {'node': node.uuid, 'error': e} LOG.error(msg) node.last_error = msg node.save(context) except Exception as e: msg = error_msg % {'node': node.uuid, 'error': e} LOG.error(msg) node.last_error = _('Deploy timed out, but an unhandled exception was ' 'encountered while aborting. More info may be ' 'found in the log file.') node.save(context) ironic-2014.1.rc1/ironic/conductor/__init__.py0000664000175300017540000000000012316614116022270 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/conductor/rpcapi.py0000664000175300017540000003041712316614116022026 0ustar jenkinsjenkins00000000000000# coding=utf-8 # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """ Client side of the conductor RPC API. """ from oslo.config import cfg from ironic.common import exception from ironic.common import hash_ring as hash from ironic.conductor import manager from ironic.db import api as dbapi from ironic.objects import base as objects_base import ironic.openstack.common.rpc.proxy # NOTE(max_lobur): This is temporary override for Oslo setting defined in # ironic.openstack.common.rpc.__init__.py. Should stay while Oslo is not fixed. # *The setting shows what exceptions can be deserialized from RPC response. # *This won't be reflected in ironic.conf.sample # TODO(max_lobur): cover this by an integration test as # described in https://bugs.launchpad.net/ironic/+bug/1252824 cfg.CONF.set_default('allowed_rpc_exception_modules', ['ironic.common.exception', 'exceptions', ]) class ConductorAPI(ironic.openstack.common.rpc.proxy.RpcProxy): """Client side of the conductor RPC API. API version history: 1.0 - Initial version. Included get_node_power_status 1.1 - Added update_node and start_power_state_change. 1.2 - Added vendor_passhthru. 1.3 - Rename start_power_state_change to change_node_power_state. 1.4 - Added do_node_deploy and do_node_tear_down. 1.5 - Added validate_driver_interfaces. 1.6 - change_node_power_state, do_node_deploy and do_node_tear_down accept node id instead of node object. 1.7 - Added topic parameter to RPC methods. 1.8 - Added change_node_maintenance_mode. 1.9 - Added destroy_node. 1.10 - Remove get_node_power_state 1.11 - Added get_console_information, set_console_mode. 1.12 - validate_vendor_action, do_vendor_action replaced by single vendor_passthru method. 1.13 - Added update_port. """ RPC_API_VERSION = '1.13' def __init__(self, topic=None): if topic is None: topic = manager.MANAGER_TOPIC # Initialize consistent hash ring self.hash_rings = {} d2c = dbapi.get_instance().get_active_driver_dict() for driver in d2c.keys(): self.hash_rings[driver] = hash.HashRing(d2c[driver]) super(ConductorAPI, self).__init__( topic=topic, serializer=objects_base.IronicObjectSerializer(), default_version=self.RPC_API_VERSION) def get_topic_for(self, node): """Get the RPC topic for the conductor service which the node is mapped to. :param node: a node object. :returns: an RPC topic string. :raises: NoValidHost """ try: ring = self.hash_rings[node.driver] dest = ring.get_hosts(node.uuid) return self.topic + "." + dest[0] except KeyError: reason = (_('No conductor service registered which supports ' 'driver %s.') % node.driver) raise exception.NoValidHost(reason=reason) def update_node(self, context, node_obj, topic=None): """Synchronously, have a conductor update the node's information. Update the node's information in the database and return a node object. The conductor will lock the node while it validates the supplied information. If driver_info is passed, it will be validated by the core drivers. If instance_uuid is passed, it will be set or unset only if the node is properly configured. Note that power_state should not be passed via this method. Use change_node_power_state for initiating driver actions. :param context: request context. :param node_obj: a changed (but not saved) node object. :param topic: RPC topic. Defaults to self.topic. :returns: updated node object, including all fields. """ return self.call(context, self.make_msg('update_node', node_obj=node_obj), topic=topic or self.topic) def change_node_power_state(self, context, node_id, new_state, topic=None): """Synchronously, acquire lock and start the conductor background task to change power state of a node. :param context: request context. :param node_id: node id or uuid. :param new_state: one of ironic.common.states power state values :param topic: RPC topic. Defaults to self.topic. :raises: NoFreeConductorWorker when there is no free worker to start async task. """ return self.call(context, self.make_msg('change_node_power_state', node_id=node_id, new_state=new_state), topic=topic or self.topic) def vendor_passthru(self, context, node_id, driver_method, info, topic=None): """Synchronously, acquire lock, validate given parameters and start the conductor background task for specified vendor action. :param context: request context. :param node_id: node id or uuid. :param driver_method: name of method for driver. :param info: info for node driver. :param topic: RPC topic. Defaults to self.topic. :raises: InvalidParameterValue if supplied info is not valid. :raises: UnsupportedDriverExtension if current driver does not have vendor interface. :raises: NoFreeConductorWorker when there is no free worker to start async task. """ topic = topic or self.topic return self.call(context, self.make_msg('vendor_passthru', node_id=node_id, driver_method=driver_method, info=info), topic=topic) def do_node_deploy(self, context, node_id, topic=None): """Signal to conductor service to perform a deployment. :param context: request context. :param node_id: node id or uuid. :param topic: RPC topic. Defaults to self.topic. :raises: InstanceDeployFailure :raises: InvalidParameterValue if validation fails :raises: NoFreeConductorWorker when there is no free worker to start async task. The node must already be configured and in the appropriate undeployed state before this method is called. """ return self.call(context, self.make_msg('do_node_deploy', node_id=node_id), topic=topic or self.topic) def do_node_tear_down(self, context, node_id, topic=None): """Signal to conductor service to tear down a deployment. :param context: request context. :param node_id: node id or uuid. :param topic: RPC topic. Defaults to self.topic. :raises: InstanceDeployFailure :raises: InvalidParameterValue if validation fails :raises: NoFreeConductorWorker when there is no free worker to start async task. The node must already be configured and in the appropriate deployed state before this method is called. """ return self.call(context, self.make_msg('do_node_tear_down', node_id=node_id), topic=topic or self.topic) def validate_driver_interfaces(self, context, node_id, topic=None): """Validate the `core` and `standardized` interfaces for drivers. :param context: request context. :param node_id: node id or uuid. :param topic: RPC topic. Defaults to self.topic. :returns: a dictionary containing the results of each interface validation. """ return self.call(context, self.make_msg('validate_driver_interfaces', node_id=node_id), topic=topic or self.topic) def change_node_maintenance_mode(self, context, node_id, mode, topic=None): """Set node maintenance mode on or off. :param context: request context. :param node_id: node id or uuid. :param mode: True or False. :param topic: RPC topic. Defaults to self.topic. :returns: a node object. :raises: NodeMaintenanceFailure. """ return self.call(context, self.make_msg('change_node_maintenance_mode', node_id=node_id, mode=mode), topic=topic or self.topic) def destroy_node(self, context, node_id, topic=None): """Delete a node. :param context: request context. :param node_id: node id or uuid. :raises: NodeLocked if node is locked by another conductor. :raises: NodeAssociated if the node contains an instance associated with it. :raises: NodeInWrongPowerState if the node is not powered off. """ return self.call(context, self.make_msg('destroy_node', node_id=node_id), topic=topic or self.topic) def get_console_information(self, context, node_id, topic=None): """Get connection information about the console. :param context: request context. :param node_id: node id or uuid. :param topic: RPC topic. Defaults to self.topic. :raises: UnsupportedDriverExtension if the node's driver doesn't support console. :raises: InvalidParameterValue when the wrong driver info is specified. """ return self.call(context, self.make_msg('get_console_information', node_id=node_id), topic=topic or self.topic) def set_console_mode(self, context, node_id, enabled, topic=None): """Enable/Disable the console. :param context: request context. :param node_id: node id or uuid. :param topic: RPC topic. Defaults to self.topic. :param enabled: Boolean value; whether the console is enabled or disabled. :raises: UnsupportedDriverExtension if the node's driver doesn't support console. :raises: InvalidParameterValue when the wrong driver info is specified. :raises: NoFreeConductorWorker when there is no free worker to start async task. """ return self.call(context, self.make_msg('set_console_mode', node_id=node_id, enabled=enabled), topic=topic or self.topic) def update_port(self, context, port_obj, topic=None): """Synchronously, have a conductor update the port's information. Update the port's information in the database and return a port object. The conductor will lock related node and trigger specific driver actions if they are needed. :param context: request context. :param port_obj: a changed (but not saved) port object. :param topic: RPC topic. Defaults to self.topic. :returns: updated port object, including all fields. """ return self.call(context, self.make_msg('update_port', port_obj=port_obj), topic=topic or self.topic) ironic-2014.1.rc1/ironic/openstack/0000775000175300017540000000000012316614636020167 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/openstack/common/0000775000175300017540000000000012316614636021457 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/openstack/common/local.py0000664000175300017540000000327212316614116023120 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2011 OpenStack Foundation. # 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. """Local storage of variables using weak references""" import threading import weakref class WeakLocal(threading.local): def __getattribute__(self, attr): rval = super(WeakLocal, self).__getattribute__(attr) if rval: # NOTE(mikal): this bit is confusing. What is stored is a weak # reference, not the value itself. We therefore need to lookup # the weak reference and return the inner value here. rval = rval() return rval def __setattr__(self, attr, value): value = weakref.ref(value) return super(WeakLocal, self).__setattr__(attr, value) # NOTE(mikal): the name "store" should be deprecated in the future store = WeakLocal() # A "weak" store uses weak references and allows an object to fall out of scope # when it falls out of scope in the code that uses the thread local storage. A # "strong" store will hold a reference to the object so that it never falls out # of scope. weak_store = WeakLocal() strong_store = threading.local() ironic-2014.1.rc1/ironic/openstack/common/fileutils.py0000664000175300017540000000757112316614116024034 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2011 OpenStack Foundation. # 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 contextlib import errno import os import tempfile from ironic.openstack.common import excutils from ironic.openstack.common.gettextutils import _ # noqa from ironic.openstack.common import log as logging LOG = logging.getLogger(__name__) _FILE_CACHE = {} def ensure_tree(path): """Create a directory (and any ancestor directories required) :param path: Directory to create """ try: os.makedirs(path) except OSError as exc: if exc.errno == errno.EEXIST: if not os.path.isdir(path): raise else: raise def read_cached_file(filename, force_reload=False): """Read from a file if it has been modified. :param force_reload: Whether to reload the file. :returns: A tuple with a boolean specifying if the data is fresh or not. """ global _FILE_CACHE if force_reload and filename in _FILE_CACHE: del _FILE_CACHE[filename] reloaded = False mtime = os.path.getmtime(filename) cache_info = _FILE_CACHE.setdefault(filename, {}) if not cache_info or mtime > cache_info.get('mtime', 0): LOG.debug(_("Reloading cached file %s") % filename) with open(filename) as fap: cache_info['data'] = fap.read() cache_info['mtime'] = mtime reloaded = True return (reloaded, cache_info['data']) def delete_if_exists(path, remove=os.unlink): """Delete a file, but ignore file not found error. :param path: File to delete :param remove: Optional function to remove passed path """ try: remove(path) except OSError as e: if e.errno != errno.ENOENT: raise @contextlib.contextmanager def remove_path_on_error(path, remove=delete_if_exists): """Protect code that wants to operate on PATH atomically. Any exception will cause PATH to be removed. :param path: File to work with :param remove: Optional function to remove passed path """ try: yield except Exception: with excutils.save_and_reraise_exception(): remove(path) def file_open(*args, **kwargs): """Open file see built-in file() documentation for more details Note: The reason this is kept in a separate module is to easily be able to provide a stub module that doesn't alter system state at all (for unit tests) """ return file(*args, **kwargs) def write_to_tempfile(content, path=None, suffix='', prefix='tmp'): """Create temporary file or use existing file. This util is needed for creating temporary file with specified content, suffix and prefix. If path is not None, it will be used for writing content. If the path doesn't exist it'll be created. :param content: content for temporary file. :param path: same as parameter 'dir' for mkstemp :param suffix: same as parameter 'suffix' for mkstemp :param prefix: same as parameter 'prefix' for mkstemp For example: it can be used in database tests for creating configuration files. """ if path: ensure_tree(path) (fd, path) = tempfile.mkstemp(suffix=suffix, dir=path, prefix=prefix) try: os.write(fd, content) finally: os.close(fd) return path ironic-2014.1.rc1/ironic/openstack/common/strutils.py0000664000175300017540000001627112316614116023722 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2011 OpenStack Foundation. # 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. """ System-level utilities and helper functions. """ import re import sys import unicodedata import six from ironic.openstack.common.gettextutils import _ # noqa # Used for looking up extensions of text # to their 'multiplied' byte amount BYTE_MULTIPLIERS = { '': 1, 't': 1024 ** 4, 'g': 1024 ** 3, 'm': 1024 ** 2, 'k': 1024, } BYTE_REGEX = re.compile(r'(^-?\d+)(\D*)') TRUE_STRINGS = ('1', 't', 'true', 'on', 'y', 'yes') FALSE_STRINGS = ('0', 'f', 'false', 'off', 'n', 'no') SLUGIFY_STRIP_RE = re.compile(r"[^\w\s-]") SLUGIFY_HYPHENATE_RE = re.compile(r"[-\s]+") def int_from_bool_as_string(subject): """Interpret a string as a boolean and return either 1 or 0. Any string value in: ('True', 'true', 'On', 'on', '1') is interpreted as a boolean True. Useful for JSON-decoded stuff and config file parsing """ return bool_from_string(subject) and 1 or 0 def bool_from_string(subject, strict=False): """Interpret a string as a boolean. A case-insensitive match is performed such that strings matching 't', 'true', 'on', 'y', 'yes', or '1' are considered True and, when `strict=False`, anything else is considered False. Useful for JSON-decoded stuff and config file parsing. If `strict=True`, unrecognized values, including None, will raise a ValueError which is useful when parsing values passed in from an API call. Strings yielding False are 'f', 'false', 'off', 'n', 'no', or '0'. """ if not isinstance(subject, six.string_types): subject = str(subject) lowered = subject.strip().lower() if lowered in TRUE_STRINGS: return True elif lowered in FALSE_STRINGS: return False elif strict: acceptable = ', '.join( "'%s'" % s for s in sorted(TRUE_STRINGS + FALSE_STRINGS)) msg = _("Unrecognized value '%(val)s', acceptable values are:" " %(acceptable)s") % {'val': subject, 'acceptable': acceptable} raise ValueError(msg) else: return False def safe_decode(text, incoming=None, errors='strict'): """Decodes incoming str using `incoming` if they're not already unicode. :param incoming: Text's current encoding :param errors: Errors handling policy. See here for valid values http://docs.python.org/2/library/codecs.html :returns: text or a unicode `incoming` encoded representation of it. :raises TypeError: If text is not an instance of str """ if not isinstance(text, six.string_types): raise TypeError("%s can't be decoded" % type(text)) if isinstance(text, six.text_type): return text if not incoming: incoming = (sys.stdin.encoding or sys.getdefaultencoding()) try: return text.decode(incoming, errors) except UnicodeDecodeError: # Note(flaper87) If we get here, it means that # sys.stdin.encoding / sys.getdefaultencoding # didn't return a suitable encoding to decode # text. This happens mostly when global LANG # var is not set correctly and there's no # default encoding. In this case, most likely # python will use ASCII or ANSI encoders as # default encodings but they won't be capable # of decoding non-ASCII characters. # # Also, UTF-8 is being used since it's an ASCII # extension. return text.decode('utf-8', errors) def safe_encode(text, incoming=None, encoding='utf-8', errors='strict'): """Encodes incoming str/unicode using `encoding`. If incoming is not specified, text is expected to be encoded with current python's default encoding. (`sys.getdefaultencoding`) :param incoming: Text's current encoding :param encoding: Expected encoding for text (Default UTF-8) :param errors: Errors handling policy. See here for valid values http://docs.python.org/2/library/codecs.html :returns: text or a bytestring `encoding` encoded representation of it. :raises TypeError: If text is not an instance of str """ if not isinstance(text, six.string_types): raise TypeError("%s can't be encoded" % type(text)) if not incoming: incoming = (sys.stdin.encoding or sys.getdefaultencoding()) if isinstance(text, six.text_type): return text.encode(encoding, errors) elif text and encoding != incoming: # Decode text before encoding it with `encoding` text = safe_decode(text, incoming, errors) return text.encode(encoding, errors) return text def to_bytes(text, default=0): """Converts a string into an integer of bytes. Looks at the last characters of the text to determine what conversion is needed to turn the input text into a byte number. Supports "B, K(B), M(B), G(B), and T(B)". (case insensitive) :param text: String input for bytes size conversion. :param default: Default return value when text is blank. """ match = BYTE_REGEX.search(text) if match: magnitude = int(match.group(1)) mult_key_org = match.group(2) if not mult_key_org: return magnitude elif text: msg = _('Invalid string format: %s') % text raise TypeError(msg) else: return default mult_key = mult_key_org.lower().replace('b', '', 1) multiplier = BYTE_MULTIPLIERS.get(mult_key) if multiplier is None: msg = _('Unknown byte multiplier: %s') % mult_key_org raise TypeError(msg) return magnitude * multiplier def to_slug(value, incoming=None, errors="strict"): """Normalize string. Convert to lowercase, remove non-word characters, and convert spaces to hyphens. Inspired by Django's `slugify` filter. :param value: Text to slugify :param incoming: Text's current encoding :param errors: Errors handling policy. See here for valid values http://docs.python.org/2/library/codecs.html :returns: slugified unicode representation of `value` :raises TypeError: If text is not an instance of str """ value = safe_decode(value, incoming, errors) # NOTE(aababilov): no need to use safe_(encode|decode) here: # encodings are always "ascii", error handling is always "ignore" # and types are always known (first: unicode; second: str) value = unicodedata.normalize("NFKD", value).encode( "ascii", "ignore").decode("ascii") value = SLUGIFY_STRIP_RE.sub("", value).strip().lower() return SLUGIFY_HYPHENATE_RE.sub("-", value) ironic-2014.1.rc1/ironic/openstack/common/loopingcall.py0000664000175300017540000001107112316614116024325 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # Copyright 2011 Justin Santa Barbara # 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 sys from eventlet import event from eventlet import greenthread from ironic.openstack.common.gettextutils import _ from ironic.openstack.common import log as logging from ironic.openstack.common import timeutils LOG = logging.getLogger(__name__) class LoopingCallDone(Exception): """Exception to break out and stop a LoopingCall. The poll-function passed to LoopingCall can raise this exception to break out of the loop normally. This is somewhat analogous to StopIteration. An optional return-value can be included as the argument to the exception; this return-value will be returned by LoopingCall.wait() """ def __init__(self, retvalue=True): """:param retvalue: Value that LoopingCall.wait() should return.""" self.retvalue = retvalue class LoopingCallBase(object): def __init__(self, f=None, *args, **kw): self.args = args self.kw = kw self.f = f self._running = False self.done = None def stop(self): self._running = False def wait(self): return self.done.wait() class FixedIntervalLoopingCall(LoopingCallBase): """A fixed interval looping call.""" def start(self, interval, initial_delay=None): self._running = True done = event.Event() def _inner(): if initial_delay: greenthread.sleep(initial_delay) try: while self._running: start = timeutils.utcnow() self.f(*self.args, **self.kw) end = timeutils.utcnow() if not self._running: break delay = interval - timeutils.delta_seconds(start, end) if delay <= 0: LOG.warn(_('task run outlasted interval by %s sec') % -delay) greenthread.sleep(delay if delay > 0 else 0) except LoopingCallDone as e: self.stop() done.send(e.retvalue) except Exception: LOG.exception(_('in fixed duration looping call')) done.send_exception(*sys.exc_info()) return else: done.send(True) self.done = done greenthread.spawn_n(_inner) return self.done # TODO(mikal): this class name is deprecated in Havana and should be removed # in the I release LoopingCall = FixedIntervalLoopingCall class DynamicLoopingCall(LoopingCallBase): """A looping call which sleeps until the next known event. The function called should return how long to sleep for before being called again. """ def start(self, initial_delay=None, periodic_interval_max=None): self._running = True done = event.Event() def _inner(): if initial_delay: greenthread.sleep(initial_delay) try: while self._running: idle = self.f(*self.args, **self.kw) if not self._running: break if periodic_interval_max is not None: idle = min(idle, periodic_interval_max) LOG.debug(_('Dynamic looping call sleeping for %.02f ' 'seconds'), idle) greenthread.sleep(idle) except LoopingCallDone as e: self.stop() done.send(e.retvalue) except Exception: LOG.exception(_('in dynamic looping call')) done.send_exception(*sys.exc_info()) return else: done.send(True) self.done = done greenthread.spawn(_inner) return self.done ironic-2014.1.rc1/ironic/openstack/common/py3kcompat/0000775000175300017540000000000012316614636023551 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/openstack/common/py3kcompat/__init__.py0000664000175300017540000000000012316614116025641 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/openstack/common/py3kcompat/urlutils.py0000664000175300017540000000356012316614116026003 0ustar jenkinsjenkins00000000000000# # Copyright 2013 Canonical Ltd. # 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. # """ Python2/Python3 compatibility layer for OpenStack """ import six if six.PY3: # python3 import urllib.error import urllib.parse import urllib.request urlencode = urllib.parse.urlencode urljoin = urllib.parse.urljoin quote = urllib.parse.quote quote_plus = urllib.parse.quote_plus parse_qsl = urllib.parse.parse_qsl unquote = urllib.parse.unquote unquote_plus = urllib.parse.unquote_plus urlparse = urllib.parse.urlparse urlsplit = urllib.parse.urlsplit urlunsplit = urllib.parse.urlunsplit SplitResult = urllib.parse.SplitResult urlopen = urllib.request.urlopen URLError = urllib.error.URLError pathname2url = urllib.request.pathname2url else: # python2 import urllib import urllib2 import urlparse urlencode = urllib.urlencode quote = urllib.quote quote_plus = urllib.quote_plus unquote = urllib.unquote unquote_plus = urllib.unquote_plus parse = urlparse parse_qsl = parse.parse_qsl urljoin = parse.urljoin urlparse = parse.urlparse urlsplit = parse.urlsplit urlunsplit = parse.urlunsplit SplitResult = parse.SplitResult urlopen = urllib2.urlopen URLError = urllib2.URLError pathname2url = urllib.pathname2url ironic-2014.1.rc1/ironic/openstack/common/setup.py0000664000175300017540000003261012316614116023164 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2011 OpenStack Foundation. # Copyright 2012-2013 Hewlett-Packard Development Company, L.P. # 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. """ Utilities with minimum-depends for use in setup.py """ from __future__ import print_function import email import os import re import subprocess import sys from setuptools.command import sdist def parse_mailmap(mailmap='.mailmap'): mapping = {} if os.path.exists(mailmap): with open(mailmap, 'r') as fp: for l in fp: try: canonical_email, alias = re.match( r'[^#]*?(<.+>).*(<.+>).*', l).groups() except AttributeError: continue mapping[alias] = canonical_email return mapping def _parse_git_mailmap(git_dir, mailmap='.mailmap'): mailmap = os.path.join(os.path.dirname(git_dir), mailmap) return parse_mailmap(mailmap) def canonicalize_emails(changelog, mapping): """Takes in a string and an email alias mapping and replaces all instances of the aliases in the string with their real email. """ for alias, email_address in mapping.iteritems(): changelog = changelog.replace(alias, email_address) return changelog # Get requirements from the first file that exists def get_reqs_from_files(requirements_files): for requirements_file in requirements_files: if os.path.exists(requirements_file): with open(requirements_file, 'r') as fil: return fil.read().split('\n') return [] def parse_requirements(requirements_files=['requirements.txt', 'tools/pip-requires']): requirements = [] for line in get_reqs_from_files(requirements_files): # For the requirements list, we need to inject only the portion # after egg= so that distutils knows the package it's looking for # such as: # -e git://github.com/openstack/nova/master#egg=nova if re.match(r'\s*-e\s+', line): requirements.append(re.sub(r'\s*-e\s+.*#egg=(.*)$', r'\1', line)) # such as: # http://github.com/openstack/nova/zipball/master#egg=nova elif re.match(r'\s*https?:', line): requirements.append(re.sub(r'\s*https?:.*#egg=(.*)$', r'\1', line)) # -f lines are for index locations, and don't get used here elif re.match(r'\s*-f\s+', line): pass # argparse is part of the standard library starting with 2.7 # adding it to the requirements list screws distro installs elif line == 'argparse' and sys.version_info >= (2, 7): pass else: requirements.append(line) return requirements def parse_dependency_links(requirements_files=['requirements.txt', 'tools/pip-requires']): dependency_links = [] # dependency_links inject alternate locations to find packages listed # in requirements for line in get_reqs_from_files(requirements_files): # skip comments and blank lines if re.match(r'(\s*#)|(\s*$)', line): continue # lines with -e or -f need the whole line, minus the flag if re.match(r'\s*-[ef]\s+', line): dependency_links.append(re.sub(r'\s*-[ef]\s+', '', line)) # lines that are only urls can go in unmolested elif re.match(r'\s*https?:', line): dependency_links.append(line) return dependency_links def _run_shell_command(cmd, throw_on_error=False): if os.name == 'nt': output = subprocess.Popen(["cmd.exe", "/C", cmd], stdout=subprocess.PIPE, stderr=subprocess.PIPE) else: output = subprocess.Popen(["/bin/sh", "-c", cmd], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out = output.communicate() if output.returncode and throw_on_error: raise Exception("%s returned %d" % cmd, output.returncode) if not out: return None return out[0].strip() or None def _get_git_directory(): parent_dir = os.path.dirname(__file__) while True: git_dir = os.path.join(parent_dir, '.git') if os.path.exists(git_dir): return git_dir parent_dir, child = os.path.split(parent_dir) if not child: # reached to root dir return None def write_git_changelog(): """Write a changelog based on the git changelog.""" new_changelog = 'ChangeLog' git_dir = _get_git_directory() if not os.getenv('SKIP_WRITE_GIT_CHANGELOG'): if git_dir: git_log_cmd = 'git --git-dir=%s log' % git_dir changelog = _run_shell_command(git_log_cmd) mailmap = _parse_git_mailmap(git_dir) with open(new_changelog, "w") as changelog_file: changelog_file.write(canonicalize_emails(changelog, mailmap)) else: open(new_changelog, 'w').close() def generate_authors(): """Create AUTHORS file using git commits.""" jenkins_email = 'jenkins@review.(openstack|stackforge).org' old_authors = 'AUTHORS.in' new_authors = 'AUTHORS' git_dir = _get_git_directory() if not os.getenv('SKIP_GENERATE_AUTHORS'): if git_dir: # don't include jenkins email address in AUTHORS file git_log_cmd = ("git --git-dir=" + git_dir + " log --format='%aN <%aE>' | sort -u | " "egrep -v '" + jenkins_email + "'") changelog = _run_shell_command(git_log_cmd) signed_cmd = ("git --git-dir=" + git_dir + " log | grep -i Co-authored-by: | sort -u") signed_entries = _run_shell_command(signed_cmd) if signed_entries: new_entries = "\n".join( [signed.split(":", 1)[1].strip() for signed in signed_entries.split("\n") if signed]) changelog = "\n".join((changelog, new_entries)) mailmap = _parse_git_mailmap(git_dir) with open(new_authors, 'w') as new_authors_fh: new_authors_fh.write(canonicalize_emails(changelog, mailmap)) if os.path.exists(old_authors): with open(old_authors, "r") as old_authors_fh: new_authors_fh.write('\n' + old_authors_fh.read()) else: open(new_authors, 'w').close() _rst_template = """%(heading)s %(underline)s .. automodule:: %(module)s :members: :undoc-members: :show-inheritance: """ def get_cmdclass(): """Return dict of commands to run from setup.py.""" cmdclass = dict() def _find_modules(arg, dirname, files): for filename in files: if filename.endswith('.py') and filename != '__init__.py': arg["%s.%s" % (dirname.replace('/', '.'), filename[:-3])] = True class LocalSDist(sdist.sdist): """Builds the ChangeLog and Authors files from VC first.""" def run(self): write_git_changelog() generate_authors() # sdist.sdist is an old style class, can't use super() sdist.sdist.run(self) cmdclass['sdist'] = LocalSDist # If Sphinx is installed on the box running setup.py, # enable setup.py to build the documentation, otherwise, # just ignore it try: from sphinx.setup_command import BuildDoc class LocalBuildDoc(BuildDoc): builders = ['html', 'man'] def generate_autoindex(self): print("**Autodocumenting from %s" % os.path.abspath(os.curdir)) modules = {} option_dict = self.distribution.get_option_dict('build_sphinx') source_dir = os.path.join(option_dict['source_dir'][1], 'api') if not os.path.exists(source_dir): os.makedirs(source_dir) for pkg in self.distribution.packages: if '.' not in pkg: os.path.walk(pkg, _find_modules, modules) module_list = modules.keys() module_list.sort() autoindex_filename = os.path.join(source_dir, 'autoindex.rst') with open(autoindex_filename, 'w') as autoindex: autoindex.write(""".. toctree:: :maxdepth: 1 """) for module in module_list: output_filename = os.path.join(source_dir, "%s.rst" % module) heading = "The :mod:`%s` Module" % module underline = "=" * len(heading) values = dict(module=module, heading=heading, underline=underline) print("Generating %s" % output_filename) with open(output_filename, 'w') as output_file: output_file.write(_rst_template % values) autoindex.write(" %s.rst\n" % module) def run(self): if not os.getenv('SPHINX_DEBUG'): self.generate_autoindex() for builder in self.builders: self.builder = builder self.finalize_options() self.project = self.distribution.get_name() self.version = self.distribution.get_version() self.release = self.distribution.get_version() BuildDoc.run(self) class LocalBuildLatex(LocalBuildDoc): builders = ['latex'] cmdclass['build_sphinx'] = LocalBuildDoc cmdclass['build_sphinx_latex'] = LocalBuildLatex except ImportError: pass return cmdclass def _get_revno(git_dir): """Return the number of commits since the most recent tag. We use git-describe to find this out, but if there are no tags then we fall back to counting commits since the beginning of time. """ describe = _run_shell_command( "git --git-dir=%s describe --always" % git_dir) if "-" in describe: return describe.rsplit("-", 2)[-2] # no tags found revlist = _run_shell_command( "git --git-dir=%s rev-list --abbrev-commit HEAD" % git_dir) return len(revlist.splitlines()) def _get_version_from_git(pre_version): """Return a version which is equal to the tag that's on the current revision if there is one, or tag plus number of additional revisions if the current revision has no tag.""" git_dir = _get_git_directory() if git_dir: if pre_version: try: return _run_shell_command( "git --git-dir=" + git_dir + " describe --exact-match", throw_on_error=True).replace('-', '.') except Exception: sha = _run_shell_command( "git --git-dir=" + git_dir + " log -n1 --pretty=format:%h") return "%s.a%s.g%s" % (pre_version, _get_revno(git_dir), sha) else: return _run_shell_command( "git --git-dir=" + git_dir + " describe --always").replace( '-', '.') return None def _get_version_from_pkg_info(package_name): """Get the version from PKG-INFO file if we can.""" try: pkg_info_file = open('PKG-INFO', 'r') except (IOError, OSError): return None try: pkg_info = email.message_from_file(pkg_info_file) except email.MessageError: return None # Check to make sure we're in our own dir if pkg_info.get('Name', None) != package_name: return None return pkg_info.get('Version', None) def get_version(package_name, pre_version=None): """Get the version of the project. First, try getting it from PKG-INFO, if it exists. If it does, that means we're in a distribution tarball or that install has happened. Otherwise, if there is no PKG-INFO file, pull the version from git. We do not support setup.py version sanity in git archive tarballs, nor do we support packagers directly sucking our git repo into theirs. We expect that a source tarball be made from our git repo - or that if someone wants to make a source tarball from a fork of our repo with additional tags in it that they understand and desire the results of doing that. """ version = os.environ.get("OSLO_PACKAGE_VERSION", None) if version: return version version = _get_version_from_pkg_info(package_name) if version: return version version = _get_version_from_git(pre_version) if version: return version raise Exception("Versioning for this project requires either an sdist" " tarball, or access to an upstream git repository.") ironic-2014.1.rc1/ironic/openstack/common/eventlet_backdoor.py0000664000175300017540000000515512316614116025522 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright (c) 2012 OpenStack Foundation. # Administrator of the National Aeronautics and Space Administration. # 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 __future__ import print_function import gc import pprint import sys import traceback import eventlet import eventlet.backdoor import greenlet from oslo.config import cfg eventlet_backdoor_opts = [ cfg.IntOpt('backdoor_port', default=None, help='port for eventlet backdoor to listen') ] CONF = cfg.CONF CONF.register_opts(eventlet_backdoor_opts) def _dont_use_this(): print("Don't use this, just disconnect instead") def _find_objects(t): return filter(lambda o: isinstance(o, t), gc.get_objects()) def _print_greenthreads(): for i, gt in enumerate(_find_objects(greenlet.greenlet)): print(i, gt) traceback.print_stack(gt.gr_frame) print() def _print_nativethreads(): for threadId, stack in sys._current_frames().items(): print(threadId) traceback.print_stack(stack) print() def initialize_if_enabled(): backdoor_locals = { 'exit': _dont_use_this, # So we don't exit the entire process 'quit': _dont_use_this, # So we don't exit the entire process 'fo': _find_objects, 'pgt': _print_greenthreads, 'pnt': _print_nativethreads, } if CONF.backdoor_port is None: return None # NOTE(johannes): The standard sys.displayhook will print the value of # the last expression and set it to __builtin__._, which overwrites # the __builtin__._ that gettext sets. Let's switch to using pprint # since it won't interact poorly with gettext, and it's easier to # read the output too. def displayhook(val): if val is not None: pprint.pprint(val) sys.displayhook = displayhook sock = eventlet.listen(('localhost', CONF.backdoor_port)) port = sock.getsockname()[1] eventlet.spawn_n(eventlet.backdoor.backdoor_server, sock, locals=backdoor_locals) return port ironic-2014.1.rc1/ironic/openstack/common/timeutils.py0000664000175300017540000001351712316614116024050 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2011 OpenStack Foundation. # 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. """ Time related utilities and helper functions. """ import calendar import datetime import time import iso8601 import six # ISO 8601 extended time format with microseconds _ISO8601_TIME_FORMAT_SUBSECOND = '%Y-%m-%dT%H:%M:%S.%f' _ISO8601_TIME_FORMAT = '%Y-%m-%dT%H:%M:%S' PERFECT_TIME_FORMAT = _ISO8601_TIME_FORMAT_SUBSECOND def isotime(at=None, subsecond=False): """Stringify time in ISO 8601 format.""" if not at: at = utcnow() st = at.strftime(_ISO8601_TIME_FORMAT if not subsecond else _ISO8601_TIME_FORMAT_SUBSECOND) tz = at.tzinfo.tzname(None) if at.tzinfo else 'UTC' st += ('Z' if tz == 'UTC' else tz) return st def parse_isotime(timestr): """Parse time from ISO 8601 format.""" try: return iso8601.parse_date(timestr) except iso8601.ParseError as e: raise ValueError(six.text_type(e)) except TypeError as e: raise ValueError(six.text_type(e)) def strtime(at=None, fmt=PERFECT_TIME_FORMAT): """Returns formatted utcnow.""" if not at: at = utcnow() return at.strftime(fmt) def parse_strtime(timestr, fmt=PERFECT_TIME_FORMAT): """Turn a formatted time back into a datetime.""" return datetime.datetime.strptime(timestr, fmt) def normalize_time(timestamp): """Normalize time in arbitrary timezone to UTC naive object.""" offset = timestamp.utcoffset() if offset is None: return timestamp return timestamp.replace(tzinfo=None) - offset def is_older_than(before, seconds): """Return True if before is older than seconds.""" if isinstance(before, six.string_types): before = parse_strtime(before).replace(tzinfo=None) return utcnow() - before > datetime.timedelta(seconds=seconds) def is_newer_than(after, seconds): """Return True if after is newer than seconds.""" if isinstance(after, six.string_types): after = parse_strtime(after).replace(tzinfo=None) return after - utcnow() > datetime.timedelta(seconds=seconds) def utcnow_ts(): """Timestamp version of our utcnow function.""" if utcnow.override_time is None: # NOTE(kgriffs): This is several times faster # than going through calendar.timegm(...) return int(time.time()) return calendar.timegm(utcnow().timetuple()) def utcnow(): """Overridable version of utils.utcnow.""" if utcnow.override_time: try: return utcnow.override_time.pop(0) except AttributeError: return utcnow.override_time return datetime.datetime.utcnow() def iso8601_from_timestamp(timestamp): """Returns a iso8601 formated date from timestamp.""" return isotime(datetime.datetime.utcfromtimestamp(timestamp)) utcnow.override_time = None def set_time_override(override_time=None): """Overrides utils.utcnow. Make it return a constant time or a list thereof, one at a time. :param override_time: datetime instance or list thereof. If not given, defaults to the current UTC time. """ utcnow.override_time = override_time or datetime.datetime.utcnow() def advance_time_delta(timedelta): """Advance overridden time using a datetime.timedelta.""" assert(not utcnow.override_time is None) try: for dt in utcnow.override_time: dt += timedelta except TypeError: utcnow.override_time += timedelta def advance_time_seconds(seconds): """Advance overridden time by seconds.""" advance_time_delta(datetime.timedelta(0, seconds)) def clear_time_override(): """Remove the overridden time.""" utcnow.override_time = None def marshall_now(now=None): """Make an rpc-safe datetime with microseconds. Note: tzinfo is stripped, but not required for relative times. """ if not now: now = utcnow() return dict(day=now.day, month=now.month, year=now.year, hour=now.hour, minute=now.minute, second=now.second, microsecond=now.microsecond) def unmarshall_time(tyme): """Unmarshall a datetime dict.""" return datetime.datetime(day=tyme['day'], month=tyme['month'], year=tyme['year'], hour=tyme['hour'], minute=tyme['minute'], second=tyme['second'], microsecond=tyme['microsecond']) def delta_seconds(before, after): """Return the difference between two timing objects. Compute the difference in seconds between two date, time, or datetime objects (as a float, to microsecond resolution). """ delta = after - before try: return delta.total_seconds() except AttributeError: return ((delta.days * 24 * 3600) + delta.seconds + float(delta.microseconds) / (10 ** 6)) def is_soon(dt, window): """Determines if time is going to happen in the next window seconds. :params dt: the time :params window: minimum seconds to remain to consider the time not soon :return: True if expiration is within the given duration """ soon = (utcnow() + datetime.timedelta(seconds=window)) return normalize_time(dt) <= soon ironic-2014.1.rc1/ironic/openstack/common/config/0000775000175300017540000000000012316614636022724 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/openstack/common/config/__init__.py0000664000175300017540000000000012316614116025014 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/openstack/common/config/generator.py0000664000175300017540000002425012316614116025260 0ustar jenkinsjenkins00000000000000# Copyright 2012 SINA Corporation # Copyright 2014 Cisco Systems, Inc. # 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. # """Extracts OpenStack config option info from module(s).""" from __future__ import print_function import argparse import imp import os import re import socket import sys import textwrap from oslo.config import cfg import six import stevedore.named from ironic.openstack.common import gettextutils from ironic.openstack.common import importutils gettextutils.install('ironic') STROPT = "StrOpt" BOOLOPT = "BoolOpt" INTOPT = "IntOpt" FLOATOPT = "FloatOpt" LISTOPT = "ListOpt" DICTOPT = "DictOpt" MULTISTROPT = "MultiStrOpt" OPT_TYPES = { STROPT: 'string value', BOOLOPT: 'boolean value', INTOPT: 'integer value', FLOATOPT: 'floating point value', LISTOPT: 'list value', DICTOPT: 'dict value', MULTISTROPT: 'multi valued', } OPTION_REGEX = re.compile(r"(%s)" % "|".join([STROPT, BOOLOPT, INTOPT, FLOATOPT, LISTOPT, DICTOPT, MULTISTROPT])) PY_EXT = ".py" BASEDIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../../")) WORDWRAP_WIDTH = 60 def generate(argv): parser = argparse.ArgumentParser( description='generate sample configuration file', ) parser.add_argument('-m', dest='modules', action='append') parser.add_argument('-l', dest='libraries', action='append') parser.add_argument('srcfiles', nargs='*') parsed_args = parser.parse_args(argv) mods_by_pkg = dict() for filepath in parsed_args.srcfiles: pkg_name = filepath.split(os.sep)[1] mod_str = '.'.join(['.'.join(filepath.split(os.sep)[:-1]), os.path.basename(filepath).split('.')[0]]) mods_by_pkg.setdefault(pkg_name, list()).append(mod_str) # NOTE(lzyeval): place top level modules before packages pkg_names = sorted(pkg for pkg in mods_by_pkg if pkg.endswith(PY_EXT)) ext_names = sorted(pkg for pkg in mods_by_pkg if pkg not in pkg_names) pkg_names.extend(ext_names) # opts_by_group is a mapping of group name to an options list # The options list is a list of (module, options) tuples opts_by_group = {'DEFAULT': []} if parsed_args.modules: for module_name in parsed_args.modules: module = _import_module(module_name) if module: for group, opts in _list_opts(module): opts_by_group.setdefault(group, []).append((module_name, opts)) # Look for entry points defined in libraries (or applications) for # option discovery, and include their return values in the output. # # Each entry point should be a function returning an iterable # of pairs with the group name (or None for the default group) # and the list of Opt instances for that group. if parsed_args.libraries: loader = stevedore.named.NamedExtensionManager( 'oslo.config.opts', names=list(set(parsed_args.libraries)), invoke_on_load=False, ) for ext in loader: for group, opts in ext.plugin(): opt_list = opts_by_group.setdefault(group or 'DEFAULT', []) opt_list.append((ext.name, opts)) for pkg_name in pkg_names: mods = mods_by_pkg.get(pkg_name) mods.sort() for mod_str in mods: if mod_str.endswith('.__init__'): mod_str = mod_str[:mod_str.rfind(".")] mod_obj = _import_module(mod_str) if not mod_obj: raise RuntimeError("Unable to import module %s" % mod_str) for group, opts in _list_opts(mod_obj): opts_by_group.setdefault(group, []).append((mod_str, opts)) print_group_opts('DEFAULT', opts_by_group.pop('DEFAULT', [])) for group in sorted(opts_by_group.keys()): print_group_opts(group, opts_by_group[group]) def _import_module(mod_str): try: if mod_str.startswith('bin.'): imp.load_source(mod_str[4:], os.path.join('bin', mod_str[4:])) return sys.modules[mod_str[4:]] else: return importutils.import_module(mod_str) except Exception as e: sys.stderr.write("Error importing module %s: %s\n" % (mod_str, str(e))) return None def _is_in_group(opt, group): "Check if opt is in group." for value in group._opts.values(): # NOTE(llu): Temporary workaround for bug #1262148, wait until # newly released oslo.config support '==' operator. if not(value['opt'] != opt): return True return False def _guess_groups(opt, mod_obj): # is it in the DEFAULT group? if _is_in_group(opt, cfg.CONF): return 'DEFAULT' # what other groups is it in? for value in cfg.CONF.values(): if isinstance(value, cfg.CONF.GroupAttr): if _is_in_group(opt, value._group): return value._group.name raise RuntimeError( "Unable to find group for option %s, " "maybe it's defined twice in the same group?" % opt.name ) def _list_opts(obj): def is_opt(o): return (isinstance(o, cfg.Opt) and not isinstance(o, cfg.SubCommandOpt)) opts = list() for attr_str in dir(obj): attr_obj = getattr(obj, attr_str) if is_opt(attr_obj): opts.append(attr_obj) elif (isinstance(attr_obj, list) and all(map(lambda x: is_opt(x), attr_obj))): opts.extend(attr_obj) ret = {} for opt in opts: ret.setdefault(_guess_groups(opt, obj), []).append(opt) return ret.items() def print_group_opts(group, opts_by_module): print("[%s]" % group) print('') for mod, opts in opts_by_module: print('#') print('# Options defined in %s' % mod) print('#') print('') for opt in opts: _print_opt(opt) print('') def _get_my_ip(): try: csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) csock.connect(('8.8.8.8', 80)) (addr, port) = csock.getsockname() csock.close() return addr except socket.error: return None def _sanitize_default(name, value): """Set up a reasonably sensible default for pybasedir, my_ip and host.""" if value.startswith(sys.prefix): # NOTE(jd) Don't use os.path.join, because it is likely to think the # second part is an absolute pathname and therefore drop the first # part. value = os.path.normpath("/usr/" + value[len(sys.prefix):]) elif value.startswith(BASEDIR): return value.replace(BASEDIR, '/usr/lib/python/site-packages') elif BASEDIR in value: return value.replace(BASEDIR, '') elif value == _get_my_ip(): return '10.0.0.1' elif value in (socket.gethostname(), socket.getfqdn()) and 'host' in name: return 'ironic' elif value.strip() != value: return '"%s"' % value return value def _print_opt(opt): opt_name, opt_default, opt_help = opt.dest, opt.default, opt.help if not opt_help: sys.stderr.write('WARNING: "%s" is missing help string.\n' % opt_name) opt_help = "" opt_type = None try: opt_type = OPTION_REGEX.search(str(type(opt))).group(0) except (ValueError, AttributeError) as err: sys.stderr.write("%s\n" % str(err)) sys.exit(1) opt_help = u'%s (%s)' % (opt_help, OPT_TYPES[opt_type]) print('#', "\n# ".join(textwrap.wrap(opt_help, WORDWRAP_WIDTH))) if opt.deprecated_opts: for deprecated_opt in opt.deprecated_opts: if deprecated_opt.name: deprecated_group = (deprecated_opt.group if deprecated_opt.group else "DEFAULT") print('# Deprecated group/name - [%s]/%s' % (deprecated_group, deprecated_opt.name)) try: if opt_default is None: print('#%s=' % opt_name) elif opt_type == STROPT: assert(isinstance(opt_default, six.string_types)) print('#%s=%s' % (opt_name, _sanitize_default(opt_name, opt_default))) elif opt_type == BOOLOPT: assert(isinstance(opt_default, bool)) print('#%s=%s' % (opt_name, str(opt_default).lower())) elif opt_type == INTOPT: assert(isinstance(opt_default, int) and not isinstance(opt_default, bool)) print('#%s=%s' % (opt_name, opt_default)) elif opt_type == FLOATOPT: assert(isinstance(opt_default, float)) print('#%s=%s' % (opt_name, opt_default)) elif opt_type == LISTOPT: assert(isinstance(opt_default, list)) print('#%s=%s' % (opt_name, ','.join(opt_default))) elif opt_type == DICTOPT: assert(isinstance(opt_default, dict)) opt_default_strlist = [str(key) + ':' + str(value) for (key, value) in opt_default.items()] print('#%s=%s' % (opt_name, ','.join(opt_default_strlist))) elif opt_type == MULTISTROPT: assert(isinstance(opt_default, list)) if not opt_default: opt_default = [''] for default in opt_default: print('#%s=%s' % (opt_name, default)) print('') except Exception: sys.stderr.write('Error in option "%s"\n' % opt_name) sys.exit(1) def main(): generate(sys.argv[1:]) if __name__ == '__main__': main() ironic-2014.1.rc1/ironic/openstack/common/network_utils.py0000664000175300017540000000422212316614116024733 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2012 OpenStack Foundation. # 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. """ Network-related utilities and helper functions. """ from ironic.openstack.common import log as logging LOG = logging.getLogger(__name__) def parse_host_port(address, default_port=None): """ Interpret a string as a host:port pair. An IPv6 address MUST be escaped if accompanied by a port, because otherwise ambiguity ensues: 2001:db8:85a3::8a2e:370:7334 means both [2001:db8:85a3::8a2e:370:7334] and [2001:db8:85a3::8a2e:370]:7334. >>> parse_host_port('server01:80') ('server01', 80) >>> parse_host_port('server01') ('server01', None) >>> parse_host_port('server01', default_port=1234) ('server01', 1234) >>> parse_host_port('[::1]:80') ('::1', 80) >>> parse_host_port('[::1]') ('::1', None) >>> parse_host_port('[::1]', default_port=1234) ('::1', 1234) >>> parse_host_port('2001:db8:85a3::8a2e:370:7334', default_port=1234) ('2001:db8:85a3::8a2e:370:7334', 1234) """ if address[0] == '[': # Escaped ipv6 _host, _port = address[1:].split(']') host = _host if ':' in _port: port = _port.split(':')[1] else: port = default_port else: if address.count(':') == 1: host, port = address.split(':') else: # 0 means ipv4, >1 means ipv6. # We prohibit unescaped ipv6 addresses with port. host = address port = default_port return (host, None if port is None else int(port)) ironic-2014.1.rc1/ironic/openstack/common/log_handler.py0000664000175300017540000000212412316614116024277 0ustar jenkinsjenkins00000000000000# Copyright 2013 IBM Corp. # # 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 logging from oslo.config import cfg from ironic.openstack.common import notifier class PublishErrorsHandler(logging.Handler): def emit(self, record): if ('ironic.openstack.common.notifier.log_notifier' in cfg.CONF.notification_driver): return notifier.api.notify(None, 'error.publisher', 'error_notification', notifier.api.ERROR, dict(error=record.getMessage())) ironic-2014.1.rc1/ironic/openstack/common/processutils.py0000664000175300017540000002173612316614116024572 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2011 OpenStack Foundation. # 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. """ System-level utilities and helper functions. """ import os import random import shlex import signal from eventlet.green import subprocess from eventlet import greenthread from ironic.openstack.common.gettextutils import _ from ironic.openstack.common import log as logging LOG = logging.getLogger(__name__) class InvalidArgumentError(Exception): def __init__(self, message=None): super(InvalidArgumentError, self).__init__(message) class UnknownArgumentError(Exception): def __init__(self, message=None): super(UnknownArgumentError, self).__init__(message) class ProcessExecutionError(Exception): def __init__(self, stdout=None, stderr=None, exit_code=None, cmd=None, description=None): self.exit_code = exit_code self.stderr = stderr self.stdout = stdout self.cmd = cmd self.description = description if description is None: description = "Unexpected error while running command." if exit_code is None: exit_code = '-' message = ("%s\nCommand: %s\nExit code: %s\nStdout: %r\nStderr: %r" % (description, cmd, exit_code, stdout, stderr)) super(ProcessExecutionError, self).__init__(message) class NoRootWrapSpecified(Exception): def __init__(self, message=None): super(NoRootWrapSpecified, self).__init__(message) def _subprocess_setup(): # Python installs a SIGPIPE handler by default. This is usually not what # non-Python subprocesses expect. signal.signal(signal.SIGPIPE, signal.SIG_DFL) def execute(*cmd, **kwargs): """ Helper method to shell out and execute a command through subprocess with optional retry. :param cmd: Passed to subprocess.Popen. :type cmd: string :param process_input: Send to opened process. :type proces_input: string :param check_exit_code: Single bool, int, or list of allowed exit codes. Defaults to [0]. Raise :class:`ProcessExecutionError` unless program exits with one of these code. :type check_exit_code: boolean, int, or [int] :param delay_on_retry: True | False. Defaults to True. If set to True, wait a short amount of time before retrying. :type delay_on_retry: boolean :param attempts: How many times to retry cmd. :type attempts: int :param run_as_root: True | False. Defaults to False. If set to True, the command is prefixed by the command specified in the root_helper kwarg. :type run_as_root: boolean :param root_helper: command to prefix to commands called with run_as_root=True :type root_helper: string :param shell: whether or not there should be a shell used to execute this command. Defaults to false. :type shell: boolean :returns: (stdout, stderr) from process execution :raises: :class:`UnknownArgumentError` on receiving unknown arguments :raises: :class:`ProcessExecutionError` """ process_input = kwargs.pop('process_input', None) check_exit_code = kwargs.pop('check_exit_code', [0]) ignore_exit_code = False delay_on_retry = kwargs.pop('delay_on_retry', True) attempts = kwargs.pop('attempts', 1) run_as_root = kwargs.pop('run_as_root', False) root_helper = kwargs.pop('root_helper', '') shell = kwargs.pop('shell', False) if isinstance(check_exit_code, bool): ignore_exit_code = not check_exit_code check_exit_code = [0] elif isinstance(check_exit_code, int): check_exit_code = [check_exit_code] if kwargs: raise UnknownArgumentError(_('Got unknown keyword args ' 'to utils.execute: %r') % kwargs) if run_as_root and os.geteuid() != 0: if not root_helper: raise NoRootWrapSpecified( message=('Command requested root, but did not specify a root ' 'helper.')) cmd = shlex.split(root_helper) + list(cmd) cmd = map(str, cmd) while attempts > 0: attempts -= 1 try: LOG.debug(_('Running cmd (subprocess): %s'), ' '.join(cmd)) _PIPE = subprocess.PIPE # pylint: disable=E1101 if os.name == 'nt': preexec_fn = None close_fds = False else: preexec_fn = _subprocess_setup close_fds = True obj = subprocess.Popen(cmd, stdin=_PIPE, stdout=_PIPE, stderr=_PIPE, close_fds=close_fds, preexec_fn=preexec_fn, shell=shell) result = None if process_input is not None: result = obj.communicate(process_input) else: result = obj.communicate() obj.stdin.close() # pylint: disable=E1101 _returncode = obj.returncode # pylint: disable=E1101 if _returncode: LOG.debug(_('Result was %s') % _returncode) if not ignore_exit_code and _returncode not in check_exit_code: (stdout, stderr) = result raise ProcessExecutionError(exit_code=_returncode, stdout=stdout, stderr=stderr, cmd=' '.join(cmd)) return result except ProcessExecutionError: if not attempts: raise else: LOG.debug(_('%r failed. Retrying.'), cmd) if delay_on_retry: greenthread.sleep(random.randint(20, 200) / 100.0) finally: # NOTE(termie): this appears to be necessary to let the subprocess # call clean something up in between calls, without # it two execute calls in a row hangs the second one greenthread.sleep(0) def trycmd(*args, **kwargs): """ A wrapper around execute() to more easily handle warnings and errors. Returns an (out, err) tuple of strings containing the output of the command's stdout and stderr. If 'err' is not empty then the command can be considered to have failed. :discard_warnings True | False. Defaults to False. If set to True, then for succeeding commands, stderr is cleared """ discard_warnings = kwargs.pop('discard_warnings', False) try: out, err = execute(*args, **kwargs) failed = False except ProcessExecutionError, exn: out, err = '', str(exn) failed = True if not failed and discard_warnings and err: # Handle commands that output to stderr but otherwise succeed err = '' return out, err def ssh_execute(ssh, cmd, process_input=None, addl_env=None, check_exit_code=True): LOG.debug(_('Running cmd (SSH): %s'), cmd) if addl_env: raise InvalidArgumentError(_('Environment not supported over SSH')) if process_input: # This is (probably) fixable if we need it... raise InvalidArgumentError(_('process_input not supported over SSH')) stdin_stream, stdout_stream, stderr_stream = ssh.exec_command(cmd) channel = stdout_stream.channel # NOTE(justinsb): This seems suspicious... # ...other SSH clients have buffering issues with this approach stdout = stdout_stream.read() stderr = stderr_stream.read() stdin_stream.close() exit_status = channel.recv_exit_status() # exit_status == -1 if no exit code was returned if exit_status != -1: LOG.debug(_('Result was %s') % exit_status) if check_exit_code and exit_status != 0: raise ProcessExecutionError(exit_code=exit_status, stdout=stdout, stderr=stderr, cmd=cmd) return (stdout, stderr) ironic-2014.1.rc1/ironic/openstack/common/versionutils.py0000664000175300017540000000330012316614116024564 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright (c) 2013 OpenStack Foundation # 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. """ Helpers for comparing version strings. """ import pkg_resources def is_compatible(requested_version, current_version, same_major=True): """Determine whether `requested_version` is satisfied by `current_version`; in other words, `current_version` is >= `requested_version`. :param requested_version: version to check for compatibility :param current_version: version to check against :param same_major: if True, the major version must be identical between `requested_version` and `current_version`. This is used when a major-version difference indicates incompatibility between the two versions. Since this is the common-case in practice, the default is True. :returns: True if compatible, False if not """ requested_parts = pkg_resources.parse_version(requested_version) current_parts = pkg_resources.parse_version(current_version) if same_major and (requested_parts[0] != current_parts[0]): return False return current_parts >= requested_parts ironic-2014.1.rc1/ironic/openstack/common/__init__.py0000664000175300017540000000010312316614116023553 0ustar jenkinsjenkins00000000000000import six six.add_move(six.MovedModule('mox', 'mox', 'mox3.mox')) ironic-2014.1.rc1/ironic/openstack/common/excutils.py0000664000175300017540000000724312316614116023670 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2011 OpenStack Foundation. # Copyright 2012, Red Hat, Inc. # # 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. """ Exception related utilities. """ import logging import sys import time import traceback import six from ironic.openstack.common.gettextutils import _ # noqa class save_and_reraise_exception(object): """Save current exception, run some code and then re-raise. In some cases the exception context can be cleared, resulting in None being attempted to be re-raised after an exception handler is run. This can happen when eventlet switches greenthreads or when running an exception handler, code raises and catches an exception. In both cases the exception context will be cleared. To work around this, we save the exception state, run handler code, and then re-raise the original exception. If another exception occurs, the saved exception is logged and the new exception is re-raised. In some cases the caller may not want to re-raise the exception, and for those circumstances this context provides a reraise flag that can be used to suppress the exception. For example: except Exception: with save_and_reraise_exception() as ctxt: decide_if_need_reraise() if not should_be_reraised: ctxt.reraise = False """ def __init__(self): self.reraise = True def __enter__(self): self.type_, self.value, self.tb, = sys.exc_info() return self def __exit__(self, exc_type, exc_val, exc_tb): if exc_type is not None: logging.error(_('Original exception being dropped: %s'), traceback.format_exception(self.type_, self.value, self.tb)) return False if self.reraise: six.reraise(self.type_, self.value, self.tb) def forever_retry_uncaught_exceptions(infunc): def inner_func(*args, **kwargs): last_log_time = 0 last_exc_message = None exc_count = 0 while True: try: return infunc(*args, **kwargs) except Exception as exc: this_exc_message = six.u(str(exc)) if this_exc_message == last_exc_message: exc_count += 1 else: exc_count = 1 # Do not log any more frequently than once a minute unless # the exception message changes cur_time = int(time.time()) if (cur_time - last_log_time > 60 or this_exc_message != last_exc_message): logging.exception( _('Unexpected exception occurred %d time(s)... ' 'retrying.') % exc_count) last_log_time = cur_time last_exc_message = this_exc_message exc_count = 0 # This should be a very rare event. In case it isn't, do # a sleep. time.sleep(1) return inner_func ironic-2014.1.rc1/ironic/openstack/common/service.py0000664000175300017540000003532412316614116023471 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # Copyright 2011 Justin Santa Barbara # 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. """Generic Node base class for all workers that run on hosts.""" import errno import logging as std_logging import os import random import signal import sys import time try: # Importing just the symbol here because the io module does not # exist in Python 2.6. from io import UnsupportedOperation # noqa except ImportError: # Python 2.6 UnsupportedOperation = None import eventlet from eventlet import event from oslo.config import cfg from ironic.openstack.common import eventlet_backdoor from ironic.openstack.common.gettextutils import _ from ironic.openstack.common import importutils from ironic.openstack.common import log as logging from ironic.openstack.common import threadgroup rpc = importutils.try_import('ironic.openstack.common.rpc') CONF = cfg.CONF LOG = logging.getLogger(__name__) def _sighup_supported(): return hasattr(signal, 'SIGHUP') def _is_daemon(): # The process group for a foreground process will match the # process group of the controlling terminal. If those values do # not match, or ioctl() fails on the stdout file handle, we assume # the process is running in the background as a daemon. # http://www.gnu.org/software/bash/manual/bashref.html#Job-Control-Basics try: is_daemon = os.getpgrp() != os.tcgetpgrp(sys.stdout.fileno()) except OSError as err: if err.errno == errno.ENOTTY: # Assume we are a daemon because there is no terminal. is_daemon = True else: raise except UnsupportedOperation: # Could not get the fileno for stdout, so we must be a daemon. is_daemon = True return is_daemon def _is_sighup_and_daemon(signo): if not (_sighup_supported() and signo == signal.SIGHUP): # Avoid checking if we are a daemon, because the signal isn't # SIGHUP. return False return _is_daemon() def _signo_to_signame(signo): signals = {signal.SIGTERM: 'SIGTERM', signal.SIGINT: 'SIGINT'} if _sighup_supported(): signals[signal.SIGHUP] = 'SIGHUP' return signals[signo] def _set_signals_handler(handler): signal.signal(signal.SIGTERM, handler) signal.signal(signal.SIGINT, handler) if _sighup_supported(): signal.signal(signal.SIGHUP, handler) class Launcher(object): """Launch one or more services and wait for them to complete.""" def __init__(self): """Initialize the service launcher. :returns: None """ self.services = Services() self.backdoor_port = eventlet_backdoor.initialize_if_enabled() def launch_service(self, service): """Load and start the given service. :param service: The service you would like to start. :returns: None """ service.backdoor_port = self.backdoor_port self.services.add(service) def stop(self): """Stop all services which are currently running. :returns: None """ self.services.stop() def wait(self): """Waits until all services have been stopped, and then returns. :returns: None """ self.services.wait() def restart(self): """Reload config files and restart service. :returns: None """ cfg.CONF.reload_config_files() self.services.restart() class SignalExit(SystemExit): def __init__(self, signo, exccode=1): super(SignalExit, self).__init__(exccode) self.signo = signo class ServiceLauncher(Launcher): def _handle_signal(self, signo, frame): # Allow the process to be killed again and die from natural causes _set_signals_handler(signal.SIG_DFL) raise SignalExit(signo) def handle_signal(self): _set_signals_handler(self._handle_signal) def _wait_for_exit_or_signal(self, ready_callback=None): status = None signo = 0 LOG.debug(_('Full set of CONF:')) CONF.log_opt_values(LOG, std_logging.DEBUG) try: if ready_callback: ready_callback() super(ServiceLauncher, self).wait() except SignalExit as exc: signame = _signo_to_signame(exc.signo) LOG.info(_('Caught %s, exiting'), signame) status = exc.code signo = exc.signo except SystemExit as exc: status = exc.code finally: self.stop() if rpc: try: rpc.cleanup() except Exception: # We're shutting down, so it doesn't matter at this point. LOG.exception(_('Exception during rpc cleanup.')) return status, signo def wait(self, ready_callback=None): while True: self.handle_signal() status, signo = self._wait_for_exit_or_signal(ready_callback) if not _is_sighup_and_daemon(signo): return status self.restart() class ServiceWrapper(object): def __init__(self, service, workers): self.service = service self.workers = workers self.children = set() self.forktimes = [] class ProcessLauncher(object): def __init__(self, wait_interval=0.01): """Constructor. :param wait_interval: The interval to sleep for between checks of child process exit. """ self.children = {} self.sigcaught = None self.running = True self.wait_interval = wait_interval rfd, self.writepipe = os.pipe() self.readpipe = eventlet.greenio.GreenPipe(rfd, 'r') self.handle_signal() def handle_signal(self): _set_signals_handler(self._handle_signal) def _handle_signal(self, signo, frame): self.sigcaught = signo self.running = False # Allow the process to be killed again and die from natural causes _set_signals_handler(signal.SIG_DFL) def _pipe_watcher(self): # This will block until the write end is closed when the parent # dies unexpectedly self.readpipe.read() LOG.info(_('Parent process has died unexpectedly, exiting')) sys.exit(1) def _child_process_handle_signal(self): # Setup child signal handlers differently def _sigterm(*args): signal.signal(signal.SIGTERM, signal.SIG_DFL) raise SignalExit(signal.SIGTERM) def _sighup(*args): signal.signal(signal.SIGHUP, signal.SIG_DFL) raise SignalExit(signal.SIGHUP) signal.signal(signal.SIGTERM, _sigterm) if _sighup_supported(): signal.signal(signal.SIGHUP, _sighup) # Block SIGINT and let the parent send us a SIGTERM signal.signal(signal.SIGINT, signal.SIG_IGN) def _child_wait_for_exit_or_signal(self, launcher): status = 0 signo = 0 # NOTE(johannes): All exceptions are caught to ensure this # doesn't fallback into the loop spawning children. It would # be bad for a child to spawn more children. try: launcher.wait() except SignalExit as exc: signame = _signo_to_signame(exc.signo) LOG.info(_('Caught %s, exiting'), signame) status = exc.code signo = exc.signo except SystemExit as exc: status = exc.code except BaseException: LOG.exception(_('Unhandled exception')) status = 2 finally: launcher.stop() return status, signo def _child_process(self, service): self._child_process_handle_signal() # Reopen the eventlet hub to make sure we don't share an epoll # fd with parent and/or siblings, which would be bad eventlet.hubs.use_hub() # Close write to ensure only parent has it open os.close(self.writepipe) # Create greenthread to watch for parent to close pipe eventlet.spawn_n(self._pipe_watcher) # Reseed random number generator random.seed() launcher = Launcher() launcher.launch_service(service) return launcher def _start_child(self, wrap): if len(wrap.forktimes) > wrap.workers: # Limit ourselves to one process a second (over the period of # number of workers * 1 second). This will allow workers to # start up quickly but ensure we don't fork off children that # die instantly too quickly. if time.time() - wrap.forktimes[0] < wrap.workers: LOG.info(_('Forking too fast, sleeping')) time.sleep(1) wrap.forktimes.pop(0) wrap.forktimes.append(time.time()) pid = os.fork() if pid == 0: launcher = self._child_process(wrap.service) while True: self._child_process_handle_signal() status, signo = self._child_wait_for_exit_or_signal(launcher) if not _is_sighup_and_daemon(signo): break launcher.restart() os._exit(status) LOG.info(_('Started child %d'), pid) wrap.children.add(pid) self.children[pid] = wrap return pid def launch_service(self, service, workers=1): wrap = ServiceWrapper(service, workers) LOG.info(_('Starting %d workers'), wrap.workers) while self.running and len(wrap.children) < wrap.workers: self._start_child(wrap) def _wait_child(self): try: # Don't block if no child processes have exited pid, status = os.waitpid(0, os.WNOHANG) if not pid: return None except OSError as exc: if exc.errno not in (errno.EINTR, errno.ECHILD): raise return None if os.WIFSIGNALED(status): sig = os.WTERMSIG(status) LOG.info(_('Child %(pid)d killed by signal %(sig)d'), dict(pid=pid, sig=sig)) else: code = os.WEXITSTATUS(status) LOG.info(_('Child %(pid)s exited with status %(code)d'), dict(pid=pid, code=code)) if pid not in self.children: LOG.warning(_('pid %d not in child list'), pid) return None wrap = self.children.pop(pid) wrap.children.remove(pid) return wrap def _respawn_children(self): while self.running: wrap = self._wait_child() if not wrap: # Yield to other threads if no children have exited # Sleep for a short time to avoid excessive CPU usage # (see bug #1095346) eventlet.greenthread.sleep(self.wait_interval) continue while self.running and len(wrap.children) < wrap.workers: self._start_child(wrap) def wait(self): """Loop waiting on children to die and respawning as necessary.""" LOG.debug(_('Full set of CONF:')) CONF.log_opt_values(LOG, std_logging.DEBUG) while True: self.handle_signal() self._respawn_children() if self.sigcaught: signame = _signo_to_signame(self.sigcaught) LOG.info(_('Caught %s, stopping children'), signame) if not _is_sighup_and_daemon(self.sigcaught): break for pid in self.children: os.kill(pid, signal.SIGHUP) self.running = True self.sigcaught = None for pid in self.children: try: os.kill(pid, signal.SIGTERM) except OSError as exc: if exc.errno != errno.ESRCH: raise # Wait for children to die if self.children: LOG.info(_('Waiting on %d children to exit'), len(self.children)) while self.children: self._wait_child() class Service(object): """Service object for binaries running on hosts.""" def __init__(self, threads=1000): self.tg = threadgroup.ThreadGroup(threads) # signal that the service is done shutting itself down: self._done = event.Event() def reset(self): # NOTE(Fengqian): docs for Event.reset() recommend against using it self._done = event.Event() def start(self): pass def stop(self): self.tg.stop() self.tg.wait() # Signal that service cleanup is done: if not self._done.ready(): self._done.send() def wait(self): self._done.wait() class Services(object): def __init__(self): self.services = [] self.tg = threadgroup.ThreadGroup() self.done = event.Event() def add(self, service): self.services.append(service) self.tg.add_thread(self.run_service, service, self.done) def stop(self): # wait for graceful shutdown of services: for service in self.services: service.stop() service.wait() # Each service has performed cleanup, now signal that the run_service # wrapper threads can now die: if not self.done.ready(): self.done.send() # reap threads: self.tg.stop() def wait(self): self.tg.wait() def restart(self): self.stop() self.done = event.Event() for restart_service in self.services: restart_service.reset() self.tg.add_thread(self.run_service, restart_service, self.done) @staticmethod def run_service(service, done): """Service start wrapper. :param service: service to run :param done: event to wait on until a shutdown is triggered :returns: None """ service.start() done.wait() def launch(service, workers=1): if workers is None or workers == 1: launcher = ServiceLauncher() launcher.launch_service(service) else: launcher = ProcessLauncher() launcher.launch_service(service, workers=workers) return launcher ironic-2014.1.rc1/ironic/openstack/common/context.py0000664000175300017540000000743412316614116023516 0ustar jenkinsjenkins00000000000000# Copyright 2011 OpenStack Foundation. # 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. """ Simple class that stores security context information in the web request. Projects should subclass this class if they wish to enhance the request context or provide additional information in their specific WSGI pipeline. """ import itertools import uuid def generate_request_id(): return 'req-%s' % str(uuid.uuid4()) class RequestContext(object): """Helper class to represent useful information about a request context. Stores information about the security context under which the user accesses the system, as well as additional request information. """ user_idt_format = '{user} {tenant} {domain} {user_domain} {p_domain}' def __init__(self, auth_token=None, user=None, tenant=None, domain=None, user_domain=None, project_domain=None, is_admin=False, read_only=False, show_deleted=False, request_id=None, instance_uuid=None): self.auth_token = auth_token self.user = user self.tenant = tenant self.domain = domain self.user_domain = user_domain self.project_domain = project_domain self.is_admin = is_admin self.read_only = read_only self.show_deleted = show_deleted self.instance_uuid = instance_uuid if not request_id: request_id = generate_request_id() self.request_id = request_id def to_dict(self): user_idt = ( self.user_idt_format.format(user=self.user or '-', tenant=self.tenant or '-', domain=self.domain or '-', user_domain=self.user_domain or '-', p_domain=self.project_domain or '-')) return {'user': self.user, 'tenant': self.tenant, 'domain': self.domain, 'user_domain': self.user_domain, 'project_domain': self.project_domain, 'is_admin': self.is_admin, 'read_only': self.read_only, 'show_deleted': self.show_deleted, 'auth_token': self.auth_token, 'request_id': self.request_id, 'instance_uuid': self.instance_uuid, 'user_identity': user_idt} def get_admin_context(show_deleted=False): context = RequestContext(None, tenant=None, is_admin=True, show_deleted=show_deleted) return context def get_context_from_function_and_args(function, args, kwargs): """Find an arg of type RequestContext and return it. This is useful in a couple of decorators where we don't know much about the function we're wrapping. """ for arg in itertools.chain(kwargs.values(), args): if isinstance(arg, RequestContext): return arg return None def is_user_context(context): """Indicates if the request context is a normal user.""" if not context: return False if context.is_admin: return False if not context.user_id or not context.project_id: return False return True ironic-2014.1.rc1/ironic/openstack/common/cliutils.py0000664000175300017540000000365412316614116023662 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2012 Red Hat, Inc. # # 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 inspect class MissingArgs(Exception): def __init__(self, missing): self.missing = missing def __str__(self): if len(self.missing) == 1: return "An argument is missing" else: return ("%(num)d arguments are missing" % dict(num=len(self.missing))) def validate_args(fn, *args, **kwargs): """Check that the supplied args are sufficient for calling a function. >>> validate_args(lambda a: None) Traceback (most recent call last): ... MissingArgs: An argument is missing >>> validate_args(lambda a, b, c, d: None, 0, c=1) Traceback (most recent call last): ... MissingArgs: 2 arguments are missing :param fn: the function to check :param arg: the positional arguments supplied :param kwargs: the keyword arguments supplied """ argspec = inspect.getargspec(fn) num_defaults = len(argspec.defaults or []) required_args = argspec.args[:len(argspec.args) - num_defaults] def isbound(method): return getattr(method, 'im_self', None) is not None if isbound(fn): required_args.pop(0) missing = [arg for arg in required_args if arg not in kwargs] missing = missing[len(args):] if missing: raise MissingArgs(missing) ironic-2014.1.rc1/ironic/openstack/common/threadgroup.py0000664000175300017540000000743712316614116024361 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2012 Red Hat, Inc. # # 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 eventlet import greenlet from eventlet import greenpool from eventlet import greenthread from ironic.openstack.common import log as logging from ironic.openstack.common import loopingcall LOG = logging.getLogger(__name__) def _thread_done(gt, *args, **kwargs): """ Callback function to be passed to GreenThread.link() when we spawn() Calls the :class:`ThreadGroup` to notify if. """ kwargs['group'].thread_done(kwargs['thread']) class Thread(object): """ Wrapper around a greenthread, that holds a reference to the :class:`ThreadGroup`. The Thread will notify the :class:`ThreadGroup` when it has done so it can be removed from the threads list. """ def __init__(self, thread, group): self.thread = thread self.thread.link(_thread_done, group=group, thread=self) def stop(self): self.thread.kill() def wait(self): return self.thread.wait() class ThreadGroup(object): """ The point of the ThreadGroup classis to: * keep track of timers and greenthreads (making it easier to stop them when need be). * provide an easy API to add timers. """ def __init__(self, thread_pool_size=10): self.pool = greenpool.GreenPool(thread_pool_size) self.threads = [] self.timers = [] def add_dynamic_timer(self, callback, initial_delay=None, periodic_interval_max=None, *args, **kwargs): timer = loopingcall.DynamicLoopingCall(callback, *args, **kwargs) timer.start(initial_delay=initial_delay, periodic_interval_max=periodic_interval_max) self.timers.append(timer) def add_timer(self, interval, callback, initial_delay=None, *args, **kwargs): pulse = loopingcall.FixedIntervalLoopingCall(callback, *args, **kwargs) pulse.start(interval=interval, initial_delay=initial_delay) self.timers.append(pulse) def add_thread(self, callback, *args, **kwargs): gt = self.pool.spawn(callback, *args, **kwargs) th = Thread(gt, self) self.threads.append(th) def thread_done(self, thread): self.threads.remove(thread) def stop(self): current = greenthread.getcurrent() for x in self.threads: if x is current: # don't kill the current thread. continue try: x.stop() except Exception as ex: LOG.exception(ex) for x in self.timers: try: x.stop() except Exception as ex: LOG.exception(ex) self.timers = [] def wait(self): for x in self.timers: try: x.wait() except greenlet.GreenletExit: pass except Exception as ex: LOG.exception(ex) current = greenthread.getcurrent() for x in self.threads: if x is current: continue try: x.wait() except greenlet.GreenletExit: pass except Exception as ex: LOG.exception(ex) ironic-2014.1.rc1/ironic/openstack/common/importutils.py0000664000175300017540000000427212316614116024422 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2011 OpenStack Foundation. # 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 related utilities and helper functions. """ import sys import traceback def import_class(import_str): """Returns a class from a string including module and class.""" mod_str, _sep, class_str = import_str.rpartition('.') try: __import__(mod_str) return getattr(sys.modules[mod_str], class_str) except (ValueError, AttributeError): raise ImportError('Class %s cannot be found (%s)' % (class_str, traceback.format_exception(*sys.exc_info()))) def import_object(import_str, *args, **kwargs): """Import a class and return an instance of it.""" return import_class(import_str)(*args, **kwargs) def import_object_ns(name_space, import_str, *args, **kwargs): """Tries to import object from default namespace. Imports a class and return an instance of it, first by trying to find the class in a default namespace, then failing back to a full path if not found in the default namespace. """ import_value = "%s.%s" % (name_space, import_str) try: return import_class(import_value)(*args, **kwargs) except ImportError: return import_class(import_str)(*args, **kwargs) def import_module(import_str): """Import a module.""" __import__(import_str) return sys.modules[import_str] def try_import(import_str, default=None): """Try to import a module and if it fails return default.""" try: return import_module(import_str) except ImportError: return default ironic-2014.1.rc1/ironic/openstack/common/policy.py0000664000175300017540000005215712316614116023333 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright (c) 2012 OpenStack Foundation. # 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. """ Common Policy Engine Implementation Policies can be expressed in one of two forms: A list of lists, or a string written in the new policy language. In the list-of-lists representation, each check inside the innermost list is combined as with an "and" conjunction--for that check to pass, all the specified checks must pass. These innermost lists are then combined as with an "or" conjunction. This is the original way of expressing policies, but there now exists a new way: the policy language. In the policy language, each check is specified the same way as in the list-of-lists representation: a simple "a:b" pair that is matched to the correct code to perform that check. However, conjunction operators are available, allowing for more expressiveness in crafting policies. As an example, take the following rule, expressed in the list-of-lists representation:: [["role:admin"], ["project_id:%(project_id)s", "role:projectadmin"]] In the policy language, this becomes:: role:admin or (project_id:%(project_id)s and role:projectadmin) The policy language also has the "not" operator, allowing a richer policy rule:: project_id:%(project_id)s and not role:dunce Finally, two special policy checks should be mentioned; the policy check "@" will always accept an access, and the policy check "!" will always reject an access. (Note that if a rule is either the empty list ("[]") or the empty string, this is equivalent to the "@" policy check.) Of these, the "!" policy check is probably the most useful, as it allows particular rules to be explicitly disabled. """ import abc import re import urllib import six import urllib2 from ironic.openstack.common.gettextutils import _ from ironic.openstack.common import jsonutils from ironic.openstack.common import log as logging LOG = logging.getLogger(__name__) _rules = None _checks = {} class Rules(dict): """ A store for rules. Handles the default_rule setting directly. """ @classmethod def load_json(cls, data, default_rule=None): """ Allow loading of JSON rule data. """ # Suck in the JSON data and parse the rules rules = dict((k, parse_rule(v)) for k, v in jsonutils.loads(data).items()) return cls(rules, default_rule) def __init__(self, rules=None, default_rule=None): """Initialize the Rules store.""" super(Rules, self).__init__(rules or {}) self.default_rule = default_rule def __missing__(self, key): """Implements the default rule handling.""" # If the default rule isn't actually defined, do something # reasonably intelligent if not self.default_rule or self.default_rule not in self: raise KeyError(key) return self[self.default_rule] def __str__(self): """Dumps a string representation of the rules.""" # Start by building the canonical strings for the rules out_rules = {} for key, value in self.items(): # Use empty string for singleton TrueCheck instances if isinstance(value, TrueCheck): out_rules[key] = '' else: out_rules[key] = str(value) # Dump a pretty-printed JSON representation return jsonutils.dumps(out_rules, indent=4) # Really have to figure out a way to deprecate this def set_rules(rules): """Set the rules in use for policy checks.""" global _rules _rules = rules # Ditto def reset(): """Clear the rules used for policy checks.""" global _rules _rules = None def check(rule, target, creds, exc=None, *args, **kwargs): """ Checks authorization of a rule against the target and credentials. :param rule: The rule to evaluate. :param target: As much information about the object being operated on as possible, as a dictionary. :param creds: As much information about the user performing the action as possible, as a dictionary. :param exc: Class of the exception to raise if the check fails. Any remaining arguments passed to check() (both positional and keyword arguments) will be passed to the exception class. If exc is not provided, returns False. :return: Returns False if the policy does not allow the action and exc is not provided; otherwise, returns a value that evaluates to True. Note: for rules using the "case" expression, this True value will be the specified string from the expression. """ # Allow the rule to be a Check tree if isinstance(rule, BaseCheck): result = rule(target, creds) elif not _rules: # No rules to reference means we're going to fail closed result = False else: try: # Evaluate the rule result = _rules[rule](target, creds) except KeyError: # If the rule doesn't exist, fail closed result = False # If it is False, raise the exception if requested if exc and result is False: raise exc(*args, **kwargs) return result class BaseCheck(object): """ Abstract base class for Check classes. """ __metaclass__ = abc.ABCMeta @abc.abstractmethod def __str__(self): """ Retrieve a string representation of the Check tree rooted at this node. """ pass @abc.abstractmethod def __call__(self, target, cred): """ Perform the check. Returns False to reject the access or a true value (not necessary True) to accept the access. """ pass class FalseCheck(BaseCheck): """ A policy check that always returns False (disallow). """ def __str__(self): """Return a string representation of this check.""" return "!" def __call__(self, target, cred): """Check the policy.""" return False class TrueCheck(BaseCheck): """ A policy check that always returns True (allow). """ def __str__(self): """Return a string representation of this check.""" return "@" def __call__(self, target, cred): """Check the policy.""" return True class Check(BaseCheck): """ A base class to allow for user-defined policy checks. """ def __init__(self, kind, match): """ :param kind: The kind of the check, i.e., the field before the ':'. :param match: The match of the check, i.e., the field after the ':'. """ self.kind = kind self.match = match def __str__(self): """Return a string representation of this check.""" return "%s:%s" % (self.kind, self.match) class NotCheck(BaseCheck): """ A policy check that inverts the result of another policy check. Implements the "not" operator. """ def __init__(self, rule): """ Initialize the 'not' check. :param rule: The rule to negate. Must be a Check. """ self.rule = rule def __str__(self): """Return a string representation of this check.""" return "not %s" % self.rule def __call__(self, target, cred): """ Check the policy. Returns the logical inverse of the wrapped check. """ return not self.rule(target, cred) class AndCheck(BaseCheck): """ A policy check that requires that a list of other checks all return True. Implements the "and" operator. """ def __init__(self, rules): """ Initialize the 'and' check. :param rules: A list of rules that will be tested. """ self.rules = rules def __str__(self): """Return a string representation of this check.""" return "(%s)" % ' and '.join(str(r) for r in self.rules) def __call__(self, target, cred): """ Check the policy. Requires that all rules accept in order to return True. """ for rule in self.rules: if not rule(target, cred): return False return True def add_check(self, rule): """ Allows addition of another rule to the list of rules that will be tested. Returns the AndCheck object for convenience. """ self.rules.append(rule) return self class OrCheck(BaseCheck): """ A policy check that requires that at least one of a list of other checks returns True. Implements the "or" operator. """ def __init__(self, rules): """ Initialize the 'or' check. :param rules: A list of rules that will be tested. """ self.rules = rules def __str__(self): """Return a string representation of this check.""" return "(%s)" % ' or '.join(str(r) for r in self.rules) def __call__(self, target, cred): """ Check the policy. Requires that at least one rule accept in order to return True. """ for rule in self.rules: if rule(target, cred): return True return False def add_check(self, rule): """ Allows addition of another rule to the list of rules that will be tested. Returns the OrCheck object for convenience. """ self.rules.append(rule) return self def _parse_check(rule): """ Parse a single base check rule into an appropriate Check object. """ # Handle the special checks if rule == '!': return FalseCheck() elif rule == '@': return TrueCheck() try: kind, match = rule.split(':', 1) except Exception: LOG.exception(_("Failed to understand rule %(rule)s") % locals()) # If the rule is invalid, we'll fail closed return FalseCheck() # Find what implements the check if kind in _checks: return _checks[kind](kind, match) elif None in _checks: return _checks[None](kind, match) else: LOG.error(_("No handler for matches of kind %s") % kind) return FalseCheck() def _parse_list_rule(rule): """ Provided for backwards compatibility. Translates the old list-of-lists syntax into a tree of Check objects. """ # Empty rule defaults to True if not rule: return TrueCheck() # Outer list is joined by "or"; inner list by "and" or_list = [] for inner_rule in rule: # Elide empty inner lists if not inner_rule: continue # Handle bare strings if isinstance(inner_rule, basestring): inner_rule = [inner_rule] # Parse the inner rules into Check objects and_list = [_parse_check(r) for r in inner_rule] # Append the appropriate check to the or_list if len(and_list) == 1: or_list.append(and_list[0]) else: or_list.append(AndCheck(and_list)) # If we have only one check, omit the "or" if not or_list: return FalseCheck() elif len(or_list) == 1: return or_list[0] return OrCheck(or_list) # Used for tokenizing the policy language _tokenize_re = re.compile(r'\s+') def _parse_tokenize(rule): """ Tokenizer for the policy language. Most of the single-character tokens are specified in the _tokenize_re; however, parentheses need to be handled specially, because they can appear inside a check string. Thankfully, those parentheses that appear inside a check string can never occur at the very beginning or end ("%(variable)s" is the correct syntax). """ for tok in _tokenize_re.split(rule): # Skip empty tokens if not tok or tok.isspace(): continue # Handle leading parens on the token clean = tok.lstrip('(') for i in range(len(tok) - len(clean)): yield '(', '(' # If it was only parentheses, continue if not clean: continue else: tok = clean # Handle trailing parens on the token clean = tok.rstrip(')') trail = len(tok) - len(clean) # Yield the cleaned token lowered = clean.lower() if lowered in ('and', 'or', 'not'): # Special tokens yield lowered, clean elif clean: # Not a special token, but not composed solely of ')' if len(tok) >= 2 and ((tok[0], tok[-1]) in [('"', '"'), ("'", "'")]): # It's a quoted string yield 'string', tok[1:-1] else: yield 'check', _parse_check(clean) # Yield the trailing parens for i in range(trail): yield ')', ')' class ParseStateMeta(type): """ Metaclass for the ParseState class. Facilitates identifying reduction methods. """ def __new__(mcs, name, bases, cls_dict): """ Create the class. Injects the 'reducers' list, a list of tuples matching token sequences to the names of the corresponding reduction methods. """ reducers = [] for key, value in cls_dict.items(): if not hasattr(value, 'reducers'): continue for reduction in value.reducers: reducers.append((reduction, key)) cls_dict['reducers'] = reducers return super(ParseStateMeta, mcs).__new__(mcs, name, bases, cls_dict) def reducer(*tokens): """ Decorator for reduction methods. Arguments are a sequence of tokens, in order, which should trigger running this reduction method. """ def decorator(func): # Make sure we have a list of reducer sequences if not hasattr(func, 'reducers'): func.reducers = [] # Add the tokens to the list of reducer sequences func.reducers.append(list(tokens)) return func return decorator class ParseState(object): """ Implement the core of parsing the policy language. Uses a greedy reduction algorithm to reduce a sequence of tokens into a single terminal, the value of which will be the root of the Check tree. Note: error reporting is rather lacking. The best we can get with this parser formulation is an overall "parse failed" error. Fortunately, the policy language is simple enough that this shouldn't be that big a problem. """ __metaclass__ = ParseStateMeta def __init__(self): """Initialize the ParseState.""" self.tokens = [] self.values = [] def reduce(self): """ Perform a greedy reduction of the token stream. If a reducer method matches, it will be executed, then the reduce() method will be called recursively to search for any more possible reductions. """ for reduction, methname in self.reducers: if (len(self.tokens) >= len(reduction) and self.tokens[-len(reduction):] == reduction): # Get the reduction method meth = getattr(self, methname) # Reduce the token stream results = meth(*self.values[-len(reduction):]) # Update the tokens and values self.tokens[-len(reduction):] = [r[0] for r in results] self.values[-len(reduction):] = [r[1] for r in results] # Check for any more reductions return self.reduce() def shift(self, tok, value): """Adds one more token to the state. Calls reduce().""" self.tokens.append(tok) self.values.append(value) # Do a greedy reduce... self.reduce() @property def result(self): """ Obtain the final result of the parse. Raises ValueError if the parse failed to reduce to a single result. """ if len(self.values) != 1: raise ValueError("Could not parse rule") return self.values[0] @reducer('(', 'check', ')') @reducer('(', 'and_expr', ')') @reducer('(', 'or_expr', ')') def _wrap_check(self, _p1, check, _p2): """Turn parenthesized expressions into a 'check' token.""" return [('check', check)] @reducer('check', 'and', 'check') def _make_and_expr(self, check1, _and, check2): """ Create an 'and_expr' from two checks joined by the 'and' operator. """ return [('and_expr', AndCheck([check1, check2]))] @reducer('and_expr', 'and', 'check') def _extend_and_expr(self, and_expr, _and, check): """ Extend an 'and_expr' by adding one more check. """ return [('and_expr', and_expr.add_check(check))] @reducer('check', 'or', 'check') def _make_or_expr(self, check1, _or, check2): """ Create an 'or_expr' from two checks joined by the 'or' operator. """ return [('or_expr', OrCheck([check1, check2]))] @reducer('or_expr', 'or', 'check') def _extend_or_expr(self, or_expr, _or, check): """ Extend an 'or_expr' by adding one more check. """ return [('or_expr', or_expr.add_check(check))] @reducer('not', 'check') def _make_not_expr(self, _not, check): """Invert the result of another check.""" return [('check', NotCheck(check))] def _parse_text_rule(rule): """ Translates a policy written in the policy language into a tree of Check objects. """ # Empty rule means always accept if not rule: return TrueCheck() # Parse the token stream state = ParseState() for tok, value in _parse_tokenize(rule): state.shift(tok, value) try: return state.result except ValueError: # Couldn't parse the rule LOG.exception(_("Failed to understand rule %(rule)r") % locals()) # Fail closed return FalseCheck() def parse_rule(rule): """ Parses a policy rule into a tree of Check objects. """ # If the rule is a string, it's in the policy language if isinstance(rule, basestring): return _parse_text_rule(rule) return _parse_list_rule(rule) def register(name, func=None): """ Register a function or Check class as a policy check. :param name: Gives the name of the check type, e.g., 'rule', 'role', etc. If name is None, a default check type will be registered. :param func: If given, provides the function or class to register. If not given, returns a function taking one argument to specify the function or class to register, allowing use as a decorator. """ # Perform the actual decoration by registering the function or # class. Returns the function or class for compliance with the # decorator interface. def decorator(func): _checks[name] = func return func # If the function or class is given, do the registration if func: return decorator(func) return decorator @register("rule") class RuleCheck(Check): def __call__(self, target, creds): """ Recursively checks credentials based on the defined rules. """ try: return _rules[self.match](target, creds) except KeyError: # We don't have any matching rule; fail closed return False @register("role") class RoleCheck(Check): def __call__(self, target, creds): """Check that there is a matching role in the cred dict.""" return self.match.lower() in [x.lower() for x in creds['roles']] @register('http') class HttpCheck(Check): def __call__(self, target, creds): """ Check http: rules by calling to a remote server. This example implementation simply verifies that the response is exactly 'True'. """ url = ('http:' + self.match) % target data = {'target': jsonutils.dumps(target), 'credentials': jsonutils.dumps(creds)} post_data = urllib.urlencode(data) f = urllib2.urlopen(url, post_data) return f.read() == "True" @register(None) class GenericCheck(Check): def __call__(self, target, creds): """ Check an individual match. Matches look like: tenant:%(tenant_id)s role:compute:admin """ # TODO(termie): do dict inspection via dot syntax match = self.match % target if self.kind in creds: return match == six.text_type(creds[self.kind]) return False ironic-2014.1.rc1/ironic/openstack/common/notifier/0000775000175300017540000000000012316614636023276 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/openstack/common/notifier/no_op_notifier.py0000664000175300017540000000135512316614116026656 0ustar jenkinsjenkins00000000000000# Copyright 2011 OpenStack Foundation. # 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. def notify(_context, message): """Notifies the recipient of the desired event given the model.""" pass ironic-2014.1.rc1/ironic/openstack/common/notifier/log_notifier.py0000664000175300017540000000235212316614116026323 0ustar jenkinsjenkins00000000000000# Copyright 2011 OpenStack Foundation. # 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 ironic.openstack.common import jsonutils from ironic.openstack.common import log as logging CONF = cfg.CONF def notify(_context, message): """Notifies the recipient of the desired event given the model. Log notifications using OpenStack's default logging system. """ priority = message.get('priority', CONF.default_notification_level) priority = priority.lower() logger = logging.getLogger( 'ironic.openstack.common.notification.%s' % message['event_type']) getattr(logger, priority)(jsonutils.dumps(message)) ironic-2014.1.rc1/ironic/openstack/common/notifier/test_notifier.py0000664000175300017540000000143312316614116026520 0ustar jenkinsjenkins00000000000000# Copyright 2011 OpenStack Foundation. # 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. NOTIFICATIONS = [] def notify(_context, message): """Test notifier, stores notifications in memory for unittests.""" NOTIFICATIONS.append(message) ironic-2014.1.rc1/ironic/openstack/common/notifier/api.py0000664000175300017540000001261312316614116024415 0ustar jenkinsjenkins00000000000000# Copyright 2011 OpenStack Foundation. # 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 socket import uuid from oslo.config import cfg from ironic.openstack.common import context from ironic.openstack.common.gettextutils import _ # noqa from ironic.openstack.common import importutils from ironic.openstack.common import jsonutils from ironic.openstack.common import log as logging from ironic.openstack.common import timeutils LOG = logging.getLogger(__name__) notifier_opts = [ cfg.MultiStrOpt('notification_driver', default=[], help='Driver or drivers to handle sending notifications'), cfg.StrOpt('default_notification_level', default='INFO', help='Default notification level for outgoing notifications'), cfg.StrOpt('default_publisher_id', default=None, help='Default publisher_id for outgoing notifications'), ] CONF = cfg.CONF CONF.register_opts(notifier_opts) WARN = 'WARN' INFO = 'INFO' ERROR = 'ERROR' CRITICAL = 'CRITICAL' DEBUG = 'DEBUG' log_levels = (DEBUG, WARN, INFO, ERROR, CRITICAL) class BadPriorityException(Exception): pass def notify_decorator(name, fn): """Decorator for notify which is used from utils.monkey_patch(). :param name: name of the function :param function: - object of the function :returns: function -- decorated function """ def wrapped_func(*args, **kwarg): body = {} body['args'] = [] body['kwarg'] = {} for arg in args: body['args'].append(arg) for key in kwarg: body['kwarg'][key] = kwarg[key] ctxt = context.get_context_from_function_and_args(fn, args, kwarg) notify(ctxt, CONF.default_publisher_id or socket.gethostname(), name, CONF.default_notification_level, body) return fn(*args, **kwarg) return wrapped_func def publisher_id(service, host=None): if not host: try: host = CONF.host except AttributeError: host = CONF.default_publisher_id or socket.gethostname() return "%s.%s" % (service, host) def notify(context, publisher_id, event_type, priority, payload): """Sends a notification using the specified driver :param publisher_id: the source worker_type.host of the message :param event_type: the literal type of event (ex. Instance Creation) :param priority: patterned after the enumeration of Python logging levels in the set (DEBUG, WARN, INFO, ERROR, CRITICAL) :param payload: A python dictionary of attributes Outgoing message format includes the above parameters, and appends the following: message_id a UUID representing the id for this notification timestamp the GMT timestamp the notification was sent at The composite message will be constructed as a dictionary of the above attributes, which will then be sent via the transport mechanism defined by the driver. Message example:: {'message_id': str(uuid.uuid4()), 'publisher_id': 'compute.host1', 'timestamp': timeutils.utcnow(), 'priority': 'WARN', 'event_type': 'compute.create_instance', 'payload': {'instance_id': 12, ... }} """ if priority not in log_levels: raise BadPriorityException( _('%s not in valid priorities') % priority) # Ensure everything is JSON serializable. payload = jsonutils.to_primitive(payload, convert_instances=True) msg = dict(message_id=str(uuid.uuid4()), publisher_id=publisher_id, event_type=event_type, priority=priority, payload=payload, timestamp=str(timeutils.utcnow())) for driver in _get_drivers(): try: driver.notify(context, msg) except Exception as e: LOG.exception(_("Problem '%(e)s' attempting to " "send to notification system. " "Payload=%(payload)s") % dict(e=e, payload=payload)) _drivers = None def _get_drivers(): """Instantiate, cache, and return drivers based on the CONF.""" global _drivers if _drivers is None: _drivers = {} for notification_driver in CONF.notification_driver: try: driver = importutils.import_module(notification_driver) _drivers[notification_driver] = driver except ImportError: LOG.exception(_("Failed to load notifier %s. " "These notifications will not be sent.") % notification_driver) return _drivers.values() def _reset_drivers(): """Used by unit tests to reset the drivers.""" global _drivers _drivers = None ironic-2014.1.rc1/ironic/openstack/common/notifier/__init__.py0000664000175300017540000000000012316614116025366 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/openstack/common/notifier/rpc_notifier2.py0000664000175300017540000000367312316614116026417 0ustar jenkinsjenkins00000000000000# Copyright 2011 OpenStack Foundation. # 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. '''messaging based notification driver, with message envelopes''' from oslo.config import cfg from ironic.openstack.common import context as req_context from ironic.openstack.common.gettextutils import _ # noqa from ironic.openstack.common import log as logging from ironic.openstack.common import rpc LOG = logging.getLogger(__name__) notification_topic_opt = cfg.ListOpt( 'topics', default=['notifications', ], help='AMQP topic(s) used for OpenStack notifications') opt_group = cfg.OptGroup(name='rpc_notifier2', title='Options for rpc_notifier2') CONF = cfg.CONF CONF.register_group(opt_group) CONF.register_opt(notification_topic_opt, opt_group) def notify(context, message): """Sends a notification via RPC.""" if not context: context = req_context.get_admin_context() priority = message.get('priority', CONF.default_notification_level) priority = priority.lower() for topic in CONF.rpc_notifier2.topics: topic = '%s.%s' % (topic, priority) try: rpc.notify(context, topic, message, envelope=True) except Exception: LOG.exception(_("Could not send notification to %(topic)s. " "Payload=%(message)s"), {"topic": topic, "message": message}) ironic-2014.1.rc1/ironic/openstack/common/notifier/rpc_notifier.py0000664000175300017540000000333412316614116026327 0ustar jenkinsjenkins00000000000000# Copyright 2011 OpenStack Foundation. # 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 ironic.openstack.common import context as req_context from ironic.openstack.common.gettextutils import _ # noqa from ironic.openstack.common import log as logging from ironic.openstack.common import rpc LOG = logging.getLogger(__name__) notification_topic_opt = cfg.ListOpt( 'notification_topics', default=['notifications', ], help='AMQP topic used for OpenStack notifications') CONF = cfg.CONF CONF.register_opt(notification_topic_opt) def notify(context, message): """Sends a notification via RPC.""" if not context: context = req_context.get_admin_context() priority = message.get('priority', CONF.default_notification_level) priority = priority.lower() for topic in CONF.notification_topics: topic = '%s.%s' % (topic, priority) try: rpc.notify(context, topic, message) except Exception: LOG.exception(_("Could not send notification to %(topic)s. " "Payload=%(message)s"), {"topic": topic, "message": message}) ironic-2014.1.rc1/ironic/openstack/common/db/0000775000175300017540000000000012316614636022044 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/openstack/common/db/options.py0000664000175300017540000001746512316614116024117 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 copy from oslo.config import cfg database_opts = [ cfg.StrOpt('sqlite_db', deprecated_group='DEFAULT', default='ironic.sqlite', help='The file name to use with SQLite'), cfg.BoolOpt('sqlite_synchronous', deprecated_group='DEFAULT', default=True, help='If True, SQLite uses synchronous mode'), cfg.StrOpt('backend', default='sqlalchemy', deprecated_name='db_backend', deprecated_group='DEFAULT', help='The backend to use for db'), cfg.StrOpt('connection', help='The SQLAlchemy connection string used to connect to the ' 'database', secret=True, deprecated_opts=[cfg.DeprecatedOpt('sql_connection', group='DEFAULT'), cfg.DeprecatedOpt('sql_connection', group='DATABASE'), cfg.DeprecatedOpt('connection', group='sql'), ]), cfg.StrOpt('mysql_sql_mode', help='The SQL mode to be used for MySQL sessions ' '(default is empty, meaning do not override ' 'any server-side SQL mode setting)'), cfg.IntOpt('idle_timeout', default=3600, deprecated_opts=[cfg.DeprecatedOpt('sql_idle_timeout', group='DEFAULT'), cfg.DeprecatedOpt('sql_idle_timeout', group='DATABASE'), cfg.DeprecatedOpt('idle_timeout', group='sql')], help='Timeout before idle sql connections are reaped'), cfg.IntOpt('min_pool_size', default=1, deprecated_opts=[cfg.DeprecatedOpt('sql_min_pool_size', group='DEFAULT'), cfg.DeprecatedOpt('sql_min_pool_size', group='DATABASE')], help='Minimum number of SQL connections to keep open in a ' 'pool'), cfg.IntOpt('max_pool_size', default=None, deprecated_opts=[cfg.DeprecatedOpt('sql_max_pool_size', group='DEFAULT'), cfg.DeprecatedOpt('sql_max_pool_size', group='DATABASE')], help='Maximum number of SQL connections to keep open in a ' 'pool'), cfg.IntOpt('max_retries', default=10, deprecated_opts=[cfg.DeprecatedOpt('sql_max_retries', group='DEFAULT'), cfg.DeprecatedOpt('sql_max_retries', group='DATABASE')], help='Maximum db connection retries during startup. ' '(setting -1 implies an infinite retry count)'), cfg.IntOpt('retry_interval', default=10, deprecated_opts=[cfg.DeprecatedOpt('sql_retry_interval', group='DEFAULT'), cfg.DeprecatedOpt('reconnect_interval', group='DATABASE')], help='Interval between retries of opening a sql connection'), cfg.IntOpt('max_overflow', default=None, deprecated_opts=[cfg.DeprecatedOpt('sql_max_overflow', group='DEFAULT'), cfg.DeprecatedOpt('sqlalchemy_max_overflow', group='DATABASE')], help='If set, use this value for max_overflow with sqlalchemy'), cfg.IntOpt('connection_debug', default=0, deprecated_opts=[cfg.DeprecatedOpt('sql_connection_debug', group='DEFAULT')], help='Verbosity of SQL debugging information. 0=None, ' '100=Everything'), cfg.BoolOpt('connection_trace', default=False, deprecated_opts=[cfg.DeprecatedOpt('sql_connection_trace', group='DEFAULT')], help='Add python stack traces to SQL as comment strings'), cfg.IntOpt('pool_timeout', default=None, deprecated_opts=[cfg.DeprecatedOpt('sqlalchemy_pool_timeout', group='DATABASE')], help='If set, use this value for pool_timeout with sqlalchemy'), cfg.BoolOpt('use_db_reconnect', default=False, help='Enable the experimental use of database reconnect ' 'on connection lost'), cfg.IntOpt('db_retry_interval', default=1, help='seconds between db connection retries'), cfg.BoolOpt('db_inc_retry_interval', default=True, help='Whether to increase interval between db connection ' 'retries, up to db_max_retry_interval'), cfg.IntOpt('db_max_retry_interval', default=10, help='max seconds between db connection retries, if ' 'db_inc_retry_interval is enabled'), cfg.IntOpt('db_max_retries', default=20, help='maximum db connection retries before error is raised. ' '(setting -1 implies an infinite retry count)'), ] CONF = cfg.CONF CONF.register_opts(database_opts, 'database') def set_defaults(sql_connection, sqlite_db, max_pool_size=None, max_overflow=None, pool_timeout=None): """Set defaults for configuration variables.""" cfg.set_defaults(database_opts, connection=sql_connection, sqlite_db=sqlite_db) # Update the QueuePool defaults if max_pool_size is not None: cfg.set_defaults(database_opts, max_pool_size=max_pool_size) if max_overflow is not None: cfg.set_defaults(database_opts, max_overflow=max_overflow) if pool_timeout is not None: cfg.set_defaults(database_opts, pool_timeout=pool_timeout) def list_opts(): """Returns a list of oslo.config options available in the library. The returned list includes all oslo.config options which may be registered at runtime by the library. Each element of the list is a tuple. The first element is the name of the group under which the list of elements in the second element will be registered. A group name of None corresponds to the [DEFAULT] group in config files. The purpose of this is to allow tools like the Oslo sample config file generator to discover the options exposed to users by this library. :returns: a list of (group_name, opts) tuples """ return [('database', copy.deepcopy(database_opts))] ironic-2014.1.rc1/ironic/openstack/common/db/api.py0000664000175300017540000001354212316614116023165 0ustar jenkinsjenkins00000000000000# Copyright (c) 2013 Rackspace Hosting # 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. """Multiple DB API backend support. A DB backend module should implement a method named 'get_backend' which takes no arguments. The method can return any object that implements DB API methods. """ import functools import logging import threading import time from ironic.openstack.common.db import exception from ironic.openstack.common.gettextutils import _LE from ironic.openstack.common import importutils LOG = logging.getLogger(__name__) def safe_for_db_retry(f): """Enable db-retry for decorated function, if config option enabled.""" f.__dict__['enable_retry'] = True return f class wrap_db_retry(object): """Retry db.api methods, if DBConnectionError() raised Retry decorated db.api methods. If we enabled `use_db_reconnect` in config, this decorator will be applied to all db.api functions, marked with @safe_for_db_retry decorator. Decorator catchs DBConnectionError() and retries function in a loop until it succeeds, or until maximum retries count will be reached. """ def __init__(self, retry_interval, max_retries, inc_retry_interval, max_retry_interval): super(wrap_db_retry, self).__init__() self.retry_interval = retry_interval self.max_retries = max_retries self.inc_retry_interval = inc_retry_interval self.max_retry_interval = max_retry_interval def __call__(self, f): @functools.wraps(f) def wrapper(*args, **kwargs): next_interval = self.retry_interval remaining = self.max_retries while True: try: return f(*args, **kwargs) except exception.DBConnectionError as e: if remaining == 0: LOG.exception(_LE('DB exceeded retry limit.')) raise exception.DBError(e) if remaining != -1: remaining -= 1 LOG.exception(_LE('DB connection error.')) # NOTE(vsergeyev): We are using patched time module, so # this effectively yields the execution # context to another green thread. time.sleep(next_interval) if self.inc_retry_interval: next_interval = min( next_interval * 2, self.max_retry_interval ) return wrapper class DBAPI(object): def __init__(self, backend_name, backend_mapping=None, lazy=False, **kwargs): """Initialize the chosen DB API backend. :param backend_name: name of the backend to load :type backend_name: str :param backend_mapping: backend name -> module/class to load mapping :type backend_mapping: dict :param lazy: load the DB backend lazily on the first DB API method call :type lazy: bool Keyword arguments: :keyword use_db_reconnect: retry DB transactions on disconnect or not :type use_db_reconnect: bool :keyword retry_interval: seconds between transaction retries :type retry_interval: int :keyword inc_retry_interval: increase retry interval or not :type inc_retry_interval: bool :keyword max_retry_interval: max interval value between retries :type max_retry_interval: int :keyword max_retries: max number of retries before an error is raised :type max_retries: int """ self._backend = None self._backend_name = backend_name self._backend_mapping = backend_mapping or {} self._lock = threading.Lock() if not lazy: self._load_backend() self.use_db_reconnect = kwargs.get('use_db_reconnect', False) self.retry_interval = kwargs.get('retry_interval', 1) self.inc_retry_interval = kwargs.get('inc_retry_interval', True) self.max_retry_interval = kwargs.get('max_retry_interval', 10) self.max_retries = kwargs.get('max_retries', 20) def _load_backend(self): with self._lock: if not self._backend: # Import the untranslated name if we don't have a mapping backend_path = self._backend_mapping.get(self._backend_name, self._backend_name) backend_mod = importutils.import_module(backend_path) self._backend = backend_mod.get_backend() def __getattr__(self, key): if not self._backend: self._load_backend() attr = getattr(self._backend, key) if not hasattr(attr, '__call__'): return attr # NOTE(vsergeyev): If `use_db_reconnect` option is set to True, retry # DB API methods, decorated with @safe_for_db_retry # on disconnect. if self.use_db_reconnect and hasattr(attr, 'enable_retry'): attr = wrap_db_retry( retry_interval=self.retry_interval, max_retries=self.max_retries, inc_retry_interval=self.inc_retry_interval, max_retry_interval=self.max_retry_interval)(attr) return attr ironic-2014.1.rc1/ironic/openstack/common/db/__init__.py0000664000175300017540000000000012316614116024134 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/openstack/common/db/exception.py0000664000175300017540000000352012316614116024405 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # 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. """DB related custom exceptions.""" import six from ironic.openstack.common.gettextutils import _ class DBError(Exception): """Wraps an implementation specific exception.""" def __init__(self, inner_exception=None): self.inner_exception = inner_exception super(DBError, self).__init__(six.text_type(inner_exception)) class DBDuplicateEntry(DBError): """Wraps an implementation specific exception.""" def __init__(self, columns=[], inner_exception=None): self.columns = columns super(DBDuplicateEntry, self).__init__(inner_exception) class DBDeadlock(DBError): def __init__(self, inner_exception=None): super(DBDeadlock, self).__init__(inner_exception) class DBInvalidUnicodeParameter(Exception): message = _("Invalid Parameter: " "Unicode is not supported by the current database.") class DbMigrationError(DBError): """Wraps migration specific exception.""" def __init__(self, message=None): super(DbMigrationError, self).__init__(message) class DBConnectionError(DBError): """Wraps connection specific exception.""" pass ironic-2014.1.rc1/ironic/openstack/common/db/sqlalchemy/0000775000175300017540000000000012316614636024206 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/openstack/common/db/sqlalchemy/test_base.py0000664000175300017540000001114712316614116026526 0ustar jenkinsjenkins00000000000000# Copyright (c) 2013 OpenStack Foundation # 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 abc import functools import os import fixtures import six from ironic.openstack.common.db.sqlalchemy import session from ironic.openstack.common.db.sqlalchemy import utils from ironic.openstack.common import test class DbFixture(fixtures.Fixture): """Basic database fixture. Allows to run tests on various db backends, such as SQLite, MySQL and PostgreSQL. By default use sqlite backend. To override default backend uri set env variable OS_TEST_DBAPI_CONNECTION with database admin credentials for specific backend. """ def _get_uri(self): return os.getenv('OS_TEST_DBAPI_CONNECTION', 'sqlite://') def __init__(self, test): super(DbFixture, self).__init__() self.test = test def setUp(self): super(DbFixture, self).setUp() self.test.engine = session.create_engine(self._get_uri()) self.test.sessionmaker = session.get_maker(self.test.engine) self.addCleanup(self.test.engine.dispose) class DbTestCase(test.BaseTestCase): """Base class for testing of DB code. Using `DbFixture`. Intended to be the main database test case to use all the tests on a given backend with user defined uri. Backend specific tests should be decorated with `backend_specific` decorator. """ FIXTURE = DbFixture def setUp(self): super(DbTestCase, self).setUp() self.useFixture(self.FIXTURE(self)) ALLOWED_DIALECTS = ['sqlite', 'mysql', 'postgresql'] def backend_specific(*dialects): """Decorator to skip backend specific tests on inappropriate engines. ::dialects: list of dialects names under which the test will be launched. """ def wrap(f): @functools.wraps(f) def ins_wrap(self): if not set(dialects).issubset(ALLOWED_DIALECTS): raise ValueError( "Please use allowed dialects: %s" % ALLOWED_DIALECTS) if self.engine.name not in dialects: msg = ('The test "%s" can be run ' 'only on %s. Current engine is %s.') args = (f.__name__, ' '.join(dialects), self.engine.name) self.skip(msg % args) else: return f(self) return ins_wrap return wrap @six.add_metaclass(abc.ABCMeta) class OpportunisticFixture(DbFixture): """Base fixture to use default CI databases. The databases exist in OpenStack CI infrastructure. But for the correct functioning in local environment the databases must be created manually. """ DRIVER = abc.abstractproperty(lambda: None) DBNAME = PASSWORD = USERNAME = 'openstack_citest' def _get_uri(self): return utils.get_connect_string(backend=self.DRIVER, user=self.USERNAME, passwd=self.PASSWORD, database=self.DBNAME) @six.add_metaclass(abc.ABCMeta) class OpportunisticTestCase(DbTestCase): """Base test case to use default CI databases. The subclasses of the test case are running only when openstack_citest database is available otherwise a tests will be skipped. """ FIXTURE = abc.abstractproperty(lambda: None) def setUp(self): credentials = { 'backend': self.FIXTURE.DRIVER, 'user': self.FIXTURE.USERNAME, 'passwd': self.FIXTURE.PASSWORD, 'database': self.FIXTURE.DBNAME} if self.FIXTURE.DRIVER and not utils.is_backend_avail(**credentials): msg = '%s backend is not available.' % self.FIXTURE.DRIVER return self.skip(msg) super(OpportunisticTestCase, self).setUp() class MySQLOpportunisticFixture(OpportunisticFixture): DRIVER = 'mysql' class PostgreSQLOpportunisticFixture(OpportunisticFixture): DRIVER = 'postgresql' class MySQLOpportunisticTestCase(OpportunisticTestCase): FIXTURE = MySQLOpportunisticFixture class PostgreSQLOpportunisticTestCase(OpportunisticTestCase): FIXTURE = PostgreSQLOpportunisticFixture ironic-2014.1.rc1/ironic/openstack/common/db/sqlalchemy/utils.py0000664000175300017540000005701712316614116025723 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # Copyright 2010-2011 OpenStack Foundation. # Copyright 2012 Justin Santa Barbara # 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 logging import re from migrate.changeset import UniqueConstraint import sqlalchemy from sqlalchemy import Boolean from sqlalchemy import CheckConstraint from sqlalchemy import Column from sqlalchemy.engine import reflection from sqlalchemy.ext.compiler import compiles from sqlalchemy import func from sqlalchemy import Index from sqlalchemy import Integer from sqlalchemy import MetaData from sqlalchemy import or_ from sqlalchemy.sql.expression import literal_column from sqlalchemy.sql.expression import UpdateBase from sqlalchemy.sql import select from sqlalchemy import String from sqlalchemy import Table from sqlalchemy.types import NullType from ironic.openstack.common import context as request_context from ironic.openstack.common.db.sqlalchemy import models from ironic.openstack.common.gettextutils import _, _LI, _LW from ironic.openstack.common import timeutils LOG = logging.getLogger(__name__) _DBURL_REGEX = re.compile(r"[^:]+://([^:]+):([^@]+)@.+") def sanitize_db_url(url): match = _DBURL_REGEX.match(url) if match: return '%s****:****%s' % (url[:match.start(1)], url[match.end(2):]) return url class InvalidSortKey(Exception): message = _("Sort key supplied was not valid.") # copy from glance/db/sqlalchemy/api.py def paginate_query(query, model, limit, sort_keys, marker=None, sort_dir=None, sort_dirs=None): """Returns a query with sorting / pagination criteria added. Pagination works by requiring a unique sort_key, specified by sort_keys. (If sort_keys is not unique, then we risk looping through values.) We use the last row in the previous page as the 'marker' for pagination. So we must return values that follow the passed marker in the order. With a single-valued sort_key, this would be easy: sort_key > X. With a compound-values sort_key, (k1, k2, k3) we must do this to repeat the lexicographical ordering: (k1 > X1) or (k1 == X1 && k2 > X2) or (k1 == X1 && k2 == X2 && k3 > X3) We also have to cope with different sort_directions. Typically, the id of the last row is used as the client-facing pagination marker, then the actual marker object must be fetched from the db and passed in to us as marker. :param query: the query object to which we should add paging/sorting :param model: the ORM model class :param limit: maximum number of items to return :param sort_keys: array of attributes by which results should be sorted :param marker: the last item of the previous page; we returns the next results after this value. :param sort_dir: direction in which results should be sorted (asc, desc) :param sort_dirs: per-column array of sort_dirs, corresponding to sort_keys :rtype: sqlalchemy.orm.query.Query :return: The query with sorting/pagination added. """ if 'id' not in sort_keys: # TODO(justinsb): If this ever gives a false-positive, check # the actual primary key, rather than assuming its id LOG.warning(_LW('Id not in sort_keys; is sort_keys unique?')) assert(not (sort_dir and sort_dirs)) # Default the sort direction to ascending if sort_dirs is None and sort_dir is None: sort_dir = 'asc' # Ensure a per-column sort direction if sort_dirs is None: sort_dirs = [sort_dir for _sort_key in sort_keys] assert(len(sort_dirs) == len(sort_keys)) # Add sorting for current_sort_key, current_sort_dir in zip(sort_keys, sort_dirs): try: sort_dir_func = { 'asc': sqlalchemy.asc, 'desc': sqlalchemy.desc, }[current_sort_dir] except KeyError: raise ValueError(_("Unknown sort direction, " "must be 'desc' or 'asc'")) try: sort_key_attr = getattr(model, current_sort_key) except AttributeError: raise InvalidSortKey() query = query.order_by(sort_dir_func(sort_key_attr)) # Add pagination if marker is not None: marker_values = [] for sort_key in sort_keys: v = getattr(marker, sort_key) marker_values.append(v) # Build up an array of sort criteria as in the docstring criteria_list = [] for i in range(len(sort_keys)): crit_attrs = [] for j in range(i): model_attr = getattr(model, sort_keys[j]) crit_attrs.append((model_attr == marker_values[j])) model_attr = getattr(model, sort_keys[i]) if sort_dirs[i] == 'desc': crit_attrs.append((model_attr < marker_values[i])) else: crit_attrs.append((model_attr > marker_values[i])) criteria = sqlalchemy.sql.and_(*crit_attrs) criteria_list.append(criteria) f = sqlalchemy.sql.or_(*criteria_list) query = query.filter(f) if limit is not None: query = query.limit(limit) return query def _read_deleted_filter(query, db_model, read_deleted): if 'deleted' not in db_model.__table__.columns: raise ValueError(_("There is no `deleted` column in `%s` table. " "Project doesn't use soft-deleted feature.") % db_model.__name__) default_deleted_value = db_model.__table__.c.deleted.default.arg if read_deleted == 'no': query = query.filter(db_model.deleted == default_deleted_value) elif read_deleted == 'yes': pass # omit the filter to include deleted and active elif read_deleted == 'only': query = query.filter(db_model.deleted != default_deleted_value) else: raise ValueError(_("Unrecognized read_deleted value '%s'") % read_deleted) return query def _project_filter(query, db_model, context, project_only): if project_only and 'project_id' not in db_model.__table__.columns: raise ValueError(_("There is no `project_id` column in `%s` table.") % db_model.__name__) if request_context.is_user_context(context) and project_only: if project_only == 'allow_none': is_none = None query = query.filter(or_(db_model.project_id == context.project_id, db_model.project_id == is_none)) else: query = query.filter(db_model.project_id == context.project_id) return query def model_query(context, model, session, args=None, project_only=False, read_deleted=None): """Query helper that accounts for context's `read_deleted` field. :param context: context to query under :param model: Model to query. Must be a subclass of ModelBase. :type model: models.ModelBase :param session: The session to use. :type session: sqlalchemy.orm.session.Session :param args: Arguments to query. If None - model is used. :type args: tuple :param project_only: If present and context is user-type, then restrict query to match the context's project_id. If set to 'allow_none', restriction includes project_id = None. :type project_only: bool :param read_deleted: If present, overrides context's read_deleted field. :type read_deleted: bool Usage: result = (utils.model_query(context, models.Instance, session=session) .filter_by(uuid=instance_uuid) .all()) query = utils.model_query( context, Node, session=session, args=(func.count(Node.id), func.sum(Node.ram)) ).filter_by(project_id=project_id) """ if not read_deleted: if hasattr(context, 'read_deleted'): # NOTE(viktors): some projects use `read_deleted` attribute in # their contexts instead of `show_deleted`. read_deleted = context.read_deleted else: read_deleted = context.show_deleted if not issubclass(model, models.ModelBase): raise TypeError(_("model should be a subclass of ModelBase")) query = session.query(model) if not args else session.query(*args) query = _read_deleted_filter(query, model, read_deleted) query = _project_filter(query, model, context, project_only) return query def get_table(engine, name): """Returns an sqlalchemy table dynamically from db. Needed because the models don't work for us in migrations as models will be far out of sync with the current data. """ metadata = MetaData() metadata.bind = engine return Table(name, metadata, autoload=True) class InsertFromSelect(UpdateBase): """Form the base for `INSERT INTO table (SELECT ... )` statement.""" def __init__(self, table, select): self.table = table self.select = select @compiles(InsertFromSelect) def visit_insert_from_select(element, compiler, **kw): """Form the `INSERT INTO table (SELECT ... )` statement.""" return "INSERT INTO %s %s" % ( compiler.process(element.table, asfrom=True), compiler.process(element.select)) class ColumnError(Exception): """Error raised when no column or an invalid column is found.""" def _get_not_supported_column(col_name_col_instance, column_name): try: column = col_name_col_instance[column_name] except KeyError: msg = _("Please specify column %s in col_name_col_instance " "param. It is required because column has unsupported " "type by sqlite).") raise ColumnError(msg % column_name) if not isinstance(column, Column): msg = _("col_name_col_instance param has wrong type of " "column instance for column %s It should be instance " "of sqlalchemy.Column.") raise ColumnError(msg % column_name) return column def drop_unique_constraint(migrate_engine, table_name, uc_name, *columns, **col_name_col_instance): """Drop unique constraint from table. This method drops UC from table and works for mysql, postgresql and sqlite. In mysql and postgresql we are able to use "alter table" construction. Sqlalchemy doesn't support some sqlite column types and replaces their type with NullType in metadata. We process these columns and replace NullType with the correct column type. :param migrate_engine: sqlalchemy engine :param table_name: name of table that contains uniq constraint. :param uc_name: name of uniq constraint that will be dropped. :param columns: columns that are in uniq constraint. :param col_name_col_instance: contains pair column_name=column_instance. column_instance is instance of Column. These params are required only for columns that have unsupported types by sqlite. For example BigInteger. """ meta = MetaData() meta.bind = migrate_engine t = Table(table_name, meta, autoload=True) if migrate_engine.name == "sqlite": override_cols = [ _get_not_supported_column(col_name_col_instance, col.name) for col in t.columns if isinstance(col.type, NullType) ] for col in override_cols: t.columns.replace(col) uc = UniqueConstraint(*columns, table=t, name=uc_name) uc.drop() def drop_old_duplicate_entries_from_table(migrate_engine, table_name, use_soft_delete, *uc_column_names): """Drop all old rows having the same values for columns in uc_columns. This method drop (or mark ad `deleted` if use_soft_delete is True) old duplicate rows form table with name `table_name`. :param migrate_engine: Sqlalchemy engine :param table_name: Table with duplicates :param use_soft_delete: If True - values will be marked as `deleted`, if False - values will be removed from table :param uc_column_names: Unique constraint columns """ meta = MetaData() meta.bind = migrate_engine table = Table(table_name, meta, autoload=True) columns_for_group_by = [table.c[name] for name in uc_column_names] columns_for_select = [func.max(table.c.id)] columns_for_select.extend(columns_for_group_by) duplicated_rows_select = select(columns_for_select, group_by=columns_for_group_by, having=func.count(table.c.id) > 1) for row in migrate_engine.execute(duplicated_rows_select): # NOTE(boris-42): Do not remove row that has the biggest ID. delete_condition = table.c.id != row[0] is_none = None # workaround for pyflakes delete_condition &= table.c.deleted_at == is_none for name in uc_column_names: delete_condition &= table.c[name] == row[name] rows_to_delete_select = select([table.c.id]).where(delete_condition) for row in migrate_engine.execute(rows_to_delete_select).fetchall(): LOG.info(_LI("Deleting duplicated row with id: %(id)s from table: " "%(table)s") % dict(id=row[0], table=table_name)) if use_soft_delete: delete_statement = table.update().\ where(delete_condition).\ values({ 'deleted': literal_column('id'), 'updated_at': literal_column('updated_at'), 'deleted_at': timeutils.utcnow() }) else: delete_statement = table.delete().where(delete_condition) migrate_engine.execute(delete_statement) def _get_default_deleted_value(table): if isinstance(table.c.id.type, Integer): return 0 if isinstance(table.c.id.type, String): return "" raise ColumnError(_("Unsupported id columns type")) def _restore_indexes_on_deleted_columns(migrate_engine, table_name, indexes): table = get_table(migrate_engine, table_name) insp = reflection.Inspector.from_engine(migrate_engine) real_indexes = insp.get_indexes(table_name) existing_index_names = dict( [(index['name'], index['column_names']) for index in real_indexes]) # NOTE(boris-42): Restore indexes on `deleted` column for index in indexes: if 'deleted' not in index['column_names']: continue name = index['name'] if name in existing_index_names: column_names = [table.c[c] for c in existing_index_names[name]] old_index = Index(name, *column_names, unique=index["unique"]) old_index.drop(migrate_engine) column_names = [table.c[c] for c in index['column_names']] new_index = Index(index["name"], *column_names, unique=index["unique"]) new_index.create(migrate_engine) def change_deleted_column_type_to_boolean(migrate_engine, table_name, **col_name_col_instance): if migrate_engine.name == "sqlite": return _change_deleted_column_type_to_boolean_sqlite( migrate_engine, table_name, **col_name_col_instance) insp = reflection.Inspector.from_engine(migrate_engine) indexes = insp.get_indexes(table_name) table = get_table(migrate_engine, table_name) old_deleted = Column('old_deleted', Boolean, default=False) old_deleted.create(table, populate_default=False) table.update().\ where(table.c.deleted == table.c.id).\ values(old_deleted=True).\ execute() table.c.deleted.drop() table.c.old_deleted.alter(name="deleted") _restore_indexes_on_deleted_columns(migrate_engine, table_name, indexes) def _change_deleted_column_type_to_boolean_sqlite(migrate_engine, table_name, **col_name_col_instance): insp = reflection.Inspector.from_engine(migrate_engine) table = get_table(migrate_engine, table_name) columns = [] for column in table.columns: column_copy = None if column.name != "deleted": if isinstance(column.type, NullType): column_copy = _get_not_supported_column(col_name_col_instance, column.name) else: column_copy = column.copy() else: column_copy = Column('deleted', Boolean, default=0) columns.append(column_copy) constraints = [constraint.copy() for constraint in table.constraints] meta = table.metadata new_table = Table(table_name + "__tmp__", meta, *(columns + constraints)) new_table.create() indexes = [] for index in insp.get_indexes(table_name): column_names = [new_table.c[c] for c in index['column_names']] indexes.append(Index(index["name"], *column_names, unique=index["unique"])) c_select = [] for c in table.c: if c.name != "deleted": c_select.append(c) else: c_select.append(table.c.deleted == table.c.id) ins = InsertFromSelect(new_table, select(c_select)) migrate_engine.execute(ins) table.drop() [index.create(migrate_engine) for index in indexes] new_table.rename(table_name) new_table.update().\ where(new_table.c.deleted == new_table.c.id).\ values(deleted=True).\ execute() def change_deleted_column_type_to_id_type(migrate_engine, table_name, **col_name_col_instance): if migrate_engine.name == "sqlite": return _change_deleted_column_type_to_id_type_sqlite( migrate_engine, table_name, **col_name_col_instance) insp = reflection.Inspector.from_engine(migrate_engine) indexes = insp.get_indexes(table_name) table = get_table(migrate_engine, table_name) new_deleted = Column('new_deleted', table.c.id.type, default=_get_default_deleted_value(table)) new_deleted.create(table, populate_default=True) deleted = True # workaround for pyflakes table.update().\ where(table.c.deleted == deleted).\ values(new_deleted=table.c.id).\ execute() table.c.deleted.drop() table.c.new_deleted.alter(name="deleted") _restore_indexes_on_deleted_columns(migrate_engine, table_name, indexes) def _change_deleted_column_type_to_id_type_sqlite(migrate_engine, table_name, **col_name_col_instance): # NOTE(boris-42): sqlaclhemy-migrate can't drop column with check # constraints in sqlite DB and our `deleted` column has # 2 check constraints. So there is only one way to remove # these constraints: # 1) Create new table with the same columns, constraints # and indexes. (except deleted column). # 2) Copy all data from old to new table. # 3) Drop old table. # 4) Rename new table to old table name. insp = reflection.Inspector.from_engine(migrate_engine) meta = MetaData(bind=migrate_engine) table = Table(table_name, meta, autoload=True) default_deleted_value = _get_default_deleted_value(table) columns = [] for column in table.columns: column_copy = None if column.name != "deleted": if isinstance(column.type, NullType): column_copy = _get_not_supported_column(col_name_col_instance, column.name) else: column_copy = column.copy() else: column_copy = Column('deleted', table.c.id.type, default=default_deleted_value) columns.append(column_copy) def is_deleted_column_constraint(constraint): # NOTE(boris-42): There is no other way to check is CheckConstraint # associated with deleted column. if not isinstance(constraint, CheckConstraint): return False sqltext = str(constraint.sqltext) return (sqltext.endswith("deleted in (0, 1)") or sqltext.endswith("deleted IN (:deleted_1, :deleted_2)")) constraints = [] for constraint in table.constraints: if not is_deleted_column_constraint(constraint): constraints.append(constraint.copy()) new_table = Table(table_name + "__tmp__", meta, *(columns + constraints)) new_table.create() indexes = [] for index in insp.get_indexes(table_name): column_names = [new_table.c[c] for c in index['column_names']] indexes.append(Index(index["name"], *column_names, unique=index["unique"])) ins = InsertFromSelect(new_table, table.select()) migrate_engine.execute(ins) table.drop() [index.create(migrate_engine) for index in indexes] new_table.rename(table_name) deleted = True # workaround for pyflakes new_table.update().\ where(new_table.c.deleted == deleted).\ values(deleted=new_table.c.id).\ execute() # NOTE(boris-42): Fix value of deleted column: False -> "" or 0. deleted = False # workaround for pyflakes new_table.update().\ where(new_table.c.deleted == deleted).\ values(deleted=default_deleted_value).\ execute() def get_connect_string(backend, database, user=None, passwd=None): """Get database connection Try to get a connection with a very specific set of values, if we get these then we'll run the tests, otherwise they are skipped """ args = {'backend': backend, 'user': user, 'passwd': passwd, 'database': database} if backend == 'sqlite': template = '%(backend)s:///%(database)s' else: template = "%(backend)s://%(user)s:%(passwd)s@localhost/%(database)s" return template % args def is_backend_avail(backend, database, user=None, passwd=None): try: connect_uri = get_connect_string(backend=backend, database=database, user=user, passwd=passwd) engine = sqlalchemy.create_engine(connect_uri) connection = engine.connect() except Exception: # intentionally catch all to handle exceptions even if we don't # have any backend code loaded. return False else: connection.close() engine.dispose() return True def get_db_connection_info(conn_pieces): database = conn_pieces.path.strip('/') loc_pieces = conn_pieces.netloc.split('@') host = loc_pieces[1] auth_pieces = loc_pieces[0].split(':') user = auth_pieces[0] password = "" if len(auth_pieces) > 1: password = auth_pieces[1].strip() return (user, password, database, host) ironic-2014.1.rc1/ironic/openstack/common/db/sqlalchemy/test_migrations.py0000664000175300017540000002550312316614116027771 0ustar jenkinsjenkins00000000000000# Copyright 2010-2011 OpenStack Foundation # Copyright 2012-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. import functools import logging import os import subprocess import lockfile from six import moves from six.moves.urllib import parse import sqlalchemy import sqlalchemy.exc from ironic.openstack.common.db.sqlalchemy import utils from ironic.openstack.common.gettextutils import _LE from ironic.openstack.common import test LOG = logging.getLogger(__name__) def _have_mysql(user, passwd, database): present = os.environ.get('TEST_MYSQL_PRESENT') if present is None: return utils.is_backend_avail(backend='mysql', user=user, passwd=passwd, database=database) return present.lower() in ('', 'true') def _have_postgresql(user, passwd, database): present = os.environ.get('TEST_POSTGRESQL_PRESENT') if present is None: return utils.is_backend_avail(backend='postgres', user=user, passwd=passwd, database=database) return present.lower() in ('', 'true') def _set_db_lock(lock_path=None, lock_prefix=None): def decorator(f): @functools.wraps(f) def wrapper(*args, **kwargs): try: path = lock_path or os.environ.get("IRONIC_LOCK_PATH") lock = lockfile.FileLock(os.path.join(path, lock_prefix)) with lock: LOG.debug('Got lock "%s"' % f.__name__) return f(*args, **kwargs) finally: LOG.debug('Lock released "%s"' % f.__name__) return wrapper return decorator class BaseMigrationTestCase(test.BaseTestCase): """Base class fort testing of migration utils.""" def __init__(self, *args, **kwargs): super(BaseMigrationTestCase, self).__init__(*args, **kwargs) self.DEFAULT_CONFIG_FILE = os.path.join(os.path.dirname(__file__), 'test_migrations.conf') # Test machines can set the TEST_MIGRATIONS_CONF variable # to override the location of the config file for migration testing self.CONFIG_FILE_PATH = os.environ.get('TEST_MIGRATIONS_CONF', self.DEFAULT_CONFIG_FILE) self.test_databases = {} self.migration_api = None def setUp(self): super(BaseMigrationTestCase, self).setUp() # Load test databases from the config file. Only do this # once. No need to re-run this on each test... LOG.debug('config_path is %s' % self.CONFIG_FILE_PATH) if os.path.exists(self.CONFIG_FILE_PATH): cp = moves.configparser.RawConfigParser() try: cp.read(self.CONFIG_FILE_PATH) defaults = cp.defaults() for key, value in defaults.items(): self.test_databases[key] = value except moves.configparser.ParsingError as e: self.fail("Failed to read test_migrations.conf config " "file. Got error: %s" % e) else: self.fail("Failed to find test_migrations.conf config " "file.") self.engines = {} for key, value in self.test_databases.items(): self.engines[key] = sqlalchemy.create_engine(value) # We start each test case with a completely blank slate. self._reset_databases() def tearDown(self): # We destroy the test data store between each test case, # and recreate it, which ensures that we have no side-effects # from the tests self._reset_databases() super(BaseMigrationTestCase, self).tearDown() def execute_cmd(self, cmd=None): process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) output = process.communicate()[0] LOG.debug(output) self.assertEqual(0, process.returncode, "Failed to run: %s\n%s" % (cmd, output)) def _reset_pg(self, conn_pieces): (user, password, database, host) = utils.get_db_connection_info(conn_pieces) os.environ['PGPASSWORD'] = password os.environ['PGUSER'] = user # note(boris-42): We must create and drop database, we can't # drop database which we have connected to, so for such # operations there is a special database template1. sqlcmd = ("psql -w -U %(user)s -h %(host)s -c" " '%(sql)s' -d template1") sql = ("drop database if exists %s;") % database droptable = sqlcmd % {'user': user, 'host': host, 'sql': sql} self.execute_cmd(droptable) sql = ("create database %s;") % database createtable = sqlcmd % {'user': user, 'host': host, 'sql': sql} self.execute_cmd(createtable) os.unsetenv('PGPASSWORD') os.unsetenv('PGUSER') @_set_db_lock(lock_prefix='migration_tests-') def _reset_databases(self): for key, engine in self.engines.items(): conn_string = self.test_databases[key] conn_pieces = parse.urlparse(conn_string) engine.dispose() if conn_string.startswith('sqlite'): # We can just delete the SQLite database, which is # the easiest and cleanest solution db_path = conn_pieces.path.strip('/') if os.path.exists(db_path): os.unlink(db_path) # No need to recreate the SQLite DB. SQLite will # create it for us if it's not there... elif conn_string.startswith('mysql'): # We can execute the MySQL client to destroy and re-create # the MYSQL database, which is easier and less error-prone # than using SQLAlchemy to do this via MetaData...trust me. (user, password, database, host) = \ utils.get_db_connection_info(conn_pieces) sql = ("drop database if exists %(db)s; " "create database %(db)s;") % {'db': database} cmd = ("mysql -u \"%(user)s\" -p\"%(password)s\" -h %(host)s " "-e \"%(sql)s\"") % {'user': user, 'password': password, 'host': host, 'sql': sql} self.execute_cmd(cmd) elif conn_string.startswith('postgresql'): self._reset_pg(conn_pieces) class WalkVersionsMixin(object): def _walk_versions(self, engine=None, snake_walk=False, downgrade=True): # Determine latest version script from the repo, then # upgrade from 1 through to the latest, with no data # in the databases. This just checks that the schema itself # upgrades successfully. # Place the database under version control self.migration_api.version_control(engine, self.REPOSITORY, self.INIT_VERSION) self.assertEqual(self.INIT_VERSION, self.migration_api.db_version(engine, self.REPOSITORY)) LOG.debug('latest version is %s' % self.REPOSITORY.latest) versions = range(self.INIT_VERSION + 1, self.REPOSITORY.latest + 1) for version in versions: # upgrade -> downgrade -> upgrade self._migrate_up(engine, version, with_data=True) if snake_walk: downgraded = self._migrate_down( engine, version - 1, with_data=True) if downgraded: self._migrate_up(engine, version) if downgrade: # Now walk it back down to 0 from the latest, testing # the downgrade paths. for version in reversed(versions): # downgrade -> upgrade -> downgrade downgraded = self._migrate_down(engine, version - 1) if snake_walk and downgraded: self._migrate_up(engine, version) self._migrate_down(engine, version - 1) def _migrate_down(self, engine, version, with_data=False): try: self.migration_api.downgrade(engine, self.REPOSITORY, version) except NotImplementedError: # NOTE(sirp): some migrations, namely release-level # migrations, don't support a downgrade. return False self.assertEqual( version, self.migration_api.db_version(engine, self.REPOSITORY)) # NOTE(sirp): `version` is what we're downgrading to (i.e. the 'target' # version). So if we have any downgrade checks, they need to be run for # the previous (higher numbered) migration. if with_data: post_downgrade = getattr( self, "_post_downgrade_%03d" % (version + 1), None) if post_downgrade: post_downgrade(engine) return True def _migrate_up(self, engine, version, with_data=False): """migrate up to a new version of the db. We allow for data insertion and post checks at every migration version with special _pre_upgrade_### and _check_### functions in the main test. """ # NOTE(sdague): try block is here because it's impossible to debug # where a failed data migration happens otherwise try: if with_data: data = None pre_upgrade = getattr( self, "_pre_upgrade_%03d" % version, None) if pre_upgrade: data = pre_upgrade(engine) self.migration_api.upgrade(engine, self.REPOSITORY, version) self.assertEqual(version, self.migration_api.db_version(engine, self.REPOSITORY)) if with_data: check = getattr(self, "_check_%03d" % version, None) if check: check(engine, data) except Exception: LOG.error(_LE("Failed to migrate to version %s on engine %s") % (version, engine)) raise ironic-2014.1.rc1/ironic/openstack/common/db/sqlalchemy/__init__.py0000664000175300017540000000000012316614116026276 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/openstack/common/db/sqlalchemy/session.py0000664000175300017540000010201712316614116026235 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # 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. """Session Handling for SQLAlchemy backend. Recommended ways to use sessions within this framework: * Don't use them explicitly; this is like running with ``AUTOCOMMIT=1``. `model_query()` will implicitly use a session when called without one supplied. This is the ideal situation because it will allow queries to be automatically retried if the database connection is interrupted. .. note:: Automatic retry will be enabled in a future patch. It is generally fine to issue several queries in a row like this. Even though they may be run in separate transactions and/or separate sessions, each one will see the data from the prior calls. If needed, undo- or rollback-like functionality should be handled at a logical level. For an example, look at the code around quotas and `reservation_rollback()`. Examples: .. code:: python def get_foo(context, foo): return (model_query(context, models.Foo). filter_by(foo=foo). first()) def update_foo(context, id, newfoo): (model_query(context, models.Foo). filter_by(id=id). update({'foo': newfoo})) def create_foo(context, values): foo_ref = models.Foo() foo_ref.update(values) foo_ref.save() return foo_ref * Within the scope of a single method, keep all the reads and writes within the context managed by a single session. In this way, the session's `__exit__` handler will take care of calling `flush()` and `commit()` for you. If using this approach, you should not explicitly call `flush()` or `commit()`. Any error within the context of the session will cause the session to emit a `ROLLBACK`. Database errors like `IntegrityError` will be raised in `session`'s `__exit__` handler, and any try/except within the context managed by `session` will not be triggered. And catching other non-database errors in the session will not trigger the ROLLBACK, so exception handlers should always be outside the session, unless the developer wants to do a partial commit on purpose. If the connection is dropped before this is possible, the database will implicitly roll back the transaction. .. note:: Statements in the session scope will not be automatically retried. If you create models within the session, they need to be added, but you do not need to call `model.save()`: .. code:: python def create_many_foo(context, foos): session = sessionmaker() with session.begin(): for foo in foos: foo_ref = models.Foo() foo_ref.update(foo) session.add(foo_ref) def update_bar(context, foo_id, newbar): session = sessionmaker() with session.begin(): foo_ref = (model_query(context, models.Foo, session). filter_by(id=foo_id). first()) (model_query(context, models.Bar, session). filter_by(id=foo_ref['bar_id']). update({'bar': newbar})) .. note:: `update_bar` is a trivially simple example of using ``with session.begin``. Whereas `create_many_foo` is a good example of when a transaction is needed, it is always best to use as few queries as possible. The two queries in `update_bar` can be better expressed using a single query which avoids the need for an explicit transaction. It can be expressed like so: .. code:: python def update_bar(context, foo_id, newbar): subq = (model_query(context, models.Foo.id). filter_by(id=foo_id). limit(1). subquery()) (model_query(context, models.Bar). filter_by(id=subq.as_scalar()). update({'bar': newbar})) For reference, this emits approximately the following SQL statement: .. code:: sql UPDATE bar SET bar = ${newbar} WHERE id=(SELECT bar_id FROM foo WHERE id = ${foo_id} LIMIT 1); .. note:: `create_duplicate_foo` is a trivially simple example of catching an exception while using ``with session.begin``. Here create two duplicate instances with same primary key, must catch the exception out of context managed by a single session: .. code:: python def create_duplicate_foo(context): foo1 = models.Foo() foo2 = models.Foo() foo1.id = foo2.id = 1 session = sessionmaker() try: with session.begin(): session.add(foo1) session.add(foo2) except exception.DBDuplicateEntry as e: handle_error(e) * Passing an active session between methods. Sessions should only be passed to private methods. The private method must use a subtransaction; otherwise SQLAlchemy will throw an error when you call `session.begin()` on an existing transaction. Public methods should not accept a session parameter and should not be involved in sessions within the caller's scope. Note that this incurs more overhead in SQLAlchemy than the above means due to nesting transactions, and it is not possible to implicitly retry failed database operations when using this approach. This also makes code somewhat more difficult to read and debug, because a single database transaction spans more than one method. Error handling becomes less clear in this situation. When this is needed for code clarity, it should be clearly documented. .. code:: python def myfunc(foo): session = sessionmaker() with session.begin(): # do some database things bar = _private_func(foo, session) return bar def _private_func(foo, session=None): if not session: session = sessionmaker() with session.begin(subtransaction=True): # do some other database things return bar There are some things which it is best to avoid: * Don't keep a transaction open any longer than necessary. This means that your ``with session.begin()`` block should be as short as possible, while still containing all the related calls for that transaction. * Avoid ``with_lockmode('UPDATE')`` when possible. In MySQL/InnoDB, when a ``SELECT ... FOR UPDATE`` query does not match any rows, it will take a gap-lock. This is a form of write-lock on the "gap" where no rows exist, and prevents any other writes to that space. This can effectively prevent any INSERT into a table by locking the gap at the end of the index. Similar problems will occur if the SELECT FOR UPDATE has an overly broad WHERE clause, or doesn't properly use an index. One idea proposed at ODS Fall '12 was to use a normal SELECT to test the number of rows matching a query, and if only one row is returned, then issue the SELECT FOR UPDATE. The better long-term solution is to use ``INSERT .. ON DUPLICATE KEY UPDATE``. However, this can not be done until the "deleted" columns are removed and proper UNIQUE constraints are added to the tables. Enabling soft deletes: * To use/enable soft-deletes, the `SoftDeleteMixin` must be added to your model class. For example: .. code:: python class NovaBase(models.SoftDeleteMixin, models.ModelBase): pass Efficient use of soft deletes: * There are two possible ways to mark a record as deleted: `model.soft_delete()` and `query.soft_delete()`. The `model.soft_delete()` method works with a single already-fetched entry. `query.soft_delete()` makes only one db request for all entries that correspond to the query. * In almost all cases you should use `query.soft_delete()`. Some examples: .. code:: python def soft_delete_bar(): count = model_query(BarModel).find(some_condition).soft_delete() if count == 0: raise Exception("0 entries were soft deleted") def complex_soft_delete_with_synchronization_bar(session=None): if session is None: session = sessionmaker() with session.begin(subtransactions=True): count = (model_query(BarModel). find(some_condition). soft_delete(synchronize_session=True)) # Here synchronize_session is required, because we # don't know what is going on in outer session. if count == 0: raise Exception("0 entries were soft deleted") * There is only one situation where `model.soft_delete()` is appropriate: when you fetch a single record, work with it, and mark it as deleted in the same transaction. .. code:: python def soft_delete_bar_model(): session = sessionmaker() with session.begin(): bar_ref = model_query(BarModel).find(some_condition).first() # Work with bar_ref bar_ref.soft_delete(session=session) However, if you need to work with all entries that correspond to query and then soft delete them you should use the `query.soft_delete()` method: .. code:: python def soft_delete_multi_models(): session = sessionmaker() with session.begin(): query = (model_query(BarModel, session=session). find(some_condition)) model_refs = query.all() # Work with model_refs query.soft_delete(synchronize_session=False) # synchronize_session=False should be set if there is no outer # session and these entries are not used after this. When working with many rows, it is very important to use query.soft_delete, which issues a single query. Using `model.soft_delete()`, as in the following example, is very inefficient. .. code:: python for bar_ref in bar_refs: bar_ref.soft_delete(session=session) # This will produce count(bar_refs) db requests. """ import functools import logging import re import time import six from sqlalchemy import exc as sqla_exc from sqlalchemy.interfaces import PoolListener import sqlalchemy.orm from sqlalchemy.pool import NullPool, StaticPool from sqlalchemy.sql.expression import literal_column from ironic.openstack.common.db import exception from ironic.openstack.common.gettextutils import _LE, _LW, _LI from ironic.openstack.common import timeutils LOG = logging.getLogger(__name__) class SqliteForeignKeysListener(PoolListener): """Ensures that the foreign key constraints are enforced in SQLite. The foreign key constraints are disabled by default in SQLite, so the foreign key constraints will be enabled here for every database connection """ def connect(self, dbapi_con, con_record): dbapi_con.execute('pragma foreign_keys=ON') # note(boris-42): In current versions of DB backends unique constraint # violation messages follow the structure: # # sqlite: # 1 column - (IntegrityError) column c1 is not unique # N columns - (IntegrityError) column c1, c2, ..., N are not unique # # sqlite since 3.7.16: # 1 column - (IntegrityError) UNIQUE constraint failed: tbl.k1 # # N columns - (IntegrityError) UNIQUE constraint failed: tbl.k1, tbl.k2 # # postgres: # 1 column - (IntegrityError) duplicate key value violates unique # constraint "users_c1_key" # N columns - (IntegrityError) duplicate key value violates unique # constraint "name_of_our_constraint" # # mysql: # 1 column - (IntegrityError) (1062, "Duplicate entry 'value_of_c1' for key # 'c1'") # N columns - (IntegrityError) (1062, "Duplicate entry 'values joined # with -' for key 'name_of_our_constraint'") # # ibm_db_sa: # N columns - (IntegrityError) SQL0803N One or more values in the INSERT # statement, UPDATE statement, or foreign key update caused by a # DELETE statement are not valid because the primary key, unique # constraint or unique index identified by "2" constrains table # "NOVA.KEY_PAIRS" from having duplicate values for the index # key. _DUP_KEY_RE_DB = { "sqlite": (re.compile(r"^.*columns?([^)]+)(is|are)\s+not\s+unique$"), re.compile(r"^.*UNIQUE\s+constraint\s+failed:\s+(.+)$")), "postgresql": (re.compile(r"^.*duplicate\s+key.*\"([^\"]+)\"\s*\n.*$"),), "mysql": (re.compile(r"^.*\(1062,.*'([^\']+)'\"\)$"),), "ibm_db_sa": (re.compile(r"^.*SQL0803N.*$"),), } def _raise_if_duplicate_entry_error(integrity_error, engine_name): """Raise exception if two entries are duplicated. In this function will be raised DBDuplicateEntry exception if integrity error wrap unique constraint violation. """ def get_columns_from_uniq_cons_or_name(columns): # note(vsergeyev): UniqueConstraint name convention: "uniq_t0c10c2" # where `t` it is table name and columns `c1`, `c2` # are in UniqueConstraint. uniqbase = "uniq_" if not columns.startswith(uniqbase): if engine_name == "postgresql": return [columns[columns.index("_") + 1:columns.rindex("_")]] return [columns] return columns[len(uniqbase):].split("0")[1:] if engine_name not in ["ibm_db_sa", "mysql", "sqlite", "postgresql"]: return # FIXME(johannes): The usage of the .message attribute has been # deprecated since Python 2.6. However, the exceptions raised by # SQLAlchemy can differ when using unicode() and accessing .message. # An audit across all three supported engines will be necessary to # ensure there are no regressions. for pattern in _DUP_KEY_RE_DB[engine_name]: match = pattern.match(integrity_error.message) if match: break else: return # NOTE(mriedem): The ibm_db_sa integrity error message doesn't provide the # columns so we have to omit that from the DBDuplicateEntry error. columns = '' if engine_name != 'ibm_db_sa': columns = match.group(1) if engine_name == "sqlite": columns = [c.split('.')[-1] for c in columns.strip().split(", ")] else: columns = get_columns_from_uniq_cons_or_name(columns) raise exception.DBDuplicateEntry(columns, integrity_error) # NOTE(comstud): In current versions of DB backends, Deadlock violation # messages follow the structure: # # mysql: # (OperationalError) (1213, 'Deadlock found when trying to get lock; try ' # 'restarting transaction') _DEADLOCK_RE_DB = { "mysql": re.compile(r"^.*\(1213, 'Deadlock.*") } def _raise_if_deadlock_error(operational_error, engine_name): """Raise exception on deadlock condition. Raise DBDeadlock exception if OperationalError contains a Deadlock condition. """ re = _DEADLOCK_RE_DB.get(engine_name) if re is None: return # FIXME(johannes): The usage of the .message attribute has been # deprecated since Python 2.6. However, the exceptions raised by # SQLAlchemy can differ when using unicode() and accessing .message. # An audit across all three supported engines will be necessary to # ensure there are no regressions. m = re.match(operational_error.message) if not m: return raise exception.DBDeadlock(operational_error) def _wrap_db_error(f): #TODO(rpodolyaka): in a subsequent commit make this a class decorator to # ensure it can only applied to Session subclasses instances (as we use # Session instance bind attribute below) @functools.wraps(f) def _wrap(self, *args, **kwargs): try: return f(self, *args, **kwargs) except UnicodeEncodeError: raise exception.DBInvalidUnicodeParameter() except sqla_exc.OperationalError as e: _raise_if_db_connection_lost(e, self.bind) _raise_if_deadlock_error(e, self.bind.dialect.name) # NOTE(comstud): A lot of code is checking for OperationalError # so let's not wrap it for now. raise # note(boris-42): We should catch unique constraint violation and # wrap it by our own DBDuplicateEntry exception. Unique constraint # violation is wrapped by IntegrityError. except sqla_exc.IntegrityError as e: # note(boris-42): SqlAlchemy doesn't unify errors from different # DBs so we must do this. Also in some tables (for example # instance_types) there are more than one unique constraint. This # means we should get names of columns, which values violate # unique constraint, from error message. _raise_if_duplicate_entry_error(e, self.bind.dialect.name) raise exception.DBError(e) except Exception as e: LOG.exception(_LE('DB exception wrapped.')) raise exception.DBError(e) return _wrap def _synchronous_switch_listener(dbapi_conn, connection_rec): """Switch sqlite connections to non-synchronous mode.""" dbapi_conn.execute("PRAGMA synchronous = OFF") def _add_regexp_listener(dbapi_con, con_record): """Add REGEXP function to sqlite connections.""" def regexp(expr, item): reg = re.compile(expr) return reg.search(six.text_type(item)) is not None dbapi_con.create_function('regexp', 2, regexp) def _thread_yield(dbapi_con, con_record): """Ensure other greenthreads get a chance to be executed. If we use eventlet.monkey_patch(), eventlet.greenthread.sleep(0) will execute instead of time.sleep(0). Force a context switch. With common database backends (eg MySQLdb and sqlite), there is no implicit yield caused by network I/O since they are implemented by C libraries that eventlet cannot monkey patch. """ time.sleep(0) def _ping_listener(engine, dbapi_conn, connection_rec, connection_proxy): """Ensures that MySQL and DB2 connections are alive. Borrowed from: http://groups.google.com/group/sqlalchemy/msg/a4ce563d802c929f """ cursor = dbapi_conn.cursor() try: ping_sql = 'select 1' if engine.name == 'ibm_db_sa': # DB2 requires a table expression ping_sql = 'select 1 from (values (1)) AS t1' cursor.execute(ping_sql) except Exception as ex: if engine.dialect.is_disconnect(ex, dbapi_conn, cursor): msg = _LW('Database server has gone away: %s') % ex LOG.warning(msg) raise sqla_exc.DisconnectionError(msg) else: raise def _set_mode_traditional(dbapi_con, connection_rec, connection_proxy): """Set engine mode to 'traditional'. Required to prevent silent truncates at insert or update operations under MySQL. By default MySQL truncates inserted string if it longer than a declared field just with warning. That is fraught with data corruption. """ _set_session_sql_mode(dbapi_con, connection_rec, connection_proxy, 'TRADITIONAL') def _set_session_sql_mode(dbapi_con, connection_rec, connection_proxy, sql_mode=None): """Set the sql_mode session variable. MySQL supports several server modes. The default is None, but sessions may choose to enable server modes like TRADITIONAL, ANSI, several STRICT_* modes and others. Note: passing in '' (empty string) for sql_mode clears the SQL mode for the session, overriding a potentially set server default. Passing in None (the default) makes this a no-op, meaning if a server-side SQL mode is set, it still applies. """ cursor = dbapi_con.cursor() if sql_mode is not None: cursor.execute("SET SESSION sql_mode = %s", [sql_mode]) # Check against the real effective SQL mode. Even when unset by # our own config, the server may still be operating in a specific # SQL mode as set by the server configuration cursor.execute("SHOW VARIABLES LIKE 'sql_mode'") row = cursor.fetchone() if row is None: LOG.warning(_LW('Unable to detect effective SQL mode')) return realmode = row[1] LOG.info(_LI('MySQL server mode set to %s') % realmode) # 'TRADITIONAL' mode enables several other modes, so # we need a substring match here if not ('TRADITIONAL' in realmode.upper() or 'STRICT_ALL_TABLES' in realmode.upper()): LOG.warning(_LW("MySQL SQL mode is '%s', " "consider enabling TRADITIONAL or STRICT_ALL_TABLES") % realmode) def _is_db_connection_error(args): """Return True if error in connecting to db.""" # NOTE(adam_g): This is currently MySQL specific and needs to be extended # to support Postgres and others. # For the db2, the error code is -30081 since the db2 is still not ready conn_err_codes = ('2002', '2003', '2006', '2013', '-30081') for err_code in conn_err_codes: if args.find(err_code) != -1: return True return False def _raise_if_db_connection_lost(error, engine): # NOTE(vsergeyev): Function is_disconnect(e, connection, cursor) # requires connection and cursor in incoming parameters, # but we have no possibility to create connection if DB # is not available, so in such case reconnect fails. # But is_disconnect() ignores these parameters, so it # makes sense to pass to function None as placeholder # instead of connection and cursor. if engine.dialect.is_disconnect(error, None, None): raise exception.DBConnectionError(error) def create_engine(sql_connection, sqlite_fk=False, mysql_sql_mode=None, mysql_traditional_mode=False, idle_timeout=3600, connection_debug=0, max_pool_size=None, max_overflow=None, pool_timeout=None, sqlite_synchronous=True, connection_trace=False, max_retries=10, retry_interval=10): """Return a new SQLAlchemy engine.""" connection_dict = sqlalchemy.engine.url.make_url(sql_connection) engine_args = { "pool_recycle": idle_timeout, 'convert_unicode': True, } logger = logging.getLogger('sqlalchemy.engine') # Map SQL debug level to Python log level if connection_debug >= 100: logger.setLevel(logging.DEBUG) elif connection_debug >= 50: logger.setLevel(logging.INFO) else: logger.setLevel(logging.WARNING) if "sqlite" in connection_dict.drivername: if sqlite_fk: engine_args["listeners"] = [SqliteForeignKeysListener()] engine_args["poolclass"] = NullPool if sql_connection == "sqlite://": engine_args["poolclass"] = StaticPool engine_args["connect_args"] = {'check_same_thread': False} else: if max_pool_size is not None: engine_args['pool_size'] = max_pool_size if max_overflow is not None: engine_args['max_overflow'] = max_overflow if pool_timeout is not None: engine_args['pool_timeout'] = pool_timeout engine = sqlalchemy.create_engine(sql_connection, **engine_args) sqlalchemy.event.listen(engine, 'checkin', _thread_yield) if engine.name in ['mysql', 'ibm_db_sa']: ping_callback = functools.partial(_ping_listener, engine) sqlalchemy.event.listen(engine, 'checkout', ping_callback) if engine.name == 'mysql': if mysql_traditional_mode: mysql_sql_mode = 'TRADITIONAL' if mysql_sql_mode: mode_callback = functools.partial(_set_session_sql_mode, sql_mode=mysql_sql_mode) sqlalchemy.event.listen(engine, 'checkout', mode_callback) elif 'sqlite' in connection_dict.drivername: if not sqlite_synchronous: sqlalchemy.event.listen(engine, 'connect', _synchronous_switch_listener) sqlalchemy.event.listen(engine, 'connect', _add_regexp_listener) if connection_trace and engine.dialect.dbapi.__name__ == 'MySQLdb': _patch_mysqldb_with_stacktrace_comments() try: engine.connect() except sqla_exc.OperationalError as e: if not _is_db_connection_error(e.args[0]): raise remaining = max_retries if remaining == -1: remaining = 'infinite' while True: msg = _LW('SQL connection failed. %s attempts left.') LOG.warning(msg % remaining) if remaining != 'infinite': remaining -= 1 time.sleep(retry_interval) try: engine.connect() break except sqla_exc.OperationalError as e: if (remaining != 'infinite' and remaining == 0) or \ not _is_db_connection_error(e.args[0]): raise return engine class Query(sqlalchemy.orm.query.Query): """Subclass of sqlalchemy.query with soft_delete() method.""" def soft_delete(self, synchronize_session='evaluate'): return self.update({'deleted': literal_column('id'), 'updated_at': literal_column('updated_at'), 'deleted_at': timeutils.utcnow()}, synchronize_session=synchronize_session) class Session(sqlalchemy.orm.session.Session): """Custom Session class to avoid SqlAlchemy Session monkey patching.""" @_wrap_db_error def query(self, *args, **kwargs): return super(Session, self).query(*args, **kwargs) @_wrap_db_error def flush(self, *args, **kwargs): return super(Session, self).flush(*args, **kwargs) @_wrap_db_error def execute(self, *args, **kwargs): return super(Session, self).execute(*args, **kwargs) def get_maker(engine, autocommit=True, expire_on_commit=False): """Return a SQLAlchemy sessionmaker using the given engine.""" return sqlalchemy.orm.sessionmaker(bind=engine, class_=Session, autocommit=autocommit, expire_on_commit=expire_on_commit, query_cls=Query) def _patch_mysqldb_with_stacktrace_comments(): """Adds current stack trace as a comment in queries. Patches MySQLdb.cursors.BaseCursor._do_query. """ import MySQLdb.cursors import traceback old_mysql_do_query = MySQLdb.cursors.BaseCursor._do_query def _do_query(self, q): stack = '' for filename, line, method, function in traceback.extract_stack(): # exclude various common things from trace if filename.endswith('session.py') and method == '_do_query': continue if filename.endswith('api.py') and method == 'wrapper': continue if filename.endswith('utils.py') and method == '_inner': continue if filename.endswith('exception.py') and method == '_wrap': continue # db/api is just a wrapper around db/sqlalchemy/api if filename.endswith('db/api.py'): continue # only trace inside ironic index = filename.rfind('ironic') if index == -1: continue stack += "File:%s:%s Method:%s() Line:%s | " \ % (filename[index:], line, method, function) # strip trailing " | " from stack if stack: stack = stack[:-3] qq = "%s /* %s */" % (q, stack) else: qq = q old_mysql_do_query(self, qq) setattr(MySQLdb.cursors.BaseCursor, '_do_query', _do_query) class EngineFacade(object): """A helper class for removing of global engine instances from ironic.db. As a library, ironic.db can't decide where to store/when to create engine and sessionmaker instances, so this must be left for a target application. On the other hand, in order to simplify the adoption of ironic.db changes, we'll provide a helper class, which creates engine and sessionmaker on its instantiation and provides get_engine()/get_session() methods that are compatible with corresponding utility functions that currently exist in target projects, e.g. in Nova. engine/sessionmaker instances will still be global (and they are meant to be global), but they will be stored in the app context, rather that in the ironic.db context. Note: using of this helper is completely optional and you are encouraged to integrate engine/sessionmaker instances into your apps any way you like (e.g. one might want to bind a session to a request context). Two important things to remember: 1. An Engine instance is effectively a pool of DB connections, so it's meant to be shared (and it's thread-safe). 2. A Session instance is not meant to be shared and represents a DB transactional context (i.e. it's not thread-safe). sessionmaker is a factory of sessions. """ def __init__(self, sql_connection, sqlite_fk=False, mysql_sql_mode=None, autocommit=True, expire_on_commit=False, **kwargs): """Initialize engine and sessionmaker instances. :param sqlite_fk: enable foreign keys in SQLite :type sqlite_fk: bool :param mysql_sql_mode: set SQL mode in MySQL :type mysql_sql_mode: string :param autocommit: use autocommit mode for created Session instances :type autocommit: bool :param expire_on_commit: expire session objects on commit :type expire_on_commit: bool Keyword arguments: :keyword idle_timeout: timeout before idle sql connections are reaped (defaults to 3600) :keyword connection_debug: verbosity of SQL debugging information. 0=None, 100=Everything (defaults to 0) :keyword max_pool_size: maximum number of SQL connections to keep open in a pool (defaults to SQLAlchemy settings) :keyword max_overflow: if set, use this value for max_overflow with sqlalchemy (defaults to SQLAlchemy settings) :keyword pool_timeout: if set, use this value for pool_timeout with sqlalchemy (defaults to SQLAlchemy settings) :keyword sqlite_synchronous: if True, SQLite uses synchronous mode (defaults to True) :keyword connection_trace: add python stack traces to SQL as comment strings (defaults to False) :keyword max_retries: maximum db connection retries during startup. (setting -1 implies an infinite retry count) (defaults to 10) :keyword retry_interval: interval between retries of opening a sql connection (defaults to 10) """ super(EngineFacade, self).__init__() self._engine = create_engine( sql_connection=sql_connection, sqlite_fk=sqlite_fk, mysql_sql_mode=mysql_sql_mode, idle_timeout=kwargs.get('idle_timeout', 3600), connection_debug=kwargs.get('connection_debug', 0), max_pool_size=kwargs.get('max_pool_size'), max_overflow=kwargs.get('max_overflow'), pool_timeout=kwargs.get('pool_timeout'), sqlite_synchronous=kwargs.get('sqlite_synchronous', True), connection_trace=kwargs.get('connection_trace', False), max_retries=kwargs.get('max_retries', 10), retry_interval=kwargs.get('retry_interval', 10)) self._session_maker = get_maker( engine=self._engine, autocommit=autocommit, expire_on_commit=expire_on_commit) def get_engine(self): """Get the engine instance (note, that it's shared).""" return self._engine def get_session(self, **kwargs): """Get a Session instance. If passed, keyword arguments values override the ones used when the sessionmaker instance was created. :keyword autocommit: use autocommit mode for created Session instances :type autocommit: bool :keyword expire_on_commit: expire session objects on commit :type expire_on_commit: bool """ for arg in kwargs: if arg not in ('autocommit', 'expire_on_commit'): del kwargs[arg] return self._session_maker(**kwargs) ironic-2014.1.rc1/ironic/openstack/common/db/sqlalchemy/migration.py0000664000175300017540000002356212316614116026552 0ustar jenkinsjenkins00000000000000# coding: utf-8 # # Copyright (c) 2013 OpenStack Foundation # 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. # # Base on code in migrate/changeset/databases/sqlite.py which is under # the following license: # # The MIT License # # Copyright (c) 2009 Evan Rosson, Jan Dittberner, Domen Kožar # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. import os import re from migrate.changeset import ansisql from migrate.changeset.databases import sqlite from migrate import exceptions as versioning_exceptions from migrate.versioning import api as versioning_api from migrate.versioning.repository import Repository import sqlalchemy from sqlalchemy.schema import UniqueConstraint from ironic.openstack.common.db import exception from ironic.openstack.common.gettextutils import _ def _get_unique_constraints(self, table): """Retrieve information about existing unique constraints of the table This feature is needed for _recreate_table() to work properly. Unfortunately, it's not available in sqlalchemy 0.7.x/0.8.x. """ data = table.metadata.bind.execute( """SELECT sql FROM sqlite_master WHERE type='table' AND name=:table_name""", table_name=table.name ).fetchone()[0] UNIQUE_PATTERN = "CONSTRAINT (\w+) UNIQUE \(([^\)]+)\)" return [ UniqueConstraint( *[getattr(table.columns, c.strip(' "')) for c in cols.split(",")], name=name ) for name, cols in re.findall(UNIQUE_PATTERN, data) ] def _recreate_table(self, table, column=None, delta=None, omit_uniques=None): """Recreate the table properly Unlike the corresponding original method of sqlalchemy-migrate this one doesn't drop existing unique constraints when creating a new one. """ table_name = self.preparer.format_table(table) # we remove all indexes so as not to have # problems during copy and re-create for index in table.indexes: index.drop() # reflect existing unique constraints for uc in self._get_unique_constraints(table): table.append_constraint(uc) # omit given unique constraints when creating a new table if required table.constraints = set([ cons for cons in table.constraints if omit_uniques is None or cons.name not in omit_uniques ]) self.append('ALTER TABLE %s RENAME TO migration_tmp' % table_name) self.execute() insertion_string = self._modify_table(table, column, delta) table.create(bind=self.connection) self.append(insertion_string % {'table_name': table_name}) self.execute() self.append('DROP TABLE migration_tmp') self.execute() def _visit_migrate_unique_constraint(self, *p, **k): """Drop the given unique constraint The corresponding original method of sqlalchemy-migrate just raises NotImplemented error """ self.recreate_table(p[0].table, omit_uniques=[p[0].name]) def patch_migrate(): """A workaround for SQLite's inability to alter things SQLite abilities to alter tables are very limited (please read http://www.sqlite.org/lang_altertable.html for more details). E. g. one can't drop a column or a constraint in SQLite. The workaround for this is to recreate the original table omitting the corresponding constraint (or column). sqlalchemy-migrate library has recreate_table() method that implements this workaround, but it does it wrong: - information about unique constraints of a table is not retrieved. So if you have a table with one unique constraint and a migration adding another one you will end up with a table that has only the latter unique constraint, and the former will be lost - dropping of unique constraints is not supported at all The proper way to fix this is to provide a pull-request to sqlalchemy-migrate, but the project seems to be dead. So we can go on with monkey-patching of the lib at least for now. """ # this patch is needed to ensure that recreate_table() doesn't drop # existing unique constraints of the table when creating a new one helper_cls = sqlite.SQLiteHelper helper_cls.recreate_table = _recreate_table helper_cls._get_unique_constraints = _get_unique_constraints # this patch is needed to be able to drop existing unique constraints constraint_cls = sqlite.SQLiteConstraintDropper constraint_cls.visit_migrate_unique_constraint = \ _visit_migrate_unique_constraint constraint_cls.__bases__ = (ansisql.ANSIColumnDropper, sqlite.SQLiteConstraintGenerator) def db_sync(engine, abs_path, version=None, init_version=0): """Upgrade or downgrade a database. Function runs the upgrade() or downgrade() functions in change scripts. :param engine: SQLAlchemy engine instance for a given database :param abs_path: Absolute path to migrate repository. :param version: Database will upgrade/downgrade until this version. If None - database will update to the latest available version. :param init_version: Initial database version """ if version is not None: try: version = int(version) except ValueError: raise exception.DbMigrationError( message=_("version should be an integer")) current_version = db_version(engine, abs_path, init_version) repository = _find_migrate_repo(abs_path) _db_schema_sanity_check(engine) if version is None or version > current_version: return versioning_api.upgrade(engine, repository, version) else: return versioning_api.downgrade(engine, repository, version) def _db_schema_sanity_check(engine): """Ensure all database tables were created with required parameters. :param engine: SQLAlchemy engine instance for a given database """ if engine.name == 'mysql': onlyutf8_sql = ('SELECT TABLE_NAME,TABLE_COLLATION ' 'from information_schema.TABLES ' 'where TABLE_SCHEMA=%s and ' 'TABLE_COLLATION NOT LIKE "%%utf8%%"') table_names = [res[0] for res in engine.execute(onlyutf8_sql, engine.url.database)] if len(table_names) > 0: raise ValueError(_('Tables "%s" have non utf8 collation, ' 'please make sure all tables are CHARSET=utf8' ) % ','.join(table_names)) def db_version(engine, abs_path, init_version): """Show the current version of the repository. :param engine: SQLAlchemy engine instance for a given database :param abs_path: Absolute path to migrate repository :param version: Initial database version """ repository = _find_migrate_repo(abs_path) try: return versioning_api.db_version(engine, repository) except versioning_exceptions.DatabaseNotControlledError: meta = sqlalchemy.MetaData() meta.reflect(bind=engine) tables = meta.tables if len(tables) == 0 or 'alembic_version' in tables: db_version_control(engine, abs_path, version=init_version) return versioning_api.db_version(engine, repository) else: raise exception.DbMigrationError( message=_( "The database is not under version control, but has " "tables. Please stamp the current version of the schema " "manually.")) def db_version_control(engine, abs_path, version=None): """Mark a database as under this repository's version control. Once a database is under version control, schema changes should only be done via change scripts in this repository. :param engine: SQLAlchemy engine instance for a given database :param abs_path: Absolute path to migrate repository :param version: Initial database version """ repository = _find_migrate_repo(abs_path) versioning_api.version_control(engine, repository, version) return version def _find_migrate_repo(abs_path): """Get the project's change script repository :param abs_path: Absolute path to migrate repository """ if not os.path.exists(abs_path): raise exception.DbMigrationError("Path %s not found" % abs_path) return Repository(abs_path) ironic-2014.1.rc1/ironic/openstack/common/db/sqlalchemy/migration_cli/0000775000175300017540000000000012316614636027026 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/openstack/common/db/sqlalchemy/migration_cli/manager.py0000664000175300017540000000454112316614116031007 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 stevedore import enabled MIGRATION_NAMESPACE = 'ironic.openstack.common.migration' def check_plugin_enabled(ext): """Used for EnabledExtensionManager""" return ext.obj.enabled class MigrationManager(object): def __init__(self, migration_config): self._manager = enabled.EnabledExtensionManager( MIGRATION_NAMESPACE, check_plugin_enabled, invoke_kwds={'migration_config': migration_config}, invoke_on_load=True ) if not self._plugins: raise ValueError('There must be at least one plugin active.') @property def _plugins(self): return sorted(ext.obj for ext in self._manager.extensions) def upgrade(self, revision): """Upgrade database with all available backends.""" results = [] for plugin in self._plugins: results.append(plugin.upgrade(revision)) return results def downgrade(self, revision): """Downgrade database with available backends.""" #downgrading should be performed in reversed order results = [] for plugin in reversed(self._plugins): results.append(plugin.downgrade(revision)) return results def version(self): """Return last version of db.""" last = None for plugin in self._plugins: version = plugin.version() if version: last = version return last def revision(self, message, autogenerate): """Generate template or autogenerated revision.""" #revision should be done only by last plugin return self._plugins[-1].revision(message, autogenerate) def stamp(self, revision): """Create stamp for a given revision.""" return self._plugins[-1].stamp(revision) ironic-2014.1.rc1/ironic/openstack/common/db/sqlalchemy/migration_cli/ext_alembic.py0000664000175300017540000000571012316614116031650 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 os import alembic from alembic import config as alembic_config import alembic.migration as alembic_migration from ironic.openstack.common.db.sqlalchemy.migration_cli import ext_base from ironic.openstack.common.db.sqlalchemy import session as db_session class AlembicExtension(ext_base.MigrationExtensionBase): order = 2 @property def enabled(self): return os.path.exists(self.alembic_ini_path) def __init__(self, migration_config): """Extension to provide alembic features. :param migration_config: Stores specific configuration for migrations :type migration_config: dict """ self.alembic_ini_path = migration_config.get('alembic_ini_path', '') self.config = alembic_config.Config(self.alembic_ini_path) # option should be used if script is not in default directory repo_path = migration_config.get('alembic_repo_path') if repo_path: self.config.set_main_option('script_location', repo_path) self.db_url = migration_config['db_url'] def upgrade(self, version): return alembic.command.upgrade(self.config, version or 'head') def downgrade(self, version): if isinstance(version, int) or version is None or version.isdigit(): version = 'base' return alembic.command.downgrade(self.config, version) def version(self): engine = db_session.create_engine(self.db_url) with engine.connect() as conn: context = alembic_migration.MigrationContext.configure(conn) return context.get_current_revision() def revision(self, message='', autogenerate=False): """Creates template for migration. :param message: Text that will be used for migration title :type message: string :param autogenerate: If True - generates diff based on current database state :type autogenerate: bool """ return alembic.command.revision(self.config, message=message, autogenerate=autogenerate) def stamp(self, revision): """Stamps database with provided revision. :param revision: Should match one from repository or head - to stamp database with most recent revision :type revision: string """ return alembic.command.stamp(self.config, revision=revision) ironic-2014.1.rc1/ironic/openstack/common/db/sqlalchemy/migration_cli/ext_base.py0000664000175300017540000000405612316614116031170 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 abc import six @six.add_metaclass(abc.ABCMeta) class MigrationExtensionBase(object): #used to sort migration in logical order order = 0 @property def enabled(self): """Used for availability verification of a plugin. :rtype: bool """ return False @abc.abstractmethod def upgrade(self, version): """Used for upgrading database. :param version: Desired database version :type version: string """ @abc.abstractmethod def downgrade(self, version): """Used for downgrading database. :param version: Desired database version :type version: string """ @abc.abstractmethod def version(self): """Current database version. :returns: Databse version :rtype: string """ def revision(self, *args, **kwargs): """Used to generate migration script. In migration engines that support this feature, it should generate new migration script. Accept arbitrary set of arguments. """ raise NotImplementedError() def stamp(self, *args, **kwargs): """Stamps database based on plugin features. Accept arbitrary set of arguments. """ raise NotImplementedError() def __cmp__(self, other): """Used for definition of plugin order. :param other: MigrationExtensionBase instance :rtype: bool """ return self.order > other.order ironic-2014.1.rc1/ironic/openstack/common/db/sqlalchemy/migration_cli/ext_migrate.py0000664000175300017540000000471512316614116031710 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 logging import os from ironic.openstack.common.db.sqlalchemy import migration from ironic.openstack.common.db.sqlalchemy.migration_cli import ext_base from ironic.openstack.common.db.sqlalchemy import session as db_session from ironic.openstack.common.gettextutils import _LE LOG = logging.getLogger(__name__) class MigrateExtension(ext_base.MigrationExtensionBase): """Extension to provide sqlalchemy-migrate features. :param migration_config: Stores specific configuration for migrations :type migration_config: dict """ order = 1 def __init__(self, migration_config): self.repository = migration_config.get('migration_repo_path', '') self.init_version = migration_config.get('init_version', 0) self.db_url = migration_config['db_url'] self.engine = db_session.create_engine(self.db_url) @property def enabled(self): return os.path.exists(self.repository) def upgrade(self, version): version = None if version == 'head' else version return migration.db_sync( self.engine, self.repository, version, init_version=self.init_version) def downgrade(self, version): try: #version for migrate should be valid int - else skip if version in ('base', None): version = self.init_version version = int(version) return migration.db_sync( self.engine, self.repository, version, init_version=self.init_version) except ValueError: LOG.error( _LE('Migration number for migrate plugin must be valid ' 'integer or empty, if you want to downgrade ' 'to initial state') ) raise def version(self): return migration.db_version( self.engine, self.repository, init_version=self.init_version) ironic-2014.1.rc1/ironic/openstack/common/db/sqlalchemy/migration_cli/__init__.py0000664000175300017540000000000012316614116031116 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/openstack/common/db/sqlalchemy/models.py0000664000175300017540000000737312316614116026046 0ustar jenkinsjenkins00000000000000# Copyright (c) 2011 X.commerce, a business unit of eBay Inc. # Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # Copyright 2011 Piston Cloud Computing, Inc. # Copyright 2012 Cloudscaling Group, Inc. # 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. """ SQLAlchemy models. """ import six from sqlalchemy import Column, Integer from sqlalchemy import DateTime from sqlalchemy.orm import object_mapper from ironic.openstack.common import timeutils class ModelBase(object): """Base class for models.""" __table_initialized__ = False def save(self, session): """Save this object.""" # NOTE(boris-42): This part of code should be look like: # session.add(self) # session.flush() # But there is a bug in sqlalchemy and eventlet that # raises NoneType exception if there is no running # transaction and rollback is called. As long as # sqlalchemy has this bug we have to create transaction # explicitly. with session.begin(subtransactions=True): session.add(self) session.flush() def __setitem__(self, key, value): setattr(self, key, value) def __getitem__(self, key): return getattr(self, key) def get(self, key, default=None): return getattr(self, key, default) @property def _extra_keys(self): """Specifies custom fields Subclasses can override this property to return a list of custom fields that should be included in their dict representation. For reference check tests/db/sqlalchemy/test_models.py """ return [] def __iter__(self): columns = dict(object_mapper(self).columns).keys() # NOTE(russellb): Allow models to specify other keys that can be looked # up, beyond the actual db columns. An example would be the 'name' # property for an Instance. columns.extend(self._extra_keys) self._i = iter(columns) return self def next(self): n = six.advance_iterator(self._i) return n, getattr(self, n) def update(self, values): """Make the model object behave like a dict.""" for k, v in six.iteritems(values): setattr(self, k, v) def iteritems(self): """Make the model object behave like a dict. Includes attributes from joins. """ local = dict(self) joined = dict([(k, v) for k, v in six.iteritems(self.__dict__) if not k[0] == '_']) local.update(joined) return six.iteritems(local) class TimestampMixin(object): created_at = Column(DateTime, default=lambda: timeutils.utcnow()) updated_at = Column(DateTime, onupdate=lambda: timeutils.utcnow()) class SoftDeleteMixin(object): deleted_at = Column(DateTime) deleted = Column(Integer, default=0) def soft_delete(self, session): """Mark this object as deleted.""" self.deleted = self.id self.deleted_at = timeutils.utcnow() self.save(session=session) ironic-2014.1.rc1/ironic/openstack/common/db/sqlalchemy/provision.py0000664000175300017540000001311512316614116026602 0ustar jenkinsjenkins00000000000000# Copyright 2013 Mirantis.inc # 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. """Provision test environment for specific DB backends""" import argparse import os import random import string from six import moves import sqlalchemy from ironic.openstack.common.db import exception as exc SQL_CONNECTION = os.getenv('OS_TEST_DBAPI_ADMIN_CONNECTION', 'sqlite://') def _gen_credentials(*names): """Generate credentials.""" auth_dict = {} for name in names: val = ''.join(random.choice(string.ascii_lowercase) for i in moves.range(10)) auth_dict[name] = val return auth_dict def _get_engine(uri=SQL_CONNECTION): """Engine creation By default the uri is SQL_CONNECTION which is admin credentials. Call the function without arguments to get admin connection. Admin connection required to create temporary user and database for each particular test. Otherwise use existing connection to recreate connection to the temporary database. """ return sqlalchemy.create_engine(uri, poolclass=sqlalchemy.pool.NullPool) def _execute_sql(engine, sql, driver): """Initialize connection, execute sql query and close it.""" try: with engine.connect() as conn: if driver == 'postgresql': conn.connection.set_isolation_level(0) for s in sql: conn.execute(s) except sqlalchemy.exc.OperationalError: msg = ('%s does not match database admin ' 'credentials or database does not exist.') raise exc.DBConnectionError(msg % SQL_CONNECTION) def create_database(engine): """Provide temporary user and database for each particular test.""" driver = engine.name auth = _gen_credentials('database', 'user', 'passwd') sqls = { 'mysql': [ "drop database if exists %(database)s;", "grant all on %(database)s.* to '%(user)s'@'localhost'" " identified by '%(passwd)s';", "create database %(database)s;", ], 'postgresql': [ "drop database if exists %(database)s;", "drop user if exists %(user)s;", "create user %(user)s with password '%(passwd)s';", "create database %(database)s owner %(user)s;", ] } if driver == 'sqlite': return 'sqlite:////tmp/%s' % auth['database'] try: sql_rows = sqls[driver] except KeyError: raise ValueError('Unsupported RDBMS %s' % driver) sql_query = map(lambda x: x % auth, sql_rows) _execute_sql(engine, sql_query, driver) params = auth.copy() params['backend'] = driver return "%(backend)s://%(user)s:%(passwd)s@localhost/%(database)s" % params def drop_database(engine, current_uri): """Drop temporary database and user after each particular test.""" engine = _get_engine(current_uri) admin_engine = _get_engine() driver = engine.name auth = {'database': engine.url.database, 'user': engine.url.username} if driver == 'sqlite': try: os.remove(auth['database']) except OSError: pass return sqls = { 'mysql': [ "drop database if exists %(database)s;", "drop user '%(user)s'@'localhost';", ], 'postgresql': [ "drop database if exists %(database)s;", "drop user if exists %(user)s;", ] } try: sql_rows = sqls[driver] except KeyError: raise ValueError('Unsupported RDBMS %s' % driver) sql_query = map(lambda x: x % auth, sql_rows) _execute_sql(admin_engine, sql_query, driver) def main(): """Controller to handle commands ::create: Create test user and database with random names. ::drop: Drop user and database created by previous command. """ parser = argparse.ArgumentParser( description='Controller to handle database creation and dropping' ' commands.', epilog='Under normal circumstances is not used directly.' ' Used in .testr.conf to automate test database creation' ' and dropping processes.') subparsers = parser.add_subparsers( help='Subcommands to manipulate temporary test databases.') create = subparsers.add_parser( 'create', help='Create temporary test ' 'databases and users.') create.set_defaults(which='create') create.add_argument( 'instances_count', type=int, help='Number of databases to create.') drop = subparsers.add_parser( 'drop', help='Drop temporary test databases and users.') drop.set_defaults(which='drop') drop.add_argument( 'instances', nargs='+', help='List of databases uri to be dropped.') args = parser.parse_args() engine = _get_engine() which = args.which if which == "create": for i in range(int(args.instances_count)): print(create_database(engine)) elif which == "drop": for db in args.instances: drop_database(engine, db) if __name__ == "__main__": main() ironic-2014.1.rc1/ironic/openstack/common/jsonutils.py0000664000175300017540000001445012316614116024060 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # Copyright 2011 Justin Santa Barbara # 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. ''' JSON related utilities. This module provides a few things: 1) A handy function for getting an object down to something that can be JSON serialized. See to_primitive(). 2) Wrappers around loads() and dumps(). The dumps() wrapper will automatically use to_primitive() for you if needed. 3) This sets up anyjson to use the loads() and dumps() wrappers if anyjson is available. ''' import datetime import functools import inspect import itertools import json try: import xmlrpclib except ImportError: # NOTE(jd): xmlrpclib is not shipped with Python 3 xmlrpclib = None import six from ironic.openstack.common import gettextutils from ironic.openstack.common import importutils from ironic.openstack.common import timeutils netaddr = importutils.try_import("netaddr") _nasty_type_tests = [inspect.ismodule, inspect.isclass, inspect.ismethod, inspect.isfunction, inspect.isgeneratorfunction, inspect.isgenerator, inspect.istraceback, inspect.isframe, inspect.iscode, inspect.isbuiltin, inspect.isroutine, inspect.isabstract] _simple_types = (six.string_types + six.integer_types + (type(None), bool, float)) def to_primitive(value, convert_instances=False, convert_datetime=True, level=0, max_depth=3): """Convert a complex object into primitives. Handy for JSON serialization. We can optionally handle instances, but since this is a recursive function, we could have cyclical data structures. To handle cyclical data structures we could track the actual objects visited in a set, but not all objects are hashable. Instead we just track the depth of the object inspections and don't go too deep. Therefore, convert_instances=True is lossy ... be aware. """ # handle obvious types first - order of basic types determined by running # full tests on nova project, resulting in the following counts: # 572754 # 460353 # 379632 # 274610 # 199918 # 114200 # 51817 # 26164 # 6491 # 283 # 19 if isinstance(value, _simple_types): return value if isinstance(value, datetime.datetime): if convert_datetime: return timeutils.strtime(value) else: return value # value of itertools.count doesn't get caught by nasty_type_tests # and results in infinite loop when list(value) is called. if type(value) == itertools.count: return six.text_type(value) # FIXME(vish): Workaround for LP bug 852095. Without this workaround, # tests that raise an exception in a mocked method that # has a @wrap_exception with a notifier will fail. If # we up the dependency to 0.5.4 (when it is released) we # can remove this workaround. if getattr(value, '__module__', None) == 'mox': return 'mock' if level > max_depth: return '?' # The try block may not be necessary after the class check above, # but just in case ... try: recursive = functools.partial(to_primitive, convert_instances=convert_instances, convert_datetime=convert_datetime, level=level, max_depth=max_depth) if isinstance(value, dict): return dict((k, recursive(v)) for k, v in value.iteritems()) elif isinstance(value, (list, tuple)): return [recursive(lv) for lv in value] # It's not clear why xmlrpclib created their own DateTime type, but # for our purposes, make it a datetime type which is explicitly # handled if xmlrpclib and isinstance(value, xmlrpclib.DateTime): value = datetime.datetime(*tuple(value.timetuple())[:6]) if convert_datetime and isinstance(value, datetime.datetime): return timeutils.strtime(value) elif isinstance(value, gettextutils.Message): return value.data elif hasattr(value, 'iteritems'): return recursive(dict(value.iteritems()), level=level + 1) elif hasattr(value, '__iter__'): return recursive(list(value)) elif convert_instances and hasattr(value, '__dict__'): # Likely an instance of something. Watch for cycles. # Ignore class member vars. return recursive(value.__dict__, level=level + 1) elif netaddr and isinstance(value, netaddr.IPAddress): return six.text_type(value) else: if any(test(value) for test in _nasty_type_tests): return six.text_type(value) return value except TypeError: # Class objects are tricky since they may define something like # __iter__ defined but it isn't callable as list(). return six.text_type(value) def dumps(value, default=to_primitive, **kwargs): return json.dumps(value, default=default, **kwargs) def loads(s): return json.loads(s) def load(s): return json.load(s) try: import anyjson except ImportError: pass else: anyjson._modules.append((__name__, 'dumps', TypeError, 'loads', ValueError, 'load')) anyjson.force_implementation(__name__) ironic-2014.1.rc1/ironic/openstack/common/rpc/0000775000175300017540000000000012316614636022243 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/openstack/common/rpc/impl_kombu.py0000664000175300017540000007765712316614116024772 0ustar jenkinsjenkins00000000000000# Copyright 2011 OpenStack Foundation # # 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 import itertools import socket import ssl import time import uuid import eventlet import greenlet import kombu import kombu.connection import kombu.entity import kombu.messaging from oslo.config import cfg import six from ironic.openstack.common import excutils from ironic.openstack.common.gettextutils import _ from ironic.openstack.common import network_utils from ironic.openstack.common.rpc import amqp as rpc_amqp from ironic.openstack.common.rpc import common as rpc_common from ironic.openstack.common import sslutils kombu_opts = [ cfg.StrOpt('kombu_ssl_version', default='', help='If SSL is enabled, the SSL version to use. Valid ' 'values are TLSv1, SSLv23 and SSLv3. SSLv2 might ' 'be available on some distributions.' ), cfg.StrOpt('kombu_ssl_keyfile', default='', help='SSL key file (valid only if SSL enabled)'), cfg.StrOpt('kombu_ssl_certfile', default='', help='SSL cert file (valid only if SSL enabled)'), cfg.StrOpt('kombu_ssl_ca_certs', default='', help=('SSL certification authority file ' '(valid only if SSL enabled)')), cfg.StrOpt('rabbit_host', default='localhost', help='The RabbitMQ broker address where a single node is used'), cfg.IntOpt('rabbit_port', default=5672, help='The RabbitMQ broker port where a single node is used'), cfg.ListOpt('rabbit_hosts', default=['$rabbit_host:$rabbit_port'], help='RabbitMQ HA cluster host:port pairs'), cfg.BoolOpt('rabbit_use_ssl', default=False, help='Connect over SSL for RabbitMQ'), cfg.StrOpt('rabbit_userid', default='guest', help='The RabbitMQ userid'), cfg.StrOpt('rabbit_password', default='guest', help='The RabbitMQ password', secret=True), cfg.StrOpt('rabbit_virtual_host', default='/', help='The RabbitMQ virtual host'), cfg.IntOpt('rabbit_retry_interval', default=1, help='How frequently to retry connecting with RabbitMQ'), cfg.IntOpt('rabbit_retry_backoff', default=2, help='How long to backoff for between retries when connecting ' 'to RabbitMQ'), cfg.IntOpt('rabbit_max_retries', default=0, help='Maximum number of RabbitMQ connection retries. ' 'Default is 0 (infinite retry count)'), cfg.BoolOpt('rabbit_ha_queues', default=False, help='Use HA queues in RabbitMQ (x-ha-policy: all). ' 'If you change this option, you must wipe the ' 'RabbitMQ database.'), ] cfg.CONF.register_opts(kombu_opts) LOG = rpc_common.LOG def _get_queue_arguments(conf): """Construct the arguments for declaring a queue. If the rabbit_ha_queues option is set, we declare a mirrored queue as described here: http://www.rabbitmq.com/ha.html Setting x-ha-policy to all means that the queue will be mirrored to all nodes in the cluster. """ return {'x-ha-policy': 'all'} if conf.rabbit_ha_queues else {} class ConsumerBase(object): """Consumer base class.""" def __init__(self, channel, callback, tag, **kwargs): """Declare a queue on an amqp channel. 'channel' is the amqp channel to use 'callback' is the callback to call when messages are received 'tag' is a unique ID for the consumer on the channel queue name, exchange name, and other kombu options are passed in here as a dictionary. """ self.callback = callback self.tag = str(tag) self.kwargs = kwargs self.queue = None self.ack_on_error = kwargs.get('ack_on_error', True) self.reconnect(channel) def reconnect(self, channel): """Re-declare the queue after a rabbit reconnect.""" self.channel = channel self.kwargs['channel'] = channel self.queue = kombu.entity.Queue(**self.kwargs) self.queue.declare() def _callback_handler(self, message, callback): """Call callback with deserialized message. Messages that are processed without exception are ack'ed. If the message processing generates an exception, it will be ack'ed if ack_on_error=True. Otherwise it will be .requeue()'ed. """ try: msg = rpc_common.deserialize_msg(message.payload) callback(msg) except Exception: if self.ack_on_error: LOG.exception(_("Failed to process message" " ... skipping it.")) message.ack() else: LOG.exception(_("Failed to process message" " ... will requeue.")) message.requeue() else: message.ack() def consume(self, *args, **kwargs): """Actually declare the consumer on the amqp channel. This will start the flow of messages from the queue. Using the Connection.iterconsume() iterator will process the messages, calling the appropriate callback. If a callback is specified in kwargs, use that. Otherwise, use the callback passed during __init__() If kwargs['nowait'] is True, then this call will block until a message is read. """ options = {'consumer_tag': self.tag} options['nowait'] = kwargs.get('nowait', False) callback = kwargs.get('callback', self.callback) if not callback: raise ValueError("No callback defined") def _callback(raw_message): message = self.channel.message_to_python(raw_message) self._callback_handler(message, callback) self.queue.consume(*args, callback=_callback, **options) def cancel(self): """Cancel the consuming from the queue, if it has started.""" try: self.queue.cancel(self.tag) except KeyError as e: # NOTE(comstud): Kludge to get around a amqplib bug if str(e) != "u'%s'" % self.tag: raise self.queue = None class DirectConsumer(ConsumerBase): """Queue/consumer class for 'direct'.""" def __init__(self, conf, channel, msg_id, callback, tag, **kwargs): """Init a 'direct' queue. 'channel' is the amqp channel to use 'msg_id' is the msg_id to listen on 'callback' is the callback to call when messages are received 'tag' is a unique ID for the consumer on the channel Other kombu options may be passed """ # Default options options = {'durable': False, 'queue_arguments': _get_queue_arguments(conf), 'auto_delete': True, 'exclusive': False} options.update(kwargs) exchange = kombu.entity.Exchange(name=msg_id, type='direct', durable=options['durable'], auto_delete=options['auto_delete']) super(DirectConsumer, self).__init__(channel, callback, tag, name=msg_id, exchange=exchange, routing_key=msg_id, **options) class TopicConsumer(ConsumerBase): """Consumer class for 'topic'.""" def __init__(self, conf, channel, topic, callback, tag, name=None, exchange_name=None, **kwargs): """Init a 'topic' queue. :param channel: the amqp channel to use :param topic: the topic to listen on :paramtype topic: str :param callback: the callback to call when messages are received :param tag: a unique ID for the consumer on the channel :param name: optional queue name, defaults to topic :paramtype name: str Other kombu options may be passed as keyword arguments """ # Default options options = {'durable': conf.amqp_durable_queues, 'queue_arguments': _get_queue_arguments(conf), 'auto_delete': conf.amqp_auto_delete, 'exclusive': False} options.update(kwargs) exchange_name = exchange_name or rpc_amqp.get_control_exchange(conf) exchange = kombu.entity.Exchange(name=exchange_name, type='topic', durable=options['durable'], auto_delete=options['auto_delete']) super(TopicConsumer, self).__init__(channel, callback, tag, name=name or topic, exchange=exchange, routing_key=topic, **options) class FanoutConsumer(ConsumerBase): """Consumer class for 'fanout'.""" def __init__(self, conf, channel, topic, callback, tag, **kwargs): """Init a 'fanout' queue. 'channel' is the amqp channel to use 'topic' is the topic to listen on 'callback' is the callback to call when messages are received 'tag' is a unique ID for the consumer on the channel Other kombu options may be passed """ unique = uuid.uuid4().hex exchange_name = '%s_fanout' % topic queue_name = '%s_fanout_%s' % (topic, unique) # Default options options = {'durable': False, 'queue_arguments': _get_queue_arguments(conf), 'auto_delete': True, 'exclusive': False} options.update(kwargs) exchange = kombu.entity.Exchange(name=exchange_name, type='fanout', durable=options['durable'], auto_delete=options['auto_delete']) super(FanoutConsumer, self).__init__(channel, callback, tag, name=queue_name, exchange=exchange, routing_key=topic, **options) class Publisher(object): """Base Publisher class.""" def __init__(self, channel, exchange_name, routing_key, **kwargs): """Init the Publisher class with the exchange_name, routing_key, and other options """ self.exchange_name = exchange_name self.routing_key = routing_key self.kwargs = kwargs self.reconnect(channel) def reconnect(self, channel): """Re-establish the Producer after a rabbit reconnection.""" self.exchange = kombu.entity.Exchange(name=self.exchange_name, **self.kwargs) self.producer = kombu.messaging.Producer(exchange=self.exchange, channel=channel, routing_key=self.routing_key) def send(self, msg, timeout=None): """Send a message.""" if timeout: # # AMQP TTL is in milliseconds when set in the header. # self.producer.publish(msg, headers={'ttl': (timeout * 1000)}) else: self.producer.publish(msg) class DirectPublisher(Publisher): """Publisher class for 'direct'.""" def __init__(self, conf, channel, msg_id, **kwargs): """init a 'direct' publisher. Kombu options may be passed as keyword args to override defaults """ options = {'durable': False, 'auto_delete': True, 'exclusive': False} options.update(kwargs) super(DirectPublisher, self).__init__(channel, msg_id, msg_id, type='direct', **options) class TopicPublisher(Publisher): """Publisher class for 'topic'.""" def __init__(self, conf, channel, topic, **kwargs): """init a 'topic' publisher. Kombu options may be passed as keyword args to override defaults """ options = {'durable': conf.amqp_durable_queues, 'auto_delete': conf.amqp_auto_delete, 'exclusive': False} options.update(kwargs) exchange_name = rpc_amqp.get_control_exchange(conf) super(TopicPublisher, self).__init__(channel, exchange_name, topic, type='topic', **options) class FanoutPublisher(Publisher): """Publisher class for 'fanout'.""" def __init__(self, conf, channel, topic, **kwargs): """init a 'fanout' publisher. Kombu options may be passed as keyword args to override defaults """ options = {'durable': False, 'auto_delete': True, 'exclusive': False} options.update(kwargs) super(FanoutPublisher, self).__init__(channel, '%s_fanout' % topic, None, type='fanout', **options) class NotifyPublisher(TopicPublisher): """Publisher class for 'notify'.""" def __init__(self, conf, channel, topic, **kwargs): self.durable = kwargs.pop('durable', conf.amqp_durable_queues) self.queue_arguments = _get_queue_arguments(conf) super(NotifyPublisher, self).__init__(conf, channel, topic, **kwargs) def reconnect(self, channel): super(NotifyPublisher, self).reconnect(channel) # NOTE(jerdfelt): Normally the consumer would create the queue, but # we do this to ensure that messages don't get dropped if the # consumer is started after we do queue = kombu.entity.Queue(channel=channel, exchange=self.exchange, durable=self.durable, name=self.routing_key, routing_key=self.routing_key, queue_arguments=self.queue_arguments) queue.declare() class Connection(object): """Connection object.""" pool = None def __init__(self, conf, server_params=None): self.consumers = [] self.consumer_thread = None self.proxy_callbacks = [] self.conf = conf self.max_retries = self.conf.rabbit_max_retries # Try forever? if self.max_retries <= 0: self.max_retries = None self.interval_start = self.conf.rabbit_retry_interval self.interval_stepping = self.conf.rabbit_retry_backoff # max retry-interval = 30 seconds self.interval_max = 30 self.memory_transport = False if server_params is None: server_params = {} # Keys to translate from server_params to kombu params server_params_to_kombu_params = {'username': 'userid'} ssl_params = self._fetch_ssl_params() params_list = [] for adr in self.conf.rabbit_hosts: hostname, port = network_utils.parse_host_port( adr, default_port=self.conf.rabbit_port) params = { 'hostname': hostname, 'port': port, 'userid': self.conf.rabbit_userid, 'password': self.conf.rabbit_password, 'virtual_host': self.conf.rabbit_virtual_host, } for sp_key, value in six.iteritems(server_params): p_key = server_params_to_kombu_params.get(sp_key, sp_key) params[p_key] = value if self.conf.fake_rabbit: params['transport'] = 'memory' if self.conf.rabbit_use_ssl: params['ssl'] = ssl_params params_list.append(params) self.params_list = params_list self.memory_transport = self.conf.fake_rabbit self.connection = None self.reconnect() def _fetch_ssl_params(self): """Handles fetching what ssl params should be used for the connection (if any). """ ssl_params = dict() # http://docs.python.org/library/ssl.html - ssl.wrap_socket if self.conf.kombu_ssl_version: ssl_params['ssl_version'] = sslutils.validate_ssl_version( self.conf.kombu_ssl_version) if self.conf.kombu_ssl_keyfile: ssl_params['keyfile'] = self.conf.kombu_ssl_keyfile if self.conf.kombu_ssl_certfile: ssl_params['certfile'] = self.conf.kombu_ssl_certfile if self.conf.kombu_ssl_ca_certs: ssl_params['ca_certs'] = self.conf.kombu_ssl_ca_certs # We might want to allow variations in the # future with this? ssl_params['cert_reqs'] = ssl.CERT_REQUIRED # Return the extended behavior or just have the default behavior return ssl_params or True def _connect(self, params): """Connect to rabbit. Re-establish any queues that may have been declared before if we are reconnecting. Exceptions should be handled by the caller. """ if self.connection: LOG.info(_("Reconnecting to AMQP server on " "%(hostname)s:%(port)d") % params) try: self.connection.release() except self.connection_errors: pass # Setting this in case the next statement fails, though # it shouldn't be doing any network operations, yet. self.connection = None self.connection = kombu.connection.BrokerConnection(**params) self.connection_errors = self.connection.connection_errors if self.memory_transport: # Kludge to speed up tests. self.connection.transport.polling_interval = 0.0 self.consumer_num = itertools.count(1) self.connection.connect() self.channel = self.connection.channel() # work around 'memory' transport bug in 1.1.3 if self.memory_transport: self.channel._new_queue('ae.undeliver') for consumer in self.consumers: consumer.reconnect(self.channel) LOG.info(_('Connected to AMQP server on %(hostname)s:%(port)d') % params) def reconnect(self): """Handles reconnecting and re-establishing queues. Will retry up to self.max_retries number of times. self.max_retries = 0 means to retry forever. Sleep between tries, starting at self.interval_start seconds, backing off self.interval_stepping number of seconds each attempt. """ attempt = 0 while True: params = self.params_list[attempt % len(self.params_list)] attempt += 1 try: self._connect(params) return except (IOError, self.connection_errors) as e: pass except Exception as e: # NOTE(comstud): Unfortunately it's possible for amqplib # to return an error not covered by its transport # connection_errors in the case of a timeout waiting for # a protocol response. (See paste link in LP888621) # So, we check all exceptions for 'timeout' in them # and try to reconnect in this case. if 'timeout' not in str(e): raise log_info = {} log_info['err_str'] = str(e) log_info['max_retries'] = self.max_retries log_info.update(params) if self.max_retries and attempt == self.max_retries: msg = _('Unable to connect to AMQP server on ' '%(hostname)s:%(port)d after %(max_retries)d ' 'tries: %(err_str)s') % log_info LOG.error(msg) raise rpc_common.RPCException(msg) if attempt == 1: sleep_time = self.interval_start or 1 elif attempt > 1: sleep_time += self.interval_stepping if self.interval_max: sleep_time = min(sleep_time, self.interval_max) log_info['sleep_time'] = sleep_time LOG.error(_('AMQP server on %(hostname)s:%(port)d is ' 'unreachable: %(err_str)s. Trying again in ' '%(sleep_time)d seconds.') % log_info) time.sleep(sleep_time) def ensure(self, error_callback, method, *args, **kwargs): while True: try: return method(*args, **kwargs) except (self.connection_errors, socket.timeout, IOError) as e: if error_callback: error_callback(e) except Exception as e: # NOTE(comstud): Unfortunately it's possible for amqplib # to return an error not covered by its transport # connection_errors in the case of a timeout waiting for # a protocol response. (See paste link in LP888621) # So, we check all exceptions for 'timeout' in them # and try to reconnect in this case. if 'timeout' not in str(e): raise if error_callback: error_callback(e) self.reconnect() def get_channel(self): """Convenience call for bin/clear_rabbit_queues.""" return self.channel def close(self): """Close/release this connection.""" self.cancel_consumer_thread() self.wait_on_proxy_callbacks() self.connection.release() self.connection = None def reset(self): """Reset a connection so it can be used again.""" self.cancel_consumer_thread() self.wait_on_proxy_callbacks() self.channel.close() self.channel = self.connection.channel() # work around 'memory' transport bug in 1.1.3 if self.memory_transport: self.channel._new_queue('ae.undeliver') self.consumers = [] def declare_consumer(self, consumer_cls, topic, callback): """Create a Consumer using the class that was passed in and add it to our list of consumers """ def _connect_error(exc): log_info = {'topic': topic, 'err_str': str(exc)} LOG.error(_("Failed to declare consumer for topic '%(topic)s': " "%(err_str)s") % log_info) def _declare_consumer(): consumer = consumer_cls(self.conf, self.channel, topic, callback, six.next(self.consumer_num)) self.consumers.append(consumer) return consumer return self.ensure(_connect_error, _declare_consumer) def iterconsume(self, limit=None, timeout=None): """Return an iterator that will consume from all queues/consumers.""" info = {'do_consume': True} def _error_callback(exc): if isinstance(exc, socket.timeout): LOG.debug(_('Timed out waiting for RPC response: %s') % str(exc)) raise rpc_common.Timeout() else: LOG.exception(_('Failed to consume message from queue: %s') % str(exc)) info['do_consume'] = True def _consume(): if info['do_consume']: queues_head = self.consumers[:-1] # not fanout. queues_tail = self.consumers[-1] # fanout for queue in queues_head: queue.consume(nowait=True) queues_tail.consume(nowait=False) info['do_consume'] = False return self.connection.drain_events(timeout=timeout) for iteration in itertools.count(0): if limit and iteration >= limit: raise StopIteration yield self.ensure(_error_callback, _consume) def cancel_consumer_thread(self): """Cancel a consumer thread.""" if self.consumer_thread is not None: self.consumer_thread.kill() try: self.consumer_thread.wait() except greenlet.GreenletExit: pass self.consumer_thread = None def wait_on_proxy_callbacks(self): """Wait for all proxy callback threads to exit.""" for proxy_cb in self.proxy_callbacks: proxy_cb.wait() def publisher_send(self, cls, topic, msg, timeout=None, **kwargs): """Send to a publisher based on the publisher class.""" def _error_callback(exc): log_info = {'topic': topic, 'err_str': str(exc)} LOG.exception(_("Failed to publish message to topic " "'%(topic)s': %(err_str)s") % log_info) def _publish(): publisher = cls(self.conf, self.channel, topic, **kwargs) publisher.send(msg, timeout) self.ensure(_error_callback, _publish) def declare_direct_consumer(self, topic, callback): """Create a 'direct' queue. In nova's use, this is generally a msg_id queue used for responses for call/multicall """ self.declare_consumer(DirectConsumer, topic, callback) def declare_topic_consumer(self, topic, callback=None, queue_name=None, exchange_name=None, ack_on_error=True): """Create a 'topic' consumer.""" self.declare_consumer(functools.partial(TopicConsumer, name=queue_name, exchange_name=exchange_name, ack_on_error=ack_on_error, ), topic, callback) def declare_fanout_consumer(self, topic, callback): """Create a 'fanout' consumer.""" self.declare_consumer(FanoutConsumer, topic, callback) def direct_send(self, msg_id, msg): """Send a 'direct' message.""" self.publisher_send(DirectPublisher, msg_id, msg) def topic_send(self, topic, msg, timeout=None): """Send a 'topic' message.""" self.publisher_send(TopicPublisher, topic, msg, timeout) def fanout_send(self, topic, msg): """Send a 'fanout' message.""" self.publisher_send(FanoutPublisher, topic, msg) def notify_send(self, topic, msg, **kwargs): """Send a notify message on a topic.""" self.publisher_send(NotifyPublisher, topic, msg, None, **kwargs) def consume(self, limit=None): """Consume from all queues/consumers.""" it = self.iterconsume(limit=limit) while True: try: six.next(it) except StopIteration: return def consume_in_thread(self): """Consumer from all queues/consumers in a greenthread.""" @excutils.forever_retry_uncaught_exceptions def _consumer_thread(): try: self.consume() except greenlet.GreenletExit: return if self.consumer_thread is None: self.consumer_thread = eventlet.spawn(_consumer_thread) return self.consumer_thread def create_consumer(self, topic, proxy, fanout=False): """Create a consumer that calls a method in a proxy object.""" proxy_cb = rpc_amqp.ProxyCallback( self.conf, proxy, rpc_amqp.get_connection_pool(self.conf, Connection)) self.proxy_callbacks.append(proxy_cb) if fanout: self.declare_fanout_consumer(topic, proxy_cb) else: self.declare_topic_consumer(topic, proxy_cb) def create_worker(self, topic, proxy, pool_name): """Create a worker that calls a method in a proxy object.""" proxy_cb = rpc_amqp.ProxyCallback( self.conf, proxy, rpc_amqp.get_connection_pool(self.conf, Connection)) self.proxy_callbacks.append(proxy_cb) self.declare_topic_consumer(topic, proxy_cb, pool_name) def join_consumer_pool(self, callback, pool_name, topic, exchange_name=None, ack_on_error=True): """Register as a member of a group of consumers for a given topic from the specified exchange. Exactly one member of a given pool will receive each message. A message will be delivered to multiple pools, if more than one is created. """ callback_wrapper = rpc_amqp.CallbackWrapper( conf=self.conf, callback=callback, connection_pool=rpc_amqp.get_connection_pool(self.conf, Connection), wait_for_consumers=not ack_on_error ) self.proxy_callbacks.append(callback_wrapper) self.declare_topic_consumer( queue_name=pool_name, topic=topic, exchange_name=exchange_name, callback=callback_wrapper, ack_on_error=ack_on_error, ) def create_connection(conf, new=True): """Create a connection.""" return rpc_amqp.create_connection( conf, new, rpc_amqp.get_connection_pool(conf, Connection)) def multicall(conf, context, topic, msg, timeout=None): """Make a call that returns multiple times.""" return rpc_amqp.multicall( conf, context, topic, msg, timeout, rpc_amqp.get_connection_pool(conf, Connection)) def call(conf, context, topic, msg, timeout=None): """Sends a message on a topic and wait for a response.""" return rpc_amqp.call( conf, context, topic, msg, timeout, rpc_amqp.get_connection_pool(conf, Connection)) def cast(conf, context, topic, msg): """Sends a message on a topic without waiting for a response.""" return rpc_amqp.cast( conf, context, topic, msg, rpc_amqp.get_connection_pool(conf, Connection)) def fanout_cast(conf, context, topic, msg): """Sends a message on a fanout exchange without waiting for a response.""" return rpc_amqp.fanout_cast( conf, context, topic, msg, rpc_amqp.get_connection_pool(conf, Connection)) def cast_to_server(conf, context, server_params, topic, msg): """Sends a message on a topic to a specific server.""" return rpc_amqp.cast_to_server( conf, context, server_params, topic, msg, rpc_amqp.get_connection_pool(conf, Connection)) def fanout_cast_to_server(conf, context, server_params, topic, msg): """Sends a message on a fanout exchange to a specific server.""" return rpc_amqp.fanout_cast_to_server( conf, context, server_params, topic, msg, rpc_amqp.get_connection_pool(conf, Connection)) def notify(conf, context, topic, msg, envelope): """Sends a notification event on a topic.""" return rpc_amqp.notify( conf, context, topic, msg, rpc_amqp.get_connection_pool(conf, Connection), envelope) def cleanup(): return rpc_amqp.cleanup(Connection.pool) ironic-2014.1.rc1/ironic/openstack/common/rpc/serializer.py0000664000175300017540000000311412316614116024756 0ustar jenkinsjenkins00000000000000# Copyright 2013 IBM Corp. # # 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. """Provides the definition of an RPC serialization handler""" import abc import six @six.add_metaclass(abc.ABCMeta) class Serializer(object): """Generic (de-)serialization definition base class.""" @abc.abstractmethod def serialize_entity(self, context, entity): """Serialize something to primitive form. :param context: Security context :param entity: Entity to be serialized :returns: Serialized form of entity """ pass @abc.abstractmethod def deserialize_entity(self, context, entity): """Deserialize something from primitive form. :param context: Security context :param entity: Primitive to be deserialized :returns: Deserialized form of entity """ pass class NoOpSerializer(Serializer): """A serializer that does nothing.""" def serialize_entity(self, context, entity): return entity def deserialize_entity(self, context, entity): return entity ironic-2014.1.rc1/ironic/openstack/common/rpc/zmq_receiver.py0000775000175300017540000000217412316614116025310 0ustar jenkinsjenkins00000000000000# Copyright 2011 OpenStack Foundation # # 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 eventlet eventlet.monkey_patch() import contextlib import sys from oslo.config import cfg from ironic.openstack.common import log as logging from ironic.openstack.common import rpc from ironic.openstack.common.rpc import impl_zmq CONF = cfg.CONF CONF.register_opts(rpc.rpc_opts) CONF.register_opts(impl_zmq.zmq_opts) def main(): CONF(sys.argv[1:], project='oslo') logging.setup("oslo") with contextlib.closing(impl_zmq.ZmqProxy(CONF)) as reactor: reactor.consume_in_thread() reactor.wait() ironic-2014.1.rc1/ironic/openstack/common/rpc/matchmaker.py0000664000175300017540000002230612316614116024725 0ustar jenkinsjenkins00000000000000# Copyright 2011 Cloudscaling Group, Inc # # 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. """ The MatchMaker classes should except a Topic or Fanout exchange key and return keys for direct exchanges, per (approximate) AMQP parlance. """ import contextlib import eventlet from oslo.config import cfg from ironic.openstack.common.gettextutils import _ from ironic.openstack.common import log as logging matchmaker_opts = [ cfg.IntOpt('matchmaker_heartbeat_freq', default=300, help='Heartbeat frequency'), cfg.IntOpt('matchmaker_heartbeat_ttl', default=600, help='Heartbeat time-to-live.'), ] CONF = cfg.CONF CONF.register_opts(matchmaker_opts) LOG = logging.getLogger(__name__) contextmanager = contextlib.contextmanager class MatchMakerException(Exception): """Signified a match could not be found.""" message = _("Match not found by MatchMaker.") class Exchange(object): """Implements lookups. Subclass this to support hashtables, dns, etc. """ def __init__(self): pass def run(self, key): raise NotImplementedError() class Binding(object): """A binding on which to perform a lookup.""" def __init__(self): pass def test(self, key): raise NotImplementedError() class MatchMakerBase(object): """Match Maker Base Class. Build off HeartbeatMatchMakerBase if building a heartbeat-capable MatchMaker. """ def __init__(self): # Array of tuples. Index [2] toggles negation, [3] is last-if-true self.bindings = [] self.no_heartbeat_msg = _('Matchmaker does not implement ' 'registration or heartbeat.') def register(self, key, host): """Register a host on a backend. Heartbeats, if applicable, may keepalive registration. """ pass def ack_alive(self, key, host): """Acknowledge that a key.host is alive. Used internally for updating heartbeats, but may also be used publicly to acknowledge a system is alive (i.e. rpc message successfully sent to host) """ pass def is_alive(self, topic, host): """Checks if a host is alive.""" pass def expire(self, topic, host): """Explicitly expire a host's registration.""" pass def send_heartbeats(self): """Send all heartbeats. Use start_heartbeat to spawn a heartbeat greenthread, which loops this method. """ pass def unregister(self, key, host): """Unregister a topic.""" pass def start_heartbeat(self): """Spawn heartbeat greenthread.""" pass def stop_heartbeat(self): """Destroys the heartbeat greenthread.""" pass def add_binding(self, binding, rule, last=True): self.bindings.append((binding, rule, False, last)) #NOTE(ewindisch): kept the following method in case we implement the # underlying support. #def add_negate_binding(self, binding, rule, last=True): # self.bindings.append((binding, rule, True, last)) def queues(self, key): workers = [] # bit is for negate bindings - if we choose to implement it. # last stops processing rules if this matches. for (binding, exchange, bit, last) in self.bindings: if binding.test(key): workers.extend(exchange.run(key)) # Support last. if last: return workers return workers class HeartbeatMatchMakerBase(MatchMakerBase): """Base for a heart-beat capable MatchMaker. Provides common methods for registering, unregistering, and maintaining heartbeats. """ def __init__(self): self.hosts = set() self._heart = None self.host_topic = {} super(HeartbeatMatchMakerBase, self).__init__() def send_heartbeats(self): """Send all heartbeats. Use start_heartbeat to spawn a heartbeat greenthread, which loops this method. """ for key, host in self.host_topic: self.ack_alive(key, host) def ack_alive(self, key, host): """Acknowledge that a host.topic is alive. Used internally for updating heartbeats, but may also be used publicly to acknowledge a system is alive (i.e. rpc message successfully sent to host) """ raise NotImplementedError("Must implement ack_alive") def backend_register(self, key, host): """Implements registration logic. Called by register(self,key,host) """ raise NotImplementedError("Must implement backend_register") def backend_unregister(self, key, key_host): """Implements de-registration logic. Called by unregister(self,key,host) """ raise NotImplementedError("Must implement backend_unregister") def register(self, key, host): """Register a host on a backend. Heartbeats, if applicable, may keepalive registration. """ self.hosts.add(host) self.host_topic[(key, host)] = host key_host = '.'.join((key, host)) self.backend_register(key, key_host) self.ack_alive(key, host) def unregister(self, key, host): """Unregister a topic.""" if (key, host) in self.host_topic: del self.host_topic[(key, host)] self.hosts.discard(host) self.backend_unregister(key, '.'.join((key, host))) LOG.info(_("Matchmaker unregistered: %(key)s, %(host)s"), {'key': key, 'host': host}) def start_heartbeat(self): """Implementation of MatchMakerBase.start_heartbeat. Launches greenthread looping send_heartbeats(), yielding for CONF.matchmaker_heartbeat_freq seconds between iterations. """ if not self.hosts: raise MatchMakerException( _("Register before starting heartbeat.")) def do_heartbeat(): while True: self.send_heartbeats() eventlet.sleep(CONF.matchmaker_heartbeat_freq) self._heart = eventlet.spawn(do_heartbeat) def stop_heartbeat(self): """Destroys the heartbeat greenthread.""" if self._heart: self._heart.kill() class DirectBinding(Binding): """Specifies a host in the key via a '.' character. Although dots are used in the key, the behavior here is that it maps directly to a host, thus direct. """ def test(self, key): return '.' in key class TopicBinding(Binding): """Where a 'bare' key without dots. AMQP generally considers topic exchanges to be those *with* dots, but we deviate here in terminology as the behavior here matches that of a topic exchange (whereas where there are dots, behavior matches that of a direct exchange. """ def test(self, key): return '.' not in key class FanoutBinding(Binding): """Match on fanout keys, where key starts with 'fanout.' string.""" def test(self, key): return key.startswith('fanout~') class StubExchange(Exchange): """Exchange that does nothing.""" def run(self, key): return [(key, None)] class LocalhostExchange(Exchange): """Exchange where all direct topics are local.""" def __init__(self, host='localhost'): self.host = host super(Exchange, self).__init__() def run(self, key): return [('.'.join((key.split('.')[0], self.host)), self.host)] class DirectExchange(Exchange): """Exchange where all topic keys are split, sending to second half. i.e. "compute.host" sends a message to "compute.host" running on "host" """ def __init__(self): super(Exchange, self).__init__() def run(self, key): e = key.split('.', 1)[1] return [(key, e)] class MatchMakerLocalhost(MatchMakerBase): """Match Maker where all bare topics resolve to localhost. Useful for testing. """ def __init__(self, host='localhost'): super(MatchMakerLocalhost, self).__init__() self.add_binding(FanoutBinding(), LocalhostExchange(host)) self.add_binding(DirectBinding(), DirectExchange()) self.add_binding(TopicBinding(), LocalhostExchange(host)) class MatchMakerStub(MatchMakerBase): """Match Maker where topics are untouched. Useful for testing, or for AMQP/brokered queues. Will not work where knowledge of hosts is known (i.e. zeromq) """ def __init__(self): super(MatchMakerStub, self).__init__() self.add_binding(FanoutBinding(), StubExchange()) self.add_binding(DirectBinding(), StubExchange()) self.add_binding(TopicBinding(), StubExchange()) ironic-2014.1.rc1/ironic/openstack/common/rpc/proxy.py0000664000175300017540000002234712316614116023777 0ustar jenkinsjenkins00000000000000# Copyright 2012-2013 Red Hat, Inc. # # 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. """ A helper class for proxy objects to remote APIs. For more information about rpc API version numbers, see: rpc/dispatcher.py """ import six from ironic.openstack.common import rpc from ironic.openstack.common.rpc import common as rpc_common from ironic.openstack.common.rpc import serializer as rpc_serializer class RpcProxy(object): """A helper class for rpc clients. This class is a wrapper around the RPC client API. It allows you to specify the topic and API version in a single place. This is intended to be used as a base class for a class that implements the client side of an rpc API. """ # The default namespace, which can be overridden in a subclass. RPC_API_NAMESPACE = None def __init__(self, topic, default_version, version_cap=None, serializer=None): """Initialize an RpcProxy. :param topic: The topic to use for all messages. :param default_version: The default API version to request in all outgoing messages. This can be overridden on a per-message basis. :param version_cap: Optionally cap the maximum version used for sent messages. :param serializer: Optionaly (de-)serialize entities with a provided helper. """ self.topic = topic self.default_version = default_version self.version_cap = version_cap if serializer is None: serializer = rpc_serializer.NoOpSerializer() self.serializer = serializer super(RpcProxy, self).__init__() def _set_version(self, msg, vers): """Helper method to set the version in a message. :param msg: The message having a version added to it. :param vers: The version number to add to the message. """ v = vers if vers else self.default_version if (self.version_cap and not rpc_common.version_is_compatible(self.version_cap, v)): raise rpc_common.RpcVersionCapError(version_cap=self.version_cap) msg['version'] = v def _get_topic(self, topic): """Return the topic to use for a message.""" return topic if topic else self.topic def can_send_version(self, version): """Check to see if a version is compatible with the version cap.""" return (not self.version_cap or rpc_common.version_is_compatible(self.version_cap, version)) @staticmethod def make_namespaced_msg(method, namespace, **kwargs): return {'method': method, 'namespace': namespace, 'args': kwargs} def make_msg(self, method, **kwargs): return self.make_namespaced_msg(method, self.RPC_API_NAMESPACE, **kwargs) def _serialize_msg_args(self, context, kwargs): """Helper method called to serialize message arguments. This calls our serializer on each argument, returning a new set of args that have been serialized. :param context: The request context :param kwargs: The arguments to serialize :returns: A new set of serialized arguments """ new_kwargs = dict() for argname, arg in six.iteritems(kwargs): new_kwargs[argname] = self.serializer.serialize_entity(context, arg) return new_kwargs def call(self, context, msg, topic=None, version=None, timeout=None): """rpc.call() a remote method. :param context: The request context :param msg: The message to send, including the method and args. :param topic: Override the topic for this message. :param version: (Optional) Override the requested API version in this message. :param timeout: (Optional) A timeout to use when waiting for the response. If no timeout is specified, a default timeout will be used that is usually sufficient. :returns: The return value from the remote method. """ self._set_version(msg, version) msg['args'] = self._serialize_msg_args(context, msg['args']) real_topic = self._get_topic(topic) try: result = rpc.call(context, real_topic, msg, timeout) return self.serializer.deserialize_entity(context, result) except rpc.common.Timeout as exc: raise rpc.common.Timeout( exc.info, real_topic, msg.get('method')) def multicall(self, context, msg, topic=None, version=None, timeout=None): """rpc.multicall() a remote method. :param context: The request context :param msg: The message to send, including the method and args. :param topic: Override the topic for this message. :param version: (Optional) Override the requested API version in this message. :param timeout: (Optional) A timeout to use when waiting for the response. If no timeout is specified, a default timeout will be used that is usually sufficient. :returns: An iterator that lets you process each of the returned values from the remote method as they arrive. """ self._set_version(msg, version) msg['args'] = self._serialize_msg_args(context, msg['args']) real_topic = self._get_topic(topic) try: result = rpc.multicall(context, real_topic, msg, timeout) return self.serializer.deserialize_entity(context, result) except rpc.common.Timeout as exc: raise rpc.common.Timeout( exc.info, real_topic, msg.get('method')) def cast(self, context, msg, topic=None, version=None): """rpc.cast() a remote method. :param context: The request context :param msg: The message to send, including the method and args. :param topic: Override the topic for this message. :param version: (Optional) Override the requested API version in this message. :returns: None. rpc.cast() does not wait on any return value from the remote method. """ self._set_version(msg, version) msg['args'] = self._serialize_msg_args(context, msg['args']) rpc.cast(context, self._get_topic(topic), msg) def fanout_cast(self, context, msg, topic=None, version=None): """rpc.fanout_cast() a remote method. :param context: The request context :param msg: The message to send, including the method and args. :param topic: Override the topic for this message. :param version: (Optional) Override the requested API version in this message. :returns: None. rpc.fanout_cast() does not wait on any return value from the remote method. """ self._set_version(msg, version) msg['args'] = self._serialize_msg_args(context, msg['args']) rpc.fanout_cast(context, self._get_topic(topic), msg) def cast_to_server(self, context, server_params, msg, topic=None, version=None): """rpc.cast_to_server() a remote method. :param context: The request context :param server_params: Server parameters. See rpc.cast_to_server() for details. :param msg: The message to send, including the method and args. :param topic: Override the topic for this message. :param version: (Optional) Override the requested API version in this message. :returns: None. rpc.cast_to_server() does not wait on any return values. """ self._set_version(msg, version) msg['args'] = self._serialize_msg_args(context, msg['args']) rpc.cast_to_server(context, server_params, self._get_topic(topic), msg) def fanout_cast_to_server(self, context, server_params, msg, topic=None, version=None): """rpc.fanout_cast_to_server() a remote method. :param context: The request context :param server_params: Server parameters. See rpc.cast_to_server() for details. :param msg: The message to send, including the method and args. :param topic: Override the topic for this message. :param version: (Optional) Override the requested API version in this message. :returns: None. rpc.fanout_cast_to_server() does not wait on any return values. """ self._set_version(msg, version) msg['args'] = self._serialize_msg_args(context, msg['args']) rpc.fanout_cast_to_server(context, server_params, self._get_topic(topic), msg) ironic-2014.1.rc1/ironic/openstack/common/rpc/impl_qpid.py0000664000175300017540000007171612316614116024600 0ustar jenkinsjenkins00000000000000# Copyright 2011 OpenStack Foundation # Copyright 2011 - 2012, Red Hat, Inc. # # 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 import itertools import time import eventlet import greenlet from oslo.config import cfg import six from ironic.openstack.common import excutils from ironic.openstack.common.gettextutils import _ from ironic.openstack.common import importutils from ironic.openstack.common import jsonutils from ironic.openstack.common import log as logging from ironic.openstack.common.rpc import amqp as rpc_amqp from ironic.openstack.common.rpc import common as rpc_common qpid_codec = importutils.try_import("qpid.codec010") qpid_messaging = importutils.try_import("qpid.messaging") qpid_exceptions = importutils.try_import("qpid.messaging.exceptions") LOG = logging.getLogger(__name__) qpid_opts = [ cfg.StrOpt('qpid_hostname', default='localhost', help='Qpid broker hostname'), cfg.IntOpt('qpid_port', default=5672, help='Qpid broker port'), cfg.ListOpt('qpid_hosts', default=['$qpid_hostname:$qpid_port'], help='Qpid HA cluster host:port pairs'), cfg.StrOpt('qpid_username', default='', help='Username for qpid connection'), cfg.StrOpt('qpid_password', default='', help='Password for qpid connection', secret=True), cfg.StrOpt('qpid_sasl_mechanisms', default='', help='Space separated list of SASL mechanisms to use for auth'), cfg.IntOpt('qpid_heartbeat', default=60, help='Seconds between connection keepalive heartbeats'), cfg.StrOpt('qpid_protocol', default='tcp', help="Transport to use, either 'tcp' or 'ssl'"), cfg.BoolOpt('qpid_tcp_nodelay', default=True, help='Disable Nagle algorithm'), # NOTE(russellb) If any additional versions are added (beyond 1 and 2), # this file could probably use some additional refactoring so that the # differences between each version are split into different classes. cfg.IntOpt('qpid_topology_version', default=1, help="The qpid topology version to use. Version 1 is what " "was originally used by impl_qpid. Version 2 includes " "some backwards-incompatible changes that allow broker " "federation to work. Users should update to version 2 " "when they are able to take everything down, as it " "requires a clean break."), ] cfg.CONF.register_opts(qpid_opts) JSON_CONTENT_TYPE = 'application/json; charset=utf8' def raise_invalid_topology_version(conf): msg = (_("Invalid value for qpid_topology_version: %d") % conf.qpid_topology_version) LOG.error(msg) raise Exception(msg) class ConsumerBase(object): """Consumer base class.""" def __init__(self, conf, session, callback, node_name, node_opts, link_name, link_opts): """Declare a queue on an amqp session. 'session' is the amqp session to use 'callback' is the callback to call when messages are received 'node_name' is the first part of the Qpid address string, before ';' 'node_opts' will be applied to the "x-declare" section of "node" in the address string. 'link_name' goes into the "name" field of the "link" in the address string 'link_opts' will be applied to the "x-declare" section of "link" in the address string. """ self.callback = callback self.receiver = None self.session = None if conf.qpid_topology_version == 1: addr_opts = { "create": "always", "node": { "type": "topic", "x-declare": { "durable": True, "auto-delete": True, }, }, "link": { "durable": True, "x-declare": { "durable": False, "auto-delete": True, "exclusive": False, }, }, } addr_opts["node"]["x-declare"].update(node_opts) elif conf.qpid_topology_version == 2: addr_opts = { "link": { "x-declare": { "auto-delete": True, "exclusive": False, }, }, } else: raise_invalid_topology_version() addr_opts["link"]["x-declare"].update(link_opts) if link_name: addr_opts["link"]["name"] = link_name self.address = "%s ; %s" % (node_name, jsonutils.dumps(addr_opts)) self.connect(session) def connect(self, session): """Declare the receiver on connect.""" self._declare_receiver(session) def reconnect(self, session): """Re-declare the receiver after a qpid reconnect.""" self._declare_receiver(session) def _declare_receiver(self, session): self.session = session self.receiver = session.receiver(self.address) self.receiver.capacity = 1 def _unpack_json_msg(self, msg): """Load the JSON data in msg if msg.content_type indicates that it is necessary. Put the loaded data back into msg.content and update msg.content_type appropriately. A Qpid Message containing a dict will have a content_type of 'amqp/map', whereas one containing a string that needs to be converted back from JSON will have a content_type of JSON_CONTENT_TYPE. :param msg: a Qpid Message object :returns: None """ if msg.content_type == JSON_CONTENT_TYPE: msg.content = jsonutils.loads(msg.content) msg.content_type = 'amqp/map' def consume(self): """Fetch the message and pass it to the callback object.""" message = self.receiver.fetch() try: self._unpack_json_msg(message) msg = rpc_common.deserialize_msg(message.content) self.callback(msg) except Exception: LOG.exception(_("Failed to process message... skipping it.")) finally: # TODO(sandy): Need support for optional ack_on_error. self.session.acknowledge(message) def get_receiver(self): return self.receiver def get_node_name(self): return self.address.split(';')[0] class DirectConsumer(ConsumerBase): """Queue/consumer class for 'direct'.""" def __init__(self, conf, session, msg_id, callback): """Init a 'direct' queue. 'session' is the amqp session to use 'msg_id' is the msg_id to listen on 'callback' is the callback to call when messages are received """ link_opts = { "auto-delete": conf.amqp_auto_delete, "exclusive": True, "durable": conf.amqp_durable_queues, } if conf.qpid_topology_version == 1: node_name = "%s/%s" % (msg_id, msg_id) node_opts = {"type": "direct"} link_name = msg_id elif conf.qpid_topology_version == 2: node_name = "amq.direct/%s" % msg_id node_opts = {} link_name = None else: raise_invalid_topology_version() super(DirectConsumer, self).__init__(conf, session, callback, node_name, node_opts, link_name, link_opts) class TopicConsumer(ConsumerBase): """Consumer class for 'topic'.""" def __init__(self, conf, session, topic, callback, name=None, exchange_name=None): """Init a 'topic' queue. :param session: the amqp session to use :param topic: is the topic to listen on :paramtype topic: str :param callback: the callback to call when messages are received :param name: optional queue name, defaults to topic """ exchange_name = exchange_name or rpc_amqp.get_control_exchange(conf) link_opts = { "auto-delete": conf.amqp_auto_delete, "durable": conf.amqp_durable_queues, } if conf.qpid_topology_version == 1: node_name = "%s/%s" % (exchange_name, topic) elif conf.qpid_topology_version == 2: node_name = "amq.topic/topic/%s/%s" % (exchange_name, topic) else: raise_invalid_topology_version() super(TopicConsumer, self).__init__(conf, session, callback, node_name, {}, name or topic, link_opts) class FanoutConsumer(ConsumerBase): """Consumer class for 'fanout'.""" def __init__(self, conf, session, topic, callback): """Init a 'fanout' queue. 'session' is the amqp session to use 'topic' is the topic to listen on 'callback' is the callback to call when messages are received """ self.conf = conf link_opts = {"exclusive": True} if conf.qpid_topology_version == 1: node_name = "%s_fanout" % topic node_opts = {"durable": False, "type": "fanout"} elif conf.qpid_topology_version == 2: node_name = "amq.topic/fanout/%s" % topic node_opts = {} else: raise_invalid_topology_version() super(FanoutConsumer, self).__init__(conf, session, callback, node_name, node_opts, None, link_opts) class Publisher(object): """Base Publisher class.""" def __init__(self, conf, session, node_name, node_opts=None): """Init the Publisher class with the exchange_name, routing_key, and other options """ self.sender = None self.session = session if conf.qpid_topology_version == 1: addr_opts = { "create": "always", "node": { "type": "topic", "x-declare": { "durable": False, # auto-delete isn't implemented for exchanges in qpid, # but put in here anyway "auto-delete": True, }, }, } if node_opts: addr_opts["node"]["x-declare"].update(node_opts) self.address = "%s ; %s" % (node_name, jsonutils.dumps(addr_opts)) elif conf.qpid_topology_version == 2: self.address = node_name else: raise_invalid_topology_version() self.reconnect(session) def reconnect(self, session): """Re-establish the Sender after a reconnection.""" self.sender = session.sender(self.address) def _pack_json_msg(self, msg): """Qpid cannot serialize dicts containing strings longer than 65535 characters. This function dumps the message content to a JSON string, which Qpid is able to handle. :param msg: May be either a Qpid Message object or a bare dict. :returns: A Qpid Message with its content field JSON encoded. """ try: msg.content = jsonutils.dumps(msg.content) except AttributeError: # Need to have a Qpid message so we can set the content_type. msg = qpid_messaging.Message(jsonutils.dumps(msg)) msg.content_type = JSON_CONTENT_TYPE return msg def send(self, msg): """Send a message.""" try: # Check if Qpid can encode the message check_msg = msg if not hasattr(check_msg, 'content_type'): check_msg = qpid_messaging.Message(msg) content_type = check_msg.content_type enc, dec = qpid_messaging.message.get_codec(content_type) enc(check_msg.content) except qpid_codec.CodecException: # This means the message couldn't be serialized as a dict. msg = self._pack_json_msg(msg) self.sender.send(msg) class DirectPublisher(Publisher): """Publisher class for 'direct'.""" def __init__(self, conf, session, msg_id): """Init a 'direct' publisher.""" if conf.qpid_topology_version == 1: node_name = msg_id node_opts = {"type": "direct"} elif conf.qpid_topology_version == 2: node_name = "amq.direct/%s" % msg_id node_opts = {} else: raise_invalid_topology_version() super(DirectPublisher, self).__init__(conf, session, node_name, node_opts) class TopicPublisher(Publisher): """Publisher class for 'topic'.""" def __init__(self, conf, session, topic): """Init a 'topic' publisher. """ exchange_name = rpc_amqp.get_control_exchange(conf) if conf.qpid_topology_version == 1: node_name = "%s/%s" % (exchange_name, topic) elif conf.qpid_topology_version == 2: node_name = "amq.topic/topic/%s/%s" % (exchange_name, topic) else: raise_invalid_topology_version() super(TopicPublisher, self).__init__(conf, session, node_name) class FanoutPublisher(Publisher): """Publisher class for 'fanout'.""" def __init__(self, conf, session, topic): """Init a 'fanout' publisher. """ if conf.qpid_topology_version == 1: node_name = "%s_fanout" % topic node_opts = {"type": "fanout"} elif conf.qpid_topology_version == 2: node_name = "amq.topic/fanout/%s" % topic node_opts = {} else: raise_invalid_topology_version() super(FanoutPublisher, self).__init__(conf, session, node_name, node_opts) class NotifyPublisher(Publisher): """Publisher class for notifications.""" def __init__(self, conf, session, topic): """Init a 'topic' publisher. """ exchange_name = rpc_amqp.get_control_exchange(conf) node_opts = {"durable": True} if conf.qpid_topology_version == 1: node_name = "%s/%s" % (exchange_name, topic) elif conf.qpid_topology_version == 2: node_name = "amq.topic/topic/%s/%s" % (exchange_name, topic) else: raise_invalid_topology_version() super(NotifyPublisher, self).__init__(conf, session, node_name, node_opts) class Connection(object): """Connection object.""" pool = None def __init__(self, conf, server_params=None): if not qpid_messaging: raise ImportError("Failed to import qpid.messaging") self.session = None self.consumers = {} self.consumer_thread = None self.proxy_callbacks = [] self.conf = conf if server_params and 'hostname' in server_params: # NOTE(russellb) This enables support for cast_to_server. server_params['qpid_hosts'] = [ '%s:%d' % (server_params['hostname'], server_params.get('port', 5672)) ] params = { 'qpid_hosts': self.conf.qpid_hosts, 'username': self.conf.qpid_username, 'password': self.conf.qpid_password, } params.update(server_params or {}) self.brokers = params['qpid_hosts'] self.username = params['username'] self.password = params['password'] self.connection_create(self.brokers[0]) self.reconnect() def connection_create(self, broker): # Create the connection - this does not open the connection self.connection = qpid_messaging.Connection(broker) # Check if flags are set and if so set them for the connection # before we call open self.connection.username = self.username self.connection.password = self.password self.connection.sasl_mechanisms = self.conf.qpid_sasl_mechanisms # Reconnection is done by self.reconnect() self.connection.reconnect = False self.connection.heartbeat = self.conf.qpid_heartbeat self.connection.transport = self.conf.qpid_protocol self.connection.tcp_nodelay = self.conf.qpid_tcp_nodelay def _register_consumer(self, consumer): self.consumers[str(consumer.get_receiver())] = consumer def _lookup_consumer(self, receiver): return self.consumers[str(receiver)] def reconnect(self): """Handles reconnecting and re-establishing sessions and queues.""" attempt = 0 delay = 1 while True: # Close the session if necessary if self.connection.opened(): try: self.connection.close() except qpid_exceptions.ConnectionError: pass broker = self.brokers[attempt % len(self.brokers)] attempt += 1 try: self.connection_create(broker) self.connection.open() except qpid_exceptions.ConnectionError as e: msg_dict = dict(e=e, delay=delay) msg = _("Unable to connect to AMQP server: %(e)s. " "Sleeping %(delay)s seconds") % msg_dict LOG.error(msg) time.sleep(delay) delay = min(2 * delay, 60) else: LOG.info(_('Connected to AMQP server on %s'), broker) break self.session = self.connection.session() if self.consumers: consumers = self.consumers self.consumers = {} for consumer in six.itervalues(consumers): consumer.reconnect(self.session) self._register_consumer(consumer) LOG.debug(_("Re-established AMQP queues")) def ensure(self, error_callback, method, *args, **kwargs): while True: try: return method(*args, **kwargs) except (qpid_exceptions.Empty, qpid_exceptions.ConnectionError) as e: if error_callback: error_callback(e) self.reconnect() def close(self): """Close/release this connection.""" self.cancel_consumer_thread() self.wait_on_proxy_callbacks() try: self.connection.close() except Exception: # NOTE(dripton) Logging exceptions that happen during cleanup just # causes confusion; there's really nothing useful we can do with # them. pass self.connection = None def reset(self): """Reset a connection so it can be used again.""" self.cancel_consumer_thread() self.wait_on_proxy_callbacks() self.session.close() self.session = self.connection.session() self.consumers = {} def declare_consumer(self, consumer_cls, topic, callback): """Create a Consumer using the class that was passed in and add it to our list of consumers """ def _connect_error(exc): log_info = {'topic': topic, 'err_str': str(exc)} LOG.error(_("Failed to declare consumer for topic '%(topic)s': " "%(err_str)s") % log_info) def _declare_consumer(): consumer = consumer_cls(self.conf, self.session, topic, callback) self._register_consumer(consumer) return consumer return self.ensure(_connect_error, _declare_consumer) def iterconsume(self, limit=None, timeout=None): """Return an iterator that will consume from all queues/consumers.""" def _error_callback(exc): if isinstance(exc, qpid_exceptions.Empty): LOG.debug(_('Timed out waiting for RPC response: %s') % str(exc)) raise rpc_common.Timeout() else: LOG.exception(_('Failed to consume message from queue: %s') % str(exc)) def _consume(): nxt_receiver = self.session.next_receiver(timeout=timeout) try: self._lookup_consumer(nxt_receiver).consume() except Exception: LOG.exception(_("Error processing message. Skipping it.")) for iteration in itertools.count(0): if limit and iteration >= limit: raise StopIteration yield self.ensure(_error_callback, _consume) def cancel_consumer_thread(self): """Cancel a consumer thread.""" if self.consumer_thread is not None: self.consumer_thread.kill() try: self.consumer_thread.wait() except greenlet.GreenletExit: pass self.consumer_thread = None def wait_on_proxy_callbacks(self): """Wait for all proxy callback threads to exit.""" for proxy_cb in self.proxy_callbacks: proxy_cb.wait() def publisher_send(self, cls, topic, msg): """Send to a publisher based on the publisher class.""" def _connect_error(exc): log_info = {'topic': topic, 'err_str': str(exc)} LOG.exception(_("Failed to publish message to topic " "'%(topic)s': %(err_str)s") % log_info) def _publisher_send(): publisher = cls(self.conf, self.session, topic) publisher.send(msg) return self.ensure(_connect_error, _publisher_send) def declare_direct_consumer(self, topic, callback): """Create a 'direct' queue. In nova's use, this is generally a msg_id queue used for responses for call/multicall """ self.declare_consumer(DirectConsumer, topic, callback) def declare_topic_consumer(self, topic, callback=None, queue_name=None, exchange_name=None): """Create a 'topic' consumer.""" self.declare_consumer(functools.partial(TopicConsumer, name=queue_name, exchange_name=exchange_name, ), topic, callback) def declare_fanout_consumer(self, topic, callback): """Create a 'fanout' consumer.""" self.declare_consumer(FanoutConsumer, topic, callback) def direct_send(self, msg_id, msg): """Send a 'direct' message.""" self.publisher_send(DirectPublisher, msg_id, msg) def topic_send(self, topic, msg, timeout=None): """Send a 'topic' message.""" # # We want to create a message with attributes, e.g. a TTL. We # don't really need to keep 'msg' in its JSON format any longer # so let's create an actual qpid message here and get some # value-add on the go. # # WARNING: Request timeout happens to be in the same units as # qpid's TTL (seconds). If this changes in the future, then this # will need to be altered accordingly. # qpid_message = qpid_messaging.Message(content=msg, ttl=timeout) self.publisher_send(TopicPublisher, topic, qpid_message) def fanout_send(self, topic, msg): """Send a 'fanout' message.""" self.publisher_send(FanoutPublisher, topic, msg) def notify_send(self, topic, msg, **kwargs): """Send a notify message on a topic.""" self.publisher_send(NotifyPublisher, topic, msg) def consume(self, limit=None): """Consume from all queues/consumers.""" it = self.iterconsume(limit=limit) while True: try: six.next(it) except StopIteration: return def consume_in_thread(self): """Consumer from all queues/consumers in a greenthread.""" @excutils.forever_retry_uncaught_exceptions def _consumer_thread(): try: self.consume() except greenlet.GreenletExit: return if self.consumer_thread is None: self.consumer_thread = eventlet.spawn(_consumer_thread) return self.consumer_thread def create_consumer(self, topic, proxy, fanout=False): """Create a consumer that calls a method in a proxy object.""" proxy_cb = rpc_amqp.ProxyCallback( self.conf, proxy, rpc_amqp.get_connection_pool(self.conf, Connection)) self.proxy_callbacks.append(proxy_cb) if fanout: consumer = FanoutConsumer(self.conf, self.session, topic, proxy_cb) else: consumer = TopicConsumer(self.conf, self.session, topic, proxy_cb) self._register_consumer(consumer) return consumer def create_worker(self, topic, proxy, pool_name): """Create a worker that calls a method in a proxy object.""" proxy_cb = rpc_amqp.ProxyCallback( self.conf, proxy, rpc_amqp.get_connection_pool(self.conf, Connection)) self.proxy_callbacks.append(proxy_cb) consumer = TopicConsumer(self.conf, self.session, topic, proxy_cb, name=pool_name) self._register_consumer(consumer) return consumer def join_consumer_pool(self, callback, pool_name, topic, exchange_name=None, ack_on_error=True): """Register as a member of a group of consumers for a given topic from the specified exchange. Exactly one member of a given pool will receive each message. A message will be delivered to multiple pools, if more than one is created. """ callback_wrapper = rpc_amqp.CallbackWrapper( conf=self.conf, callback=callback, connection_pool=rpc_amqp.get_connection_pool(self.conf, Connection), wait_for_consumers=not ack_on_error ) self.proxy_callbacks.append(callback_wrapper) consumer = TopicConsumer(conf=self.conf, session=self.session, topic=topic, callback=callback_wrapper, name=pool_name, exchange_name=exchange_name) self._register_consumer(consumer) return consumer def create_connection(conf, new=True): """Create a connection.""" return rpc_amqp.create_connection( conf, new, rpc_amqp.get_connection_pool(conf, Connection)) def multicall(conf, context, topic, msg, timeout=None): """Make a call that returns multiple times.""" return rpc_amqp.multicall( conf, context, topic, msg, timeout, rpc_amqp.get_connection_pool(conf, Connection)) def call(conf, context, topic, msg, timeout=None): """Sends a message on a topic and wait for a response.""" return rpc_amqp.call( conf, context, topic, msg, timeout, rpc_amqp.get_connection_pool(conf, Connection)) def cast(conf, context, topic, msg): """Sends a message on a topic without waiting for a response.""" return rpc_amqp.cast( conf, context, topic, msg, rpc_amqp.get_connection_pool(conf, Connection)) def fanout_cast(conf, context, topic, msg): """Sends a message on a fanout exchange without waiting for a response.""" return rpc_amqp.fanout_cast( conf, context, topic, msg, rpc_amqp.get_connection_pool(conf, Connection)) def cast_to_server(conf, context, server_params, topic, msg): """Sends a message on a topic to a specific server.""" return rpc_amqp.cast_to_server( conf, context, server_params, topic, msg, rpc_amqp.get_connection_pool(conf, Connection)) def fanout_cast_to_server(conf, context, server_params, topic, msg): """Sends a message on a fanout exchange to a specific server.""" return rpc_amqp.fanout_cast_to_server( conf, context, server_params, topic, msg, rpc_amqp.get_connection_pool(conf, Connection)) def notify(conf, context, topic, msg, envelope): """Sends a notification event on a topic.""" return rpc_amqp.notify(conf, context, topic, msg, rpc_amqp.get_connection_pool(conf, Connection), envelope) def cleanup(): return rpc_amqp.cleanup(Connection.pool) ironic-2014.1.rc1/ironic/openstack/common/rpc/impl_fake.py0000664000175300017540000001332612316614116024542 0ustar jenkinsjenkins00000000000000# Copyright 2011 OpenStack Foundation # # 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. """Fake RPC implementation which calls proxy methods directly with no queues. Casts will block, but this is very useful for tests. """ import inspect # NOTE(russellb): We specifically want to use json, not our own jsonutils. # jsonutils has some extra logic to automatically convert objects to primitive # types so that they can be serialized. We want to catch all cases where # non-primitive types make it into this code and treat it as an error. import json import time import eventlet import six from ironic.openstack.common.rpc import common as rpc_common CONSUMERS = {} class RpcContext(rpc_common.CommonRpcContext): def __init__(self, **kwargs): super(RpcContext, self).__init__(**kwargs) self._response = [] self._done = False def deepcopy(self): values = self.to_dict() new_inst = self.__class__(**values) new_inst._response = self._response new_inst._done = self._done return new_inst def reply(self, reply=None, failure=None, ending=False): if ending: self._done = True if not self._done: self._response.append((reply, failure)) class Consumer(object): def __init__(self, topic, proxy): self.topic = topic self.proxy = proxy def call(self, context, version, method, namespace, args, timeout): done = eventlet.event.Event() def _inner(): ctxt = RpcContext.from_dict(context.to_dict()) try: rval = self.proxy.dispatch(context, version, method, namespace, **args) res = [] # Caller might have called ctxt.reply() manually for (reply, failure) in ctxt._response: if failure: six.reraise(failure[0], failure[1], failure[2]) res.append(reply) # if ending not 'sent'...we might have more data to # return from the function itself if not ctxt._done: if inspect.isgenerator(rval): for val in rval: res.append(val) else: res.append(rval) done.send(res) except rpc_common.ClientException as e: done.send_exception(e._exc_info[1]) except Exception as e: done.send_exception(e) thread = eventlet.greenthread.spawn(_inner) if timeout: start_time = time.time() while not done.ready(): eventlet.greenthread.sleep(1) cur_time = time.time() if (cur_time - start_time) > timeout: thread.kill() raise rpc_common.Timeout() return done.wait() class Connection(object): """Connection object.""" def __init__(self): self.consumers = [] def create_consumer(self, topic, proxy, fanout=False): consumer = Consumer(topic, proxy) self.consumers.append(consumer) if topic not in CONSUMERS: CONSUMERS[topic] = [] CONSUMERS[topic].append(consumer) def close(self): for consumer in self.consumers: CONSUMERS[consumer.topic].remove(consumer) self.consumers = [] def consume_in_thread(self): pass def create_connection(conf, new=True): """Create a connection.""" return Connection() def check_serialize(msg): """Make sure a message intended for rpc can be serialized.""" json.dumps(msg) def multicall(conf, context, topic, msg, timeout=None): """Make a call that returns multiple times.""" check_serialize(msg) method = msg.get('method') if not method: return args = msg.get('args', {}) version = msg.get('version', None) namespace = msg.get('namespace', None) try: consumer = CONSUMERS[topic][0] except (KeyError, IndexError): raise rpc_common.Timeout("No consumers available") else: return consumer.call(context, version, method, namespace, args, timeout) def call(conf, context, topic, msg, timeout=None): """Sends a message on a topic and wait for a response.""" rv = multicall(conf, context, topic, msg, timeout) # NOTE(vish): return the last result from the multicall rv = list(rv) if not rv: return return rv[-1] def cast(conf, context, topic, msg): check_serialize(msg) try: call(conf, context, topic, msg) except Exception: pass def notify(conf, context, topic, msg, envelope): check_serialize(msg) def cleanup(): pass def fanout_cast(conf, context, topic, msg): """Cast to all consumers of a topic.""" check_serialize(msg) method = msg.get('method') if not method: return args = msg.get('args', {}) version = msg.get('version', None) namespace = msg.get('namespace', None) for consumer in CONSUMERS.get(topic, []): try: consumer.call(context, version, method, namespace, args, None) except Exception: pass ironic-2014.1.rc1/ironic/openstack/common/rpc/__init__.py0000664000175300017540000002451612316614116024355 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # Copyright 2011 Red Hat, Inc. # # 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. """ A remote procedure call (rpc) abstraction. For some wrappers that add message versioning to rpc, see: rpc.dispatcher rpc.proxy """ from oslo.config import cfg from ironic.openstack.common import importutils from ironic.openstack.common import log as logging LOG = logging.getLogger(__name__) rpc_opts = [ cfg.StrOpt('rpc_backend', default='%s.impl_kombu' % __package__, help="The messaging module to use, defaults to kombu."), cfg.IntOpt('rpc_thread_pool_size', default=64, help='Size of RPC thread pool'), cfg.IntOpt('rpc_conn_pool_size', default=30, help='Size of RPC connection pool'), cfg.IntOpt('rpc_response_timeout', default=60, help='Seconds to wait for a response from call or multicall'), cfg.IntOpt('rpc_cast_timeout', default=30, help='Seconds to wait before a cast expires (TTL). ' 'Only supported by impl_zmq.'), cfg.ListOpt('allowed_rpc_exception_modules', default=['nova.exception', 'cinder.exception', 'exceptions', ], help='Modules of exceptions that are permitted to be recreated' ' upon receiving exception data from an rpc call.'), cfg.BoolOpt('fake_rabbit', default=False, help='If passed, use a fake RabbitMQ provider'), cfg.StrOpt('control_exchange', default='openstack', help='AMQP exchange to connect to if using RabbitMQ or Qpid'), ] CONF = cfg.CONF CONF.register_opts(rpc_opts) def set_defaults(control_exchange): cfg.set_defaults(rpc_opts, control_exchange=control_exchange) def create_connection(new=True): """Create a connection to the message bus used for rpc. For some example usage of creating a connection and some consumers on that connection, see nova.service. :param new: Whether or not to create a new connection. A new connection will be created by default. If new is False, the implementation is free to return an existing connection from a pool. :returns: An instance of openstack.common.rpc.common.Connection """ return _get_impl().create_connection(CONF, new=new) def call(context, topic, msg, timeout=None): """Invoke a remote method that returns something. :param context: Information that identifies the user that has made this request. :param topic: The topic to send the rpc message to. This correlates to the topic argument of openstack.common.rpc.common.Connection.create_consumer() and only applies when the consumer was created with fanout=False. :param msg: This is a dict in the form { "method" : "method_to_invoke", "args" : dict_of_kwargs } :param timeout: int, number of seconds to use for a response timeout. If set, this overrides the rpc_response_timeout option. :returns: A dict from the remote method. :raises: openstack.common.rpc.common.Timeout if a complete response is not received before the timeout is reached. """ return _get_impl().call(CONF, context, topic, msg, timeout) def cast(context, topic, msg): """Invoke a remote method that does not return anything. :param context: Information that identifies the user that has made this request. :param topic: The topic to send the rpc message to. This correlates to the topic argument of openstack.common.rpc.common.Connection.create_consumer() and only applies when the consumer was created with fanout=False. :param msg: This is a dict in the form { "method" : "method_to_invoke", "args" : dict_of_kwargs } :returns: None """ return _get_impl().cast(CONF, context, topic, msg) def fanout_cast(context, topic, msg): """Broadcast a remote method invocation with no return. This method will get invoked on all consumers that were set up with this topic name and fanout=True. :param context: Information that identifies the user that has made this request. :param topic: The topic to send the rpc message to. This correlates to the topic argument of openstack.common.rpc.common.Connection.create_consumer() and only applies when the consumer was created with fanout=True. :param msg: This is a dict in the form { "method" : "method_to_invoke", "args" : dict_of_kwargs } :returns: None """ return _get_impl().fanout_cast(CONF, context, topic, msg) def multicall(context, topic, msg, timeout=None): """Invoke a remote method and get back an iterator. In this case, the remote method will be returning multiple values in separate messages, so the return values can be processed as the come in via an iterator. :param context: Information that identifies the user that has made this request. :param topic: The topic to send the rpc message to. This correlates to the topic argument of openstack.common.rpc.common.Connection.create_consumer() and only applies when the consumer was created with fanout=False. :param msg: This is a dict in the form { "method" : "method_to_invoke", "args" : dict_of_kwargs } :param timeout: int, number of seconds to use for a response timeout. If set, this overrides the rpc_response_timeout option. :returns: An iterator. The iterator will yield a tuple (N, X) where N is an index that starts at 0 and increases by one for each value returned and X is the Nth value that was returned by the remote method. :raises: openstack.common.rpc.common.Timeout if a complete response is not received before the timeout is reached. """ return _get_impl().multicall(CONF, context, topic, msg, timeout) def notify(context, topic, msg, envelope=False): """Send notification event. :param context: Information that identifies the user that has made this request. :param topic: The topic to send the notification to. :param msg: This is a dict of content of event. :param envelope: Set to True to enable message envelope for notifications. :returns: None """ return _get_impl().notify(cfg.CONF, context, topic, msg, envelope) def cleanup(): """Clean up resources in use by implementation. Clean up any resources that have been allocated by the RPC implementation. This is typically open connections to a messaging service. This function would get called before an application using this API exits to allow connections to get torn down cleanly. :returns: None """ return _get_impl().cleanup() def cast_to_server(context, server_params, topic, msg): """Invoke a remote method that does not return anything. :param context: Information that identifies the user that has made this request. :param server_params: Connection information :param topic: The topic to send the notification to. :param msg: This is a dict in the form { "method" : "method_to_invoke", "args" : dict_of_kwargs } :returns: None """ return _get_impl().cast_to_server(CONF, context, server_params, topic, msg) def fanout_cast_to_server(context, server_params, topic, msg): """Broadcast to a remote method invocation with no return. :param context: Information that identifies the user that has made this request. :param server_params: Connection information :param topic: The topic to send the notification to. :param msg: This is a dict in the form { "method" : "method_to_invoke", "args" : dict_of_kwargs } :returns: None """ return _get_impl().fanout_cast_to_server(CONF, context, server_params, topic, msg) def queue_get_for(context, topic, host): """Get a queue name for a given topic + host. This function only works if this naming convention is followed on the consumer side, as well. For example, in nova, every instance of the nova-foo service calls create_consumer() for two topics: foo foo. Messages sent to the 'foo' topic are distributed to exactly one instance of the nova-foo service. The services are chosen in a round-robin fashion. Messages sent to the 'foo.' topic are sent to the nova-foo service on . """ return '%s.%s' % (topic, host) if host else topic _RPCIMPL = None def _get_impl(): """Delay import of rpc_backend until configuration is loaded.""" global _RPCIMPL if _RPCIMPL is None: try: _RPCIMPL = importutils.import_module(CONF.rpc_backend) except ImportError: # For backwards compatibility with older nova config. impl = CONF.rpc_backend.replace('nova.rpc', 'nova.openstack.common.rpc') _RPCIMPL = importutils.import_module(impl) return _RPCIMPL ironic-2014.1.rc1/ironic/openstack/common/rpc/amqp.py0000664000175300017540000005611012316614116023547 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # Copyright 2011 - 2012, Red Hat, Inc. # # 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. """ Shared code between AMQP based openstack.common.rpc implementations. The code in this module is shared between the rpc implementations based on AMQP. Specifically, this includes impl_kombu and impl_qpid. impl_carrot also uses AMQP, but is deprecated and predates this code. """ import collections import inspect import sys import uuid from eventlet import greenpool from eventlet import pools from eventlet import queue from eventlet import semaphore from oslo.config import cfg import six from ironic.openstack.common import excutils from ironic.openstack.common.gettextutils import _ from ironic.openstack.common import local from ironic.openstack.common import log as logging from ironic.openstack.common.rpc import common as rpc_common amqp_opts = [ cfg.BoolOpt('amqp_durable_queues', default=False, deprecated_name='rabbit_durable_queues', deprecated_group='DEFAULT', help='Use durable queues in amqp.'), cfg.BoolOpt('amqp_auto_delete', default=False, help='Auto-delete queues in amqp.'), ] cfg.CONF.register_opts(amqp_opts) UNIQUE_ID = '_unique_id' LOG = logging.getLogger(__name__) class Pool(pools.Pool): """Class that implements a Pool of Connections.""" def __init__(self, conf, connection_cls, *args, **kwargs): self.connection_cls = connection_cls self.conf = conf kwargs.setdefault("max_size", self.conf.rpc_conn_pool_size) kwargs.setdefault("order_as_stack", True) super(Pool, self).__init__(*args, **kwargs) self.reply_proxy = None # TODO(comstud): Timeout connections not used in a while def create(self): LOG.debug(_('Pool creating new connection')) return self.connection_cls(self.conf) def empty(self): while self.free_items: self.get().close() # Force a new connection pool to be created. # Note that this was added due to failing unit test cases. The issue # is the above "while loop" gets all the cached connections from the # pool and closes them, but never returns them to the pool, a pool # leak. The unit tests hang waiting for an item to be returned to the # pool. The unit tests get here via the tearDown() method. In the run # time code, it gets here via cleanup() and only appears in service.py # just before doing a sys.exit(), so cleanup() only happens once and # the leakage is not a problem. self.connection_cls.pool = None _pool_create_sem = semaphore.Semaphore() def get_connection_pool(conf, connection_cls): with _pool_create_sem: # Make sure only one thread tries to create the connection pool. if not connection_cls.pool: connection_cls.pool = Pool(conf, connection_cls) return connection_cls.pool class ConnectionContext(rpc_common.Connection): """The class that is actually returned to the create_connection() caller. This is essentially a wrapper around Connection that supports 'with'. It can also return a new Connection, or one from a pool. The function will also catch when an instance of this class is to be deleted. With that we can return Connections to the pool on exceptions and so forth without making the caller be responsible for catching them. If possible the function makes sure to return a connection to the pool. """ def __init__(self, conf, connection_pool, pooled=True, server_params=None): """Create a new connection, or get one from the pool.""" self.connection = None self.conf = conf self.connection_pool = connection_pool if pooled: self.connection = connection_pool.get() else: self.connection = connection_pool.connection_cls( conf, server_params=server_params) self.pooled = pooled def __enter__(self): """When with ConnectionContext() is used, return self.""" return self def _done(self): """If the connection came from a pool, clean it up and put it back. If it did not come from a pool, close it. """ if self.connection: if self.pooled: # Reset the connection so it's ready for the next caller # to grab from the pool self.connection.reset() self.connection_pool.put(self.connection) else: try: self.connection.close() except Exception: pass self.connection = None def __exit__(self, exc_type, exc_value, tb): """End of 'with' statement. We're done here.""" self._done() def __del__(self): """Caller is done with this connection. Make sure we cleaned up.""" self._done() def close(self): """Caller is done with this connection.""" self._done() def create_consumer(self, topic, proxy, fanout=False): self.connection.create_consumer(topic, proxy, fanout) def create_worker(self, topic, proxy, pool_name): self.connection.create_worker(topic, proxy, pool_name) def join_consumer_pool(self, callback, pool_name, topic, exchange_name, ack_on_error=True): self.connection.join_consumer_pool(callback, pool_name, topic, exchange_name, ack_on_error) def consume_in_thread(self): self.connection.consume_in_thread() def __getattr__(self, key): """Proxy all other calls to the Connection instance.""" if self.connection: return getattr(self.connection, key) else: raise rpc_common.InvalidRPCConnectionReuse() class ReplyProxy(ConnectionContext): """Connection class for RPC replies / callbacks.""" def __init__(self, conf, connection_pool): self._call_waiters = {} self._num_call_waiters = 0 self._num_call_waiters_wrn_threshold = 10 self._reply_q = 'reply_' + uuid.uuid4().hex super(ReplyProxy, self).__init__(conf, connection_pool, pooled=False) self.declare_direct_consumer(self._reply_q, self._process_data) self.consume_in_thread() def _process_data(self, message_data): msg_id = message_data.pop('_msg_id', None) waiter = self._call_waiters.get(msg_id) if not waiter: LOG.warn(_('No calling threads waiting for msg_id : %(msg_id)s' ', message : %(data)s'), {'msg_id': msg_id, 'data': message_data}) LOG.warn(_('_call_waiters: %s') % str(self._call_waiters)) else: waiter.put(message_data) def add_call_waiter(self, waiter, msg_id): self._num_call_waiters += 1 if self._num_call_waiters > self._num_call_waiters_wrn_threshold: LOG.warn(_('Number of call waiters is greater than warning ' 'threshold: %d. There could be a MulticallProxyWaiter ' 'leak.') % self._num_call_waiters_wrn_threshold) self._num_call_waiters_wrn_threshold *= 2 self._call_waiters[msg_id] = waiter def del_call_waiter(self, msg_id): self._num_call_waiters -= 1 del self._call_waiters[msg_id] def get_reply_q(self): return self._reply_q def msg_reply(conf, msg_id, reply_q, connection_pool, reply=None, failure=None, ending=False, log_failure=True): """Sends a reply or an error on the channel signified by msg_id. Failure should be a sys.exc_info() tuple. """ with ConnectionContext(conf, connection_pool) as conn: if failure: failure = rpc_common.serialize_remote_exception(failure, log_failure) msg = {'result': reply, 'failure': failure} if ending: msg['ending'] = True _add_unique_id(msg) # If a reply_q exists, add the msg_id to the reply and pass the # reply_q to direct_send() to use it as the response queue. # Otherwise use the msg_id for backward compatibility. if reply_q: msg['_msg_id'] = msg_id conn.direct_send(reply_q, rpc_common.serialize_msg(msg)) else: conn.direct_send(msg_id, rpc_common.serialize_msg(msg)) class RpcContext(rpc_common.CommonRpcContext): """Context that supports replying to a rpc.call.""" def __init__(self, **kwargs): self.msg_id = kwargs.pop('msg_id', None) self.reply_q = kwargs.pop('reply_q', None) self.conf = kwargs.pop('conf') super(RpcContext, self).__init__(**kwargs) def deepcopy(self): values = self.to_dict() values['conf'] = self.conf values['msg_id'] = self.msg_id values['reply_q'] = self.reply_q return self.__class__(**values) def reply(self, reply=None, failure=None, ending=False, connection_pool=None, log_failure=True): if self.msg_id: msg_reply(self.conf, self.msg_id, self.reply_q, connection_pool, reply, failure, ending, log_failure) if ending: self.msg_id = None def unpack_context(conf, msg): """Unpack context from msg.""" context_dict = {} for key in list(msg.keys()): # NOTE(vish): Some versions of python don't like unicode keys # in kwargs. key = str(key) if key.startswith('_context_'): value = msg.pop(key) context_dict[key[9:]] = value context_dict['msg_id'] = msg.pop('_msg_id', None) context_dict['reply_q'] = msg.pop('_reply_q', None) context_dict['conf'] = conf ctx = RpcContext.from_dict(context_dict) rpc_common._safe_log(LOG.debug, _('unpacked context: %s'), ctx.to_dict()) return ctx def pack_context(msg, context): """Pack context into msg. Values for message keys need to be less than 255 chars, so we pull context out into a bunch of separate keys. If we want to support more arguments in rabbit messages, we may want to do the same for args at some point. """ if isinstance(context, dict): context_d = dict([('_context_%s' % key, value) for (key, value) in six.iteritems(context)]) else: context_d = dict([('_context_%s' % key, value) for (key, value) in six.iteritems(context.to_dict())]) msg.update(context_d) class _MsgIdCache(object): """This class checks any duplicate messages.""" # NOTE: This value is considered can be a configuration item, but # it is not necessary to change its value in most cases, # so let this value as static for now. DUP_MSG_CHECK_SIZE = 16 def __init__(self, **kwargs): self.prev_msgids = collections.deque([], maxlen=self.DUP_MSG_CHECK_SIZE) def check_duplicate_message(self, message_data): """AMQP consumers may read same message twice when exceptions occur before ack is returned. This method prevents doing it. """ if UNIQUE_ID in message_data: msg_id = message_data[UNIQUE_ID] if msg_id not in self.prev_msgids: self.prev_msgids.append(msg_id) else: raise rpc_common.DuplicateMessageError(msg_id=msg_id) def _add_unique_id(msg): """Add unique_id for checking duplicate messages.""" unique_id = uuid.uuid4().hex msg.update({UNIQUE_ID: unique_id}) LOG.debug(_('UNIQUE_ID is %s.') % (unique_id)) class _ThreadPoolWithWait(object): """Base class for a delayed invocation manager. Used by the Connection class to start up green threads to handle incoming messages. """ def __init__(self, conf, connection_pool): self.pool = greenpool.GreenPool(conf.rpc_thread_pool_size) self.connection_pool = connection_pool self.conf = conf def wait(self): """Wait for all callback threads to exit.""" self.pool.waitall() class CallbackWrapper(_ThreadPoolWithWait): """Wraps a straight callback. Allows it to be invoked in a green thread. """ def __init__(self, conf, callback, connection_pool, wait_for_consumers=False): """Initiates CallbackWrapper object. :param conf: cfg.CONF instance :param callback: a callable (probably a function) :param connection_pool: connection pool as returned by get_connection_pool() :param wait_for_consumers: wait for all green threads to complete and raise the last caught exception, if any. """ super(CallbackWrapper, self).__init__( conf=conf, connection_pool=connection_pool, ) self.callback = callback self.wait_for_consumers = wait_for_consumers self.exc_info = None def _wrap(self, message_data, **kwargs): """Wrap the callback invocation to catch exceptions. """ try: self.callback(message_data, **kwargs) except Exception: self.exc_info = sys.exc_info() def __call__(self, message_data): self.exc_info = None self.pool.spawn_n(self._wrap, message_data) if self.wait_for_consumers: self.pool.waitall() if self.exc_info: six.reraise(self.exc_info[1], None, self.exc_info[2]) class ProxyCallback(_ThreadPoolWithWait): """Calls methods on a proxy object based on method and args.""" def __init__(self, conf, proxy, connection_pool): super(ProxyCallback, self).__init__( conf=conf, connection_pool=connection_pool, ) self.proxy = proxy self.msg_id_cache = _MsgIdCache() def __call__(self, message_data): """Consumer callback to call a method on a proxy object. Parses the message for validity and fires off a thread to call the proxy object method. Message data should be a dictionary with two keys: method: string representing the method to call args: dictionary of arg: value Example: {'method': 'echo', 'args': {'value': 42}} """ # It is important to clear the context here, because at this point # the previous context is stored in local.store.context if hasattr(local.store, 'context'): del local.store.context rpc_common._safe_log(LOG.debug, _('received %s'), message_data) self.msg_id_cache.check_duplicate_message(message_data) ctxt = unpack_context(self.conf, message_data) method = message_data.get('method') args = message_data.get('args', {}) version = message_data.get('version') namespace = message_data.get('namespace') if not method: LOG.warn(_('no method for message: %s') % message_data) ctxt.reply(_('No method for message: %s') % message_data, connection_pool=self.connection_pool) return self.pool.spawn_n(self._process_data, ctxt, version, method, namespace, args) def _process_data(self, ctxt, version, method, namespace, args): """Process a message in a new thread. If the proxy object we have has a dispatch method (see rpc.dispatcher.RpcDispatcher), pass it the version, method, and args and let it dispatch as appropriate. If not, use the old behavior of magically calling the specified method on the proxy we have here. """ ctxt.update_store() try: rval = self.proxy.dispatch(ctxt, version, method, namespace, **args) # Check if the result was a generator if inspect.isgenerator(rval): for x in rval: ctxt.reply(x, None, connection_pool=self.connection_pool) else: ctxt.reply(rval, None, connection_pool=self.connection_pool) # This final None tells multicall that it is done. ctxt.reply(ending=True, connection_pool=self.connection_pool) except rpc_common.ClientException as e: LOG.debug(_('Expected exception during message handling (%s)') % e._exc_info[1]) ctxt.reply(None, e._exc_info, connection_pool=self.connection_pool, log_failure=False) except Exception: # sys.exc_info() is deleted by LOG.exception(). exc_info = sys.exc_info() LOG.error(_('Exception during message handling'), exc_info=exc_info) ctxt.reply(None, exc_info, connection_pool=self.connection_pool) class MulticallProxyWaiter(object): def __init__(self, conf, msg_id, timeout, connection_pool): self._msg_id = msg_id self._timeout = timeout or conf.rpc_response_timeout self._reply_proxy = connection_pool.reply_proxy self._done = False self._got_ending = False self._conf = conf self._dataqueue = queue.LightQueue() # Add this caller to the reply proxy's call_waiters self._reply_proxy.add_call_waiter(self, self._msg_id) self.msg_id_cache = _MsgIdCache() def put(self, data): self._dataqueue.put(data) def done(self): if self._done: return self._done = True # Remove this caller from reply proxy's call_waiters self._reply_proxy.del_call_waiter(self._msg_id) def _process_data(self, data): result = None self.msg_id_cache.check_duplicate_message(data) if data['failure']: failure = data['failure'] result = rpc_common.deserialize_remote_exception(self._conf, failure) elif data.get('ending', False): self._got_ending = True else: result = data['result'] return result def __iter__(self): """Return a result until we get a reply with an 'ending' flag.""" if self._done: raise StopIteration while True: try: data = self._dataqueue.get(timeout=self._timeout) result = self._process_data(data) except queue.Empty: self.done() raise rpc_common.Timeout() except Exception: with excutils.save_and_reraise_exception(): self.done() if self._got_ending: self.done() raise StopIteration if isinstance(result, Exception): self.done() raise result yield result def create_connection(conf, new, connection_pool): """Create a connection.""" return ConnectionContext(conf, connection_pool, pooled=not new) _reply_proxy_create_sem = semaphore.Semaphore() def multicall(conf, context, topic, msg, timeout, connection_pool): """Make a call that returns multiple times.""" LOG.debug(_('Making synchronous call on %s ...'), topic) msg_id = uuid.uuid4().hex msg.update({'_msg_id': msg_id}) LOG.debug(_('MSG_ID is %s') % (msg_id)) _add_unique_id(msg) pack_context(msg, context) with _reply_proxy_create_sem: if not connection_pool.reply_proxy: connection_pool.reply_proxy = ReplyProxy(conf, connection_pool) msg.update({'_reply_q': connection_pool.reply_proxy.get_reply_q()}) wait_msg = MulticallProxyWaiter(conf, msg_id, timeout, connection_pool) with ConnectionContext(conf, connection_pool) as conn: conn.topic_send(topic, rpc_common.serialize_msg(msg), timeout) return wait_msg def call(conf, context, topic, msg, timeout, connection_pool): """Sends a message on a topic and wait for a response.""" rv = multicall(conf, context, topic, msg, timeout, connection_pool) # NOTE(vish): return the last result from the multicall rv = list(rv) if not rv: return return rv[-1] def cast(conf, context, topic, msg, connection_pool): """Sends a message on a topic without waiting for a response.""" LOG.debug(_('Making asynchronous cast on %s...'), topic) _add_unique_id(msg) pack_context(msg, context) with ConnectionContext(conf, connection_pool) as conn: conn.topic_send(topic, rpc_common.serialize_msg(msg)) def fanout_cast(conf, context, topic, msg, connection_pool): """Sends a message on a fanout exchange without waiting for a response.""" LOG.debug(_('Making asynchronous fanout cast...')) _add_unique_id(msg) pack_context(msg, context) with ConnectionContext(conf, connection_pool) as conn: conn.fanout_send(topic, rpc_common.serialize_msg(msg)) def cast_to_server(conf, context, server_params, topic, msg, connection_pool): """Sends a message on a topic to a specific server.""" _add_unique_id(msg) pack_context(msg, context) with ConnectionContext(conf, connection_pool, pooled=False, server_params=server_params) as conn: conn.topic_send(topic, rpc_common.serialize_msg(msg)) def fanout_cast_to_server(conf, context, server_params, topic, msg, connection_pool): """Sends a message on a fanout exchange to a specific server.""" _add_unique_id(msg) pack_context(msg, context) with ConnectionContext(conf, connection_pool, pooled=False, server_params=server_params) as conn: conn.fanout_send(topic, rpc_common.serialize_msg(msg)) def notify(conf, context, topic, msg, connection_pool, envelope): """Sends a notification event on a topic.""" LOG.debug(_('Sending %(event_type)s on %(topic)s'), dict(event_type=msg.get('event_type'), topic=topic)) _add_unique_id(msg) pack_context(msg, context) with ConnectionContext(conf, connection_pool) as conn: if envelope: msg = rpc_common.serialize_msg(msg) conn.notify_send(topic, msg) def cleanup(connection_pool): if connection_pool: connection_pool.empty() def get_control_exchange(conf): return conf.control_exchange ironic-2014.1.rc1/ironic/openstack/common/rpc/common.py0000664000175300017540000004421212316614116024101 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # Copyright 2011 Red Hat, Inc. # # 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 copy import sys import traceback from oslo.config import cfg import six from ironic.openstack.common.gettextutils import _ from ironic.openstack.common import importutils from ironic.openstack.common import jsonutils from ironic.openstack.common import local from ironic.openstack.common import log as logging from ironic.openstack.common import versionutils CONF = cfg.CONF LOG = logging.getLogger(__name__) _RPC_ENVELOPE_VERSION = '2.0' '''RPC Envelope Version. This version number applies to the top level structure of messages sent out. It does *not* apply to the message payload, which must be versioned independently. For example, when using rpc APIs, a version number is applied for changes to the API being exposed over rpc. This version number is handled in the rpc proxy and dispatcher modules. This version number applies to the message envelope that is used in the serialization done inside the rpc layer. See serialize_msg() and deserialize_msg(). The current message format (version 2.0) is very simple. It is:: { 'oslo.version': , 'oslo.message': } Message format version '1.0' is just considered to be the messages we sent without a message envelope. So, the current message envelope just includes the envelope version. It may eventually contain additional information, such as a signature for the message payload. We will JSON encode the application message payload. The message envelope, which includes the JSON encoded application message body, will be passed down to the messaging libraries as a dict. ''' _VERSION_KEY = 'oslo.version' _MESSAGE_KEY = 'oslo.message' _REMOTE_POSTFIX = '_Remote' class RPCException(Exception): msg_fmt = _("An unknown RPC related exception occurred.") def __init__(self, message=None, **kwargs): self.kwargs = kwargs if not message: try: message = self.msg_fmt % kwargs except Exception: # kwargs doesn't match a variable in the message # log the issue and the kwargs LOG.exception(_('Exception in string format operation')) for name, value in six.iteritems(kwargs): LOG.error("%s: %s" % (name, value)) # at least get the core message out if something happened message = self.msg_fmt super(RPCException, self).__init__(message) class RemoteError(RPCException): """Signifies that a remote class has raised an exception. Contains a string representation of the type of the original exception, the value of the original exception, and the traceback. These are sent to the parent as a joined string so printing the exception contains all of the relevant info. """ msg_fmt = _("Remote error: %(exc_type)s %(value)s\n%(traceback)s.") def __init__(self, exc_type=None, value=None, traceback=None): self.exc_type = exc_type self.value = value self.traceback = traceback super(RemoteError, self).__init__(exc_type=exc_type, value=value, traceback=traceback) class Timeout(RPCException): """Signifies that a timeout has occurred. This exception is raised if the rpc_response_timeout is reached while waiting for a response from the remote side. """ msg_fmt = _('Timeout while waiting on RPC response - ' 'topic: "%(topic)s", RPC method: "%(method)s" ' 'info: "%(info)s"') def __init__(self, info=None, topic=None, method=None): """Initiates Timeout object. :param info: Extra info to convey to the user :param topic: The topic that the rpc call was sent to :param rpc_method_name: The name of the rpc method being called """ self.info = info self.topic = topic self.method = method super(Timeout, self).__init__( None, info=info or _(''), topic=topic or _(''), method=method or _('')) class DuplicateMessageError(RPCException): msg_fmt = _("Found duplicate message(%(msg_id)s). Skipping it.") class InvalidRPCConnectionReuse(RPCException): msg_fmt = _("Invalid reuse of an RPC connection.") class UnsupportedRpcVersion(RPCException): msg_fmt = _("Specified RPC version, %(version)s, not supported by " "this endpoint.") class UnsupportedRpcEnvelopeVersion(RPCException): msg_fmt = _("Specified RPC envelope version, %(version)s, " "not supported by this endpoint.") class RpcVersionCapError(RPCException): msg_fmt = _("Specified RPC version cap, %(version_cap)s, is too low") class Connection(object): """A connection, returned by rpc.create_connection(). This class represents a connection to the message bus used for rpc. An instance of this class should never be created by users of the rpc API. Use rpc.create_connection() instead. """ def close(self): """Close the connection. This method must be called when the connection will no longer be used. It will ensure that any resources associated with the connection, such as a network connection, and cleaned up. """ raise NotImplementedError() def create_consumer(self, topic, proxy, fanout=False): """Create a consumer on this connection. A consumer is associated with a message queue on the backend message bus. The consumer will read messages from the queue, unpack them, and dispatch them to the proxy object. The contents of the message pulled off of the queue will determine which method gets called on the proxy object. :param topic: This is a name associated with what to consume from. Multiple instances of a service may consume from the same topic. For example, all instances of nova-compute consume from a queue called "compute". In that case, the messages will get distributed amongst the consumers in a round-robin fashion if fanout=False. If fanout=True, every consumer associated with this topic will get a copy of every message. :param proxy: The object that will handle all incoming messages. :param fanout: Whether or not this is a fanout topic. See the documentation for the topic parameter for some additional comments on this. """ raise NotImplementedError() def create_worker(self, topic, proxy, pool_name): """Create a worker on this connection. A worker is like a regular consumer of messages directed to a topic, except that it is part of a set of such consumers (the "pool") which may run in parallel. Every pool of workers will receive a given message, but only one worker in the pool will be asked to process it. Load is distributed across the members of the pool in round-robin fashion. :param topic: This is a name associated with what to consume from. Multiple instances of a service may consume from the same topic. :param proxy: The object that will handle all incoming messages. :param pool_name: String containing the name of the pool of workers """ raise NotImplementedError() def join_consumer_pool(self, callback, pool_name, topic, exchange_name): """Register as a member of a group of consumers. Uses given topic from the specified exchange. Exactly one member of a given pool will receive each message. A message will be delivered to multiple pools, if more than one is created. :param callback: Callable to be invoked for each message. :type callback: callable accepting one argument :param pool_name: The name of the consumer pool. :type pool_name: str :param topic: The routing topic for desired messages. :type topic: str :param exchange_name: The name of the message exchange where the client should attach. Defaults to the configured exchange. :type exchange_name: str """ raise NotImplementedError() def consume_in_thread(self): """Spawn a thread to handle incoming messages. Spawn a thread that will be responsible for handling all incoming messages for consumers that were set up on this connection. Message dispatching inside of this is expected to be implemented in a non-blocking manner. An example implementation would be having this thread pull messages in for all of the consumers, but utilize a thread pool for dispatching the messages to the proxy objects. """ raise NotImplementedError() def _safe_log(log_func, msg, msg_data): """Sanitizes the msg_data field before logging.""" SANITIZE = ['_context_auth_token', 'auth_token', 'new_pass'] def _fix_passwords(d): """Sanitizes the password fields in the dictionary.""" for k in six.iterkeys(d): if k.lower().find('password') != -1: d[k] = '' elif k.lower() in SANITIZE: d[k] = '' elif isinstance(d[k], list): for e in d[k]: if isinstance(e, dict): _fix_passwords(e) elif isinstance(d[k], dict): _fix_passwords(d[k]) return d return log_func(msg, _fix_passwords(copy.deepcopy(msg_data))) def serialize_remote_exception(failure_info, log_failure=True): """Prepares exception data to be sent over rpc. Failure_info should be a sys.exc_info() tuple. """ tb = traceback.format_exception(*failure_info) failure = failure_info[1] if log_failure: LOG.error(_("Returning exception %s to caller"), six.text_type(failure)) LOG.error(tb) kwargs = {} if hasattr(failure, 'kwargs'): kwargs = failure.kwargs # NOTE(matiu): With cells, it's possible to re-raise remote, remote # exceptions. Lets turn it back into the original exception type. cls_name = str(failure.__class__.__name__) mod_name = str(failure.__class__.__module__) if (cls_name.endswith(_REMOTE_POSTFIX) and mod_name.endswith(_REMOTE_POSTFIX)): cls_name = cls_name[:-len(_REMOTE_POSTFIX)] mod_name = mod_name[:-len(_REMOTE_POSTFIX)] data = { 'class': cls_name, 'module': mod_name, 'message': six.text_type(failure), 'tb': tb, 'args': failure.args, 'kwargs': kwargs } json_data = jsonutils.dumps(data) return json_data def deserialize_remote_exception(conf, data): failure = jsonutils.loads(str(data)) trace = failure.get('tb', []) message = failure.get('message', "") + "\n" + "\n".join(trace) name = failure.get('class') module = failure.get('module') # NOTE(ameade): We DO NOT want to allow just any module to be imported, in # order to prevent arbitrary code execution. if module not in conf.allowed_rpc_exception_modules: return RemoteError(name, failure.get('message'), trace) try: mod = importutils.import_module(module) klass = getattr(mod, name) if not issubclass(klass, Exception): raise TypeError("Can only deserialize Exceptions") failure = klass(*failure.get('args', []), **failure.get('kwargs', {})) except (AttributeError, TypeError, ImportError): return RemoteError(name, failure.get('message'), trace) ex_type = type(failure) str_override = lambda self: message new_ex_type = type(ex_type.__name__ + _REMOTE_POSTFIX, (ex_type,), {'__str__': str_override, '__unicode__': str_override}) new_ex_type.__module__ = '%s%s' % (module, _REMOTE_POSTFIX) try: # NOTE(ameade): Dynamically create a new exception type and swap it in # as the new type for the exception. This only works on user defined # Exceptions and not core python exceptions. This is important because # we cannot necessarily change an exception message so we must override # the __str__ method. failure.__class__ = new_ex_type except TypeError: # NOTE(ameade): If a core exception then just add the traceback to the # first exception argument. failure.args = (message,) + failure.args[1:] return failure class CommonRpcContext(object): def __init__(self, **kwargs): self.values = kwargs def __getattr__(self, key): try: return self.values[key] except KeyError: raise AttributeError(key) def to_dict(self): return copy.deepcopy(self.values) @classmethod def from_dict(cls, values): return cls(**values) def deepcopy(self): return self.from_dict(self.to_dict()) def update_store(self): local.store.context = self def elevated(self, read_deleted=None, overwrite=False): """Return a version of this context with admin flag set.""" # TODO(russellb) This method is a bit of a nova-ism. It makes # some assumptions about the data in the request context sent # across rpc, while the rest of this class does not. We could get # rid of this if we changed the nova code that uses this to # convert the RpcContext back to its native RequestContext doing # something like nova.context.RequestContext.from_dict(ctxt.to_dict()) context = self.deepcopy() context.values['is_admin'] = True context.values.setdefault('roles', []) if 'admin' not in context.values['roles']: context.values['roles'].append('admin') if read_deleted is not None: context.values['read_deleted'] = read_deleted return context class ClientException(Exception): """Encapsulates actual exception expected to be hit by a RPC proxy object. Merely instantiating it records the current exception information, which will be passed back to the RPC client without exceptional logging. """ def __init__(self): self._exc_info = sys.exc_info() def catch_client_exception(exceptions, func, *args, **kwargs): try: return func(*args, **kwargs) except Exception as e: if type(e) in exceptions: raise ClientException() else: raise def client_exceptions(*exceptions): """Decorator for manager methods that raise expected exceptions. Marking a Manager method with this decorator allows the declaration of expected exceptions that the RPC layer should not consider fatal, and not log as if they were generated in a real error scenario. Note that this will cause listed exceptions to be wrapped in a ClientException, which is used internally by the RPC layer. """ def outer(func): def inner(*args, **kwargs): return catch_client_exception(exceptions, func, *args, **kwargs) return inner return outer # TODO(sirp): we should deprecate this in favor of # using `versionutils.is_compatible` directly def version_is_compatible(imp_version, version): """Determine whether versions are compatible. :param imp_version: The version implemented :param version: The version requested by an incoming message. """ return versionutils.is_compatible(version, imp_version) def serialize_msg(raw_msg): # NOTE(russellb) See the docstring for _RPC_ENVELOPE_VERSION for more # information about this format. msg = {_VERSION_KEY: _RPC_ENVELOPE_VERSION, _MESSAGE_KEY: jsonutils.dumps(raw_msg)} return msg def deserialize_msg(msg): # NOTE(russellb): Hang on to your hats, this road is about to # get a little bumpy. # # Robustness Principle: # "Be strict in what you send, liberal in what you accept." # # At this point we have to do a bit of guessing about what it # is we just received. Here is the set of possibilities: # # 1) We received a dict. This could be 2 things: # # a) Inspect it to see if it looks like a standard message envelope. # If so, great! # # b) If it doesn't look like a standard message envelope, it could either # be a notification, or a message from before we added a message # envelope (referred to as version 1.0). # Just return the message as-is. # # 2) It's any other non-dict type. Just return it and hope for the best. # This case covers return values from rpc.call() from before message # envelopes were used. (messages to call a method were always a dict) if not isinstance(msg, dict): # See #2 above. return msg base_envelope_keys = (_VERSION_KEY, _MESSAGE_KEY) if not all(map(lambda key: key in msg, base_envelope_keys)): # See #1.b above. return msg # At this point we think we have the message envelope # format we were expecting. (#1.a above) if not version_is_compatible(_RPC_ENVELOPE_VERSION, msg[_VERSION_KEY]): raise UnsupportedRpcEnvelopeVersion(version=msg[_VERSION_KEY]) raw_msg = jsonutils.loads(msg[_MESSAGE_KEY]) return raw_msg ironic-2014.1.rc1/ironic/openstack/common/rpc/service.py0000664000175300017540000000541012316614116024246 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # Copyright 2011 Red Hat, Inc. # # 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.openstack.common.gettextutils import _ from ironic.openstack.common import log as logging from ironic.openstack.common import rpc from ironic.openstack.common.rpc import dispatcher as rpc_dispatcher from ironic.openstack.common import service LOG = logging.getLogger(__name__) class Service(service.Service): """Service object for binaries running on hosts. A service enables rpc by listening to queues based on topic and host. """ def __init__(self, host, topic, manager=None, serializer=None): super(Service, self).__init__() self.host = host self.topic = topic self.serializer = serializer if manager is None: self.manager = self else: self.manager = manager def start(self): super(Service, self).start() self.conn = rpc.create_connection(new=True) LOG.debug(_("Creating Consumer connection for Service %s") % self.topic) dispatcher = rpc_dispatcher.RpcDispatcher([self.manager], self.serializer) # Share this same connection for these Consumers self.conn.create_consumer(self.topic, dispatcher, fanout=False) node_topic = '%s.%s' % (self.topic, self.host) self.conn.create_consumer(node_topic, dispatcher, fanout=False) self.conn.create_consumer(self.topic, dispatcher, fanout=True) # Hook to allow the manager to do other initializations after # the rpc connection is created. if callable(getattr(self.manager, 'initialize_service_hook', None)): self.manager.initialize_service_hook(self) # Consume from all consumers in a thread self.conn.consume_in_thread() def stop(self): # Try to shut the connection down, but if we get any sort of # errors, go ahead and ignore them.. as we're shutting down anyway try: self.conn.close() except Exception: pass super(Service, self).stop() ironic-2014.1.rc1/ironic/openstack/common/rpc/matchmaker_ring.py0000664000175300017540000000667112316614116025753 0ustar jenkinsjenkins00000000000000# Copyright 2011-2013 Cloudscaling Group, Inc # # 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. """ The MatchMaker classes should except a Topic or Fanout exchange key and return keys for direct exchanges, per (approximate) AMQP parlance. """ import itertools import json from oslo.config import cfg from ironic.openstack.common.gettextutils import _ from ironic.openstack.common import log as logging from ironic.openstack.common.rpc import matchmaker as mm matchmaker_opts = [ # Matchmaker ring file cfg.StrOpt('ringfile', deprecated_name='matchmaker_ringfile', deprecated_group='DEFAULT', default='/etc/oslo/matchmaker_ring.json', help='Matchmaker ring file (JSON)'), ] CONF = cfg.CONF CONF.register_opts(matchmaker_opts, 'matchmaker_ring') LOG = logging.getLogger(__name__) class RingExchange(mm.Exchange): """Match Maker where hosts are loaded from a static JSON formatted file. __init__ takes optional ring dictionary argument, otherwise loads the ringfile from CONF.mathcmaker_ringfile. """ def __init__(self, ring=None): super(RingExchange, self).__init__() if ring: self.ring = ring else: with open(CONF.matchmaker_ring.ringfile, 'r') as fh: self.ring = json.load(fh) self.ring0 = {} for k in self.ring.keys(): self.ring0[k] = itertools.cycle(self.ring[k]) def _ring_has(self, key): return key in self.ring0 class RoundRobinRingExchange(RingExchange): """A Topic Exchange based on a hashmap.""" def __init__(self, ring=None): super(RoundRobinRingExchange, self).__init__(ring) def run(self, key): if not self._ring_has(key): LOG.warn( _("No key defining hosts for topic '%s', " "see ringfile") % (key, ) ) return [] host = next(self.ring0[key]) return [(key + '.' + host, host)] class FanoutRingExchange(RingExchange): """Fanout Exchange based on a hashmap.""" def __init__(self, ring=None): super(FanoutRingExchange, self).__init__(ring) def run(self, key): # Assume starts with "fanout~", strip it for lookup. nkey = key.split('fanout~')[1:][0] if not self._ring_has(nkey): LOG.warn( _("No key defining hosts for topic '%s', " "see ringfile") % (nkey, ) ) return [] return map(lambda x: (key + '.' + x, x), self.ring[nkey]) class MatchMakerRing(mm.MatchMakerBase): """Match Maker where hosts are loaded from a static hashmap.""" def __init__(self, ring=None): super(MatchMakerRing, self).__init__() self.add_binding(mm.FanoutBinding(), FanoutRingExchange(ring)) self.add_binding(mm.DirectBinding(), mm.DirectExchange()) self.add_binding(mm.TopicBinding(), RoundRobinRingExchange(ring)) ironic-2014.1.rc1/ironic/openstack/common/rpc/impl_zmq.py0000664000175300017540000006351312316614116024446 0ustar jenkinsjenkins00000000000000# Copyright 2011 Cloudscaling Group, Inc # # 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 import pprint import re import socket import sys import types import uuid import eventlet import greenlet from oslo.config import cfg import six from six import moves from ironic.openstack.common import excutils from ironic.openstack.common.gettextutils import _ from ironic.openstack.common import importutils from ironic.openstack.common import jsonutils from ironic.openstack.common.rpc import common as rpc_common zmq = importutils.try_import('eventlet.green.zmq') # for convenience, are not modified. pformat = pprint.pformat Timeout = eventlet.timeout.Timeout LOG = rpc_common.LOG RemoteError = rpc_common.RemoteError RPCException = rpc_common.RPCException zmq_opts = [ cfg.StrOpt('rpc_zmq_bind_address', default='*', help='ZeroMQ bind address. Should be a wildcard (*), ' 'an ethernet interface, or IP. ' 'The "host" option should point or resolve to this ' 'address.'), # The module.Class to use for matchmaking. cfg.StrOpt( 'rpc_zmq_matchmaker', default=('ironic.openstack.common.rpc.' 'matchmaker.MatchMakerLocalhost'), help='MatchMaker driver', ), # The following port is unassigned by IANA as of 2012-05-21 cfg.IntOpt('rpc_zmq_port', default=9501, help='ZeroMQ receiver listening port'), cfg.IntOpt('rpc_zmq_contexts', default=1, help='Number of ZeroMQ contexts, defaults to 1'), cfg.IntOpt('rpc_zmq_topic_backlog', default=None, help='Maximum number of ingress messages to locally buffer ' 'per topic. Default is unlimited.'), cfg.StrOpt('rpc_zmq_ipc_dir', default='/var/run/openstack', help='Directory for holding IPC sockets'), cfg.StrOpt('rpc_zmq_host', default=socket.gethostname(), help='Name of this node. Must be a valid hostname, FQDN, or ' 'IP address. Must match "host" option, if running Nova.') ] CONF = cfg.CONF CONF.register_opts(zmq_opts) ZMQ_CTX = None # ZeroMQ Context, must be global. matchmaker = None # memorized matchmaker object def _serialize(data): """Serialization wrapper. We prefer using JSON, but it cannot encode all types. Error if a developer passes us bad data. """ try: return jsonutils.dumps(data, ensure_ascii=True) except TypeError: with excutils.save_and_reraise_exception(): LOG.error(_("JSON serialization failed.")) def _deserialize(data): """Deserialization wrapper.""" LOG.debug(_("Deserializing: %s"), data) return jsonutils.loads(data) class ZmqSocket(object): """A tiny wrapper around ZeroMQ. Simplifies the send/recv protocol and connection management. Can be used as a Context (supports the 'with' statement). """ def __init__(self, addr, zmq_type, bind=True, subscribe=None): self.sock = _get_ctxt().socket(zmq_type) self.addr = addr self.type = zmq_type self.subscriptions = [] # Support failures on sending/receiving on wrong socket type. self.can_recv = zmq_type in (zmq.PULL, zmq.SUB) self.can_send = zmq_type in (zmq.PUSH, zmq.PUB) self.can_sub = zmq_type in (zmq.SUB, ) # Support list, str, & None for subscribe arg (cast to list) do_sub = { list: subscribe, str: [subscribe], type(None): [] }[type(subscribe)] for f in do_sub: self.subscribe(f) str_data = {'addr': addr, 'type': self.socket_s(), 'subscribe': subscribe, 'bind': bind} LOG.debug(_("Connecting to %(addr)s with %(type)s"), str_data) LOG.debug(_("-> Subscribed to %(subscribe)s"), str_data) LOG.debug(_("-> bind: %(bind)s"), str_data) try: if bind: self.sock.bind(addr) else: self.sock.connect(addr) except Exception: raise RPCException(_("Could not open socket.")) def socket_s(self): """Get socket type as string.""" t_enum = ('PUSH', 'PULL', 'PUB', 'SUB', 'REP', 'REQ', 'ROUTER', 'DEALER') return dict(map(lambda t: (getattr(zmq, t), t), t_enum))[self.type] def subscribe(self, msg_filter): """Subscribe.""" if not self.can_sub: raise RPCException("Cannot subscribe on this socket.") LOG.debug(_("Subscribing to %s"), msg_filter) try: self.sock.setsockopt(zmq.SUBSCRIBE, msg_filter) except Exception: return self.subscriptions.append(msg_filter) def unsubscribe(self, msg_filter): """Unsubscribe.""" if msg_filter not in self.subscriptions: return self.sock.setsockopt(zmq.UNSUBSCRIBE, msg_filter) self.subscriptions.remove(msg_filter) def close(self): if self.sock is None or self.sock.closed: return # We must unsubscribe, or we'll leak descriptors. if self.subscriptions: for f in self.subscriptions: try: self.sock.setsockopt(zmq.UNSUBSCRIBE, f) except Exception: pass self.subscriptions = [] try: # Default is to linger self.sock.close() except Exception: # While this is a bad thing to happen, # it would be much worse if some of the code calling this # were to fail. For now, lets log, and later evaluate # if we can safely raise here. LOG.error(_("ZeroMQ socket could not be closed.")) self.sock = None def recv(self, **kwargs): if not self.can_recv: raise RPCException(_("You cannot recv on this socket.")) return self.sock.recv_multipart(**kwargs) def send(self, data, **kwargs): if not self.can_send: raise RPCException(_("You cannot send on this socket.")) self.sock.send_multipart(data, **kwargs) class ZmqClient(object): """Client for ZMQ sockets.""" def __init__(self, addr): self.outq = ZmqSocket(addr, zmq.PUSH, bind=False) def cast(self, msg_id, topic, data, envelope): msg_id = msg_id or 0 if not envelope: self.outq.send(map(bytes, (msg_id, topic, 'cast', _serialize(data)))) return rpc_envelope = rpc_common.serialize_msg(data[1], envelope) zmq_msg = moves.reduce(lambda x, y: x + y, rpc_envelope.items()) self.outq.send(map(bytes, (msg_id, topic, 'impl_zmq_v2', data[0]) + zmq_msg)) def close(self): self.outq.close() class RpcContext(rpc_common.CommonRpcContext): """Context that supports replying to a rpc.call.""" def __init__(self, **kwargs): self.replies = [] super(RpcContext, self).__init__(**kwargs) def deepcopy(self): values = self.to_dict() values['replies'] = self.replies return self.__class__(**values) def reply(self, reply=None, failure=None, ending=False): if ending: return self.replies.append(reply) @classmethod def marshal(self, ctx): ctx_data = ctx.to_dict() return _serialize(ctx_data) @classmethod def unmarshal(self, data): return RpcContext.from_dict(_deserialize(data)) class InternalContext(object): """Used by ConsumerBase as a private context for - methods.""" def __init__(self, proxy): self.proxy = proxy self.msg_waiter = None def _get_response(self, ctx, proxy, topic, data): """Process a curried message and cast the result to topic.""" LOG.debug(_("Running func with context: %s"), ctx.to_dict()) data.setdefault('version', None) data.setdefault('args', {}) try: result = proxy.dispatch( ctx, data['version'], data['method'], data.get('namespace'), **data['args']) return ConsumerBase.normalize_reply(result, ctx.replies) except greenlet.GreenletExit: # ignore these since they are just from shutdowns pass except rpc_common.ClientException as e: LOG.debug(_("Expected exception during message handling (%s)") % e._exc_info[1]) return {'exc': rpc_common.serialize_remote_exception(e._exc_info, log_failure=False)} except Exception: LOG.error(_("Exception during message handling")) return {'exc': rpc_common.serialize_remote_exception(sys.exc_info())} def reply(self, ctx, proxy, msg_id=None, context=None, topic=None, msg=None): """Reply to a casted call.""" # NOTE(ewindisch): context kwarg exists for Grizzly compat. # this may be able to be removed earlier than # 'I' if ConsumerBase.process were refactored. if type(msg) is list: payload = msg[-1] else: payload = msg response = ConsumerBase.normalize_reply( self._get_response(ctx, proxy, topic, payload), ctx.replies) LOG.debug(_("Sending reply")) _multi_send(_cast, ctx, topic, { 'method': '-process_reply', 'args': { 'msg_id': msg_id, # Include for Folsom compat. 'response': response } }, _msg_id=msg_id) class ConsumerBase(object): """Base Consumer.""" def __init__(self): self.private_ctx = InternalContext(None) @classmethod def normalize_reply(self, result, replies): #TODO(ewindisch): re-evaluate and document this method. if isinstance(result, types.GeneratorType): return list(result) elif replies: return replies else: return [result] def process(self, proxy, ctx, data): data.setdefault('version', None) data.setdefault('args', {}) # Method starting with - are # processed internally. (non-valid method name) method = data.get('method') if not method: LOG.error(_("RPC message did not include method.")) return # Internal method # uses internal context for safety. if method == '-reply': self.private_ctx.reply(ctx, proxy, **data['args']) return proxy.dispatch(ctx, data['version'], data['method'], data.get('namespace'), **data['args']) class ZmqBaseReactor(ConsumerBase): """A consumer class implementing a centralized casting broker (PULL-PUSH). Used for RoundRobin requests. """ def __init__(self, conf): super(ZmqBaseReactor, self).__init__() self.proxies = {} self.threads = [] self.sockets = [] self.subscribe = {} self.pool = eventlet.greenpool.GreenPool(conf.rpc_thread_pool_size) def register(self, proxy, in_addr, zmq_type_in, in_bind=True, subscribe=None): LOG.info(_("Registering reactor")) if zmq_type_in not in (zmq.PULL, zmq.SUB): raise RPCException("Bad input socktype") # Items push in. inq = ZmqSocket(in_addr, zmq_type_in, bind=in_bind, subscribe=subscribe) self.proxies[inq] = proxy self.sockets.append(inq) LOG.info(_("In reactor registered")) def consume_in_thread(self): @excutils.forever_retry_uncaught_exceptions def _consume(sock): LOG.info(_("Consuming socket")) while True: self.consume(sock) for k in self.proxies.keys(): self.threads.append( self.pool.spawn(_consume, k) ) def wait(self): for t in self.threads: t.wait() def close(self): for s in self.sockets: s.close() for t in self.threads: t.kill() class ZmqProxy(ZmqBaseReactor): """A consumer class implementing a topic-based proxy. Forwards to IPC sockets. """ def __init__(self, conf): super(ZmqProxy, self).__init__(conf) pathsep = set((os.path.sep or '', os.path.altsep or '', '/', '\\')) self.badchars = re.compile(r'[%s]' % re.escape(''.join(pathsep))) self.topic_proxy = {} def consume(self, sock): ipc_dir = CONF.rpc_zmq_ipc_dir data = sock.recv(copy=False) topic = data[1].bytes if topic.startswith('fanout~'): sock_type = zmq.PUB topic = topic.split('.', 1)[0] elif topic.startswith('zmq_replies'): sock_type = zmq.PUB else: sock_type = zmq.PUSH if topic not in self.topic_proxy: def publisher(waiter): LOG.info(_("Creating proxy for topic: %s"), topic) try: # The topic is received over the network, # don't trust this input. if self.badchars.search(topic) is not None: emsg = _("Topic contained dangerous characters.") LOG.warn(emsg) raise RPCException(emsg) out_sock = ZmqSocket("ipc://%s/zmq_topic_%s" % (ipc_dir, topic), sock_type, bind=True) except RPCException: waiter.send_exception(*sys.exc_info()) return self.topic_proxy[topic] = eventlet.queue.LightQueue( CONF.rpc_zmq_topic_backlog) self.sockets.append(out_sock) # It takes some time for a pub socket to open, # before we can have any faith in doing a send() to it. if sock_type == zmq.PUB: eventlet.sleep(.5) waiter.send(True) while(True): data = self.topic_proxy[topic].get() out_sock.send(data, copy=False) wait_sock_creation = eventlet.event.Event() eventlet.spawn(publisher, wait_sock_creation) try: wait_sock_creation.wait() except RPCException: LOG.error(_("Topic socket file creation failed.")) return try: self.topic_proxy[topic].put_nowait(data) except eventlet.queue.Full: LOG.error(_("Local per-topic backlog buffer full for topic " "%(topic)s. Dropping message.") % {'topic': topic}) def consume_in_thread(self): """Runs the ZmqProxy service.""" ipc_dir = CONF.rpc_zmq_ipc_dir consume_in = "tcp://%s:%s" % \ (CONF.rpc_zmq_bind_address, CONF.rpc_zmq_port) consumption_proxy = InternalContext(None) try: os.makedirs(ipc_dir) except os.error: if not os.path.isdir(ipc_dir): with excutils.save_and_reraise_exception(): LOG.error(_("Required IPC directory does not exist at" " %s") % (ipc_dir, )) try: self.register(consumption_proxy, consume_in, zmq.PULL) except zmq.ZMQError: if os.access(ipc_dir, os.X_OK): with excutils.save_and_reraise_exception(): LOG.error(_("Permission denied to IPC directory at" " %s") % (ipc_dir, )) with excutils.save_and_reraise_exception(): LOG.error(_("Could not create ZeroMQ receiver daemon. " "Socket may already be in use.")) super(ZmqProxy, self).consume_in_thread() def unflatten_envelope(packenv): """Unflattens the RPC envelope. Takes a list and returns a dictionary. i.e. [1,2,3,4] => {1: 2, 3: 4} """ i = iter(packenv) h = {} try: while True: k = six.next(i) h[k] = six.next(i) except StopIteration: return h class ZmqReactor(ZmqBaseReactor): """A consumer class implementing a consumer for messages. Can also be used as a 1:1 proxy """ def __init__(self, conf): super(ZmqReactor, self).__init__(conf) def consume(self, sock): #TODO(ewindisch): use zero-copy (i.e. references, not copying) data = sock.recv() LOG.debug(_("CONSUMER RECEIVED DATA: %s"), data) proxy = self.proxies[sock] if data[2] == 'cast': # Legacy protocol packenv = data[3] ctx, msg = _deserialize(packenv) request = rpc_common.deserialize_msg(msg) ctx = RpcContext.unmarshal(ctx) elif data[2] == 'impl_zmq_v2': packenv = data[4:] msg = unflatten_envelope(packenv) request = rpc_common.deserialize_msg(msg) # Unmarshal only after verifying the message. ctx = RpcContext.unmarshal(data[3]) else: LOG.error(_("ZMQ Envelope version unsupported or unknown.")) return self.pool.spawn_n(self.process, proxy, ctx, request) class Connection(rpc_common.Connection): """Manages connections and threads.""" def __init__(self, conf): self.topics = [] self.reactor = ZmqReactor(conf) def create_consumer(self, topic, proxy, fanout=False): # Register with matchmaker. _get_matchmaker().register(topic, CONF.rpc_zmq_host) # Subscription scenarios if fanout: sock_type = zmq.SUB subscribe = ('', fanout)[type(fanout) == str] topic = 'fanout~' + topic.split('.', 1)[0] else: sock_type = zmq.PULL subscribe = None topic = '.'.join((topic.split('.', 1)[0], CONF.rpc_zmq_host)) if topic in self.topics: LOG.info(_("Skipping topic registration. Already registered.")) return # Receive messages from (local) proxy inaddr = "ipc://%s/zmq_topic_%s" % \ (CONF.rpc_zmq_ipc_dir, topic) LOG.debug(_("Consumer is a zmq.%s"), ['PULL', 'SUB'][sock_type == zmq.SUB]) self.reactor.register(proxy, inaddr, sock_type, subscribe=subscribe, in_bind=False) self.topics.append(topic) def close(self): _get_matchmaker().stop_heartbeat() for topic in self.topics: _get_matchmaker().unregister(topic, CONF.rpc_zmq_host) self.reactor.close() self.topics = [] def wait(self): self.reactor.wait() def consume_in_thread(self): _get_matchmaker().start_heartbeat() self.reactor.consume_in_thread() def _cast(addr, context, topic, msg, timeout=None, envelope=False, _msg_id=None): timeout_cast = timeout or CONF.rpc_cast_timeout payload = [RpcContext.marshal(context), msg] with Timeout(timeout_cast, exception=rpc_common.Timeout): try: conn = ZmqClient(addr) # assumes cast can't return an exception conn.cast(_msg_id, topic, payload, envelope) except zmq.ZMQError: raise RPCException("Cast failed. ZMQ Socket Exception") finally: if 'conn' in vars(): conn.close() def _call(addr, context, topic, msg, timeout=None, envelope=False): # timeout_response is how long we wait for a response timeout = timeout or CONF.rpc_response_timeout # The msg_id is used to track replies. msg_id = uuid.uuid4().hex # Replies always come into the reply service. reply_topic = "zmq_replies.%s" % CONF.rpc_zmq_host LOG.debug(_("Creating payload")) # Curry the original request into a reply method. mcontext = RpcContext.marshal(context) payload = { 'method': '-reply', 'args': { 'msg_id': msg_id, 'topic': reply_topic, # TODO(ewindisch): safe to remove mcontext in I. 'msg': [mcontext, msg] } } LOG.debug(_("Creating queue socket for reply waiter")) # Messages arriving async. # TODO(ewindisch): have reply consumer with dynamic subscription mgmt with Timeout(timeout, exception=rpc_common.Timeout): try: msg_waiter = ZmqSocket( "ipc://%s/zmq_topic_zmq_replies.%s" % (CONF.rpc_zmq_ipc_dir, CONF.rpc_zmq_host), zmq.SUB, subscribe=msg_id, bind=False ) LOG.debug(_("Sending cast")) _cast(addr, context, topic, payload, envelope) LOG.debug(_("Cast sent; Waiting reply")) # Blocks until receives reply msg = msg_waiter.recv() LOG.debug(_("Received message: %s"), msg) LOG.debug(_("Unpacking response")) if msg[2] == 'cast': # Legacy version raw_msg = _deserialize(msg[-1])[-1] elif msg[2] == 'impl_zmq_v2': rpc_envelope = unflatten_envelope(msg[4:]) raw_msg = rpc_common.deserialize_msg(rpc_envelope) else: raise rpc_common.UnsupportedRpcEnvelopeVersion( _("Unsupported or unknown ZMQ envelope returned.")) responses = raw_msg['args']['response'] # ZMQError trumps the Timeout error. except zmq.ZMQError: raise RPCException("ZMQ Socket Error") except (IndexError, KeyError): raise RPCException(_("RPC Message Invalid.")) finally: if 'msg_waiter' in vars(): msg_waiter.close() # It seems we don't need to do all of the following, # but perhaps it would be useful for multicall? # One effect of this is that we're checking all # responses for Exceptions. for resp in responses: if isinstance(resp, types.DictType) and 'exc' in resp: raise rpc_common.deserialize_remote_exception(CONF, resp['exc']) return responses[-1] def _multi_send(method, context, topic, msg, timeout=None, envelope=False, _msg_id=None): """Wraps the sending of messages. Dispatches to the matchmaker and sends message to all relevant hosts. """ conf = CONF LOG.debug(_("%(msg)s") % {'msg': ' '.join(map(pformat, (topic, msg)))}) queues = _get_matchmaker().queues(topic) LOG.debug(_("Sending message(s) to: %s"), queues) # Don't stack if we have no matchmaker results if not queues: LOG.warn(_("No matchmaker results. Not casting.")) # While not strictly a timeout, callers know how to handle # this exception and a timeout isn't too big a lie. raise rpc_common.Timeout(_("No match from matchmaker.")) # This supports brokerless fanout (addresses > 1) for queue in queues: (_topic, ip_addr) = queue _addr = "tcp://%s:%s" % (ip_addr, conf.rpc_zmq_port) if method.__name__ == '_cast': eventlet.spawn_n(method, _addr, context, _topic, msg, timeout, envelope, _msg_id) return return method(_addr, context, _topic, msg, timeout, envelope) def create_connection(conf, new=True): return Connection(conf) def multicall(conf, *args, **kwargs): """Multiple calls.""" return _multi_send(_call, *args, **kwargs) def call(conf, *args, **kwargs): """Send a message, expect a response.""" data = _multi_send(_call, *args, **kwargs) return data[-1] def cast(conf, *args, **kwargs): """Send a message expecting no reply.""" _multi_send(_cast, *args, **kwargs) def fanout_cast(conf, context, topic, msg, **kwargs): """Send a message to all listening and expect no reply.""" # NOTE(ewindisch): fanout~ is used because it avoid splitting on . # and acts as a non-subtle hint to the matchmaker and ZmqProxy. _multi_send(_cast, context, 'fanout~' + str(topic), msg, **kwargs) def notify(conf, context, topic, msg, envelope): """Send notification event. Notifications are sent to topic-priority. This differs from the AMQP drivers which send to topic.priority. """ # NOTE(ewindisch): dot-priority in rpc notifier does not # work with our assumptions. topic = topic.replace('.', '-') cast(conf, context, topic, msg, envelope=envelope) def cleanup(): """Clean up resources in use by implementation.""" global ZMQ_CTX if ZMQ_CTX: ZMQ_CTX.term() ZMQ_CTX = None global matchmaker matchmaker = None def _get_ctxt(): if not zmq: raise ImportError("Failed to import eventlet.green.zmq") global ZMQ_CTX if not ZMQ_CTX: ZMQ_CTX = zmq.Context(CONF.rpc_zmq_contexts) return ZMQ_CTX def _get_matchmaker(*args, **kwargs): global matchmaker if not matchmaker: mm = CONF.rpc_zmq_matchmaker if mm.endswith('matchmaker.MatchMakerRing'): mm.replace('matchmaker', 'matchmaker_ring') LOG.warn(_('rpc_zmq_matchmaker = %(orig)s is deprecated; use' ' %(new)s instead') % dict( orig=CONF.rpc_zmq_matchmaker, new=mm)) matchmaker = importutils.import_object(mm, *args, **kwargs) return matchmaker ironic-2014.1.rc1/ironic/openstack/common/rpc/matchmaker_redis.py0000664000175300017540000001130612316614116026111 0ustar jenkinsjenkins00000000000000# Copyright 2013 Cloudscaling Group, Inc # # 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. """ The MatchMaker classes should accept a Topic or Fanout exchange key and return keys for direct exchanges, per (approximate) AMQP parlance. """ from oslo.config import cfg from ironic.openstack.common import importutils from ironic.openstack.common import log as logging from ironic.openstack.common.rpc import matchmaker as mm_common redis = importutils.try_import('redis') matchmaker_redis_opts = [ cfg.StrOpt('host', default='127.0.0.1', help='Host to locate redis'), cfg.IntOpt('port', default=6379, help='Use this port to connect to redis host.'), cfg.StrOpt('password', default=None, help='Password for Redis server. (optional)'), ] CONF = cfg.CONF opt_group = cfg.OptGroup(name='matchmaker_redis', title='Options for Redis-based MatchMaker') CONF.register_group(opt_group) CONF.register_opts(matchmaker_redis_opts, opt_group) LOG = logging.getLogger(__name__) class RedisExchange(mm_common.Exchange): def __init__(self, matchmaker): self.matchmaker = matchmaker self.redis = matchmaker.redis super(RedisExchange, self).__init__() class RedisTopicExchange(RedisExchange): """Exchange where all topic keys are split, sending to second half. i.e. "compute.host" sends a message to "compute" running on "host" """ def run(self, topic): while True: member_name = self.redis.srandmember(topic) if not member_name: # If this happens, there are no # longer any members. break if not self.matchmaker.is_alive(topic, member_name): continue host = member_name.split('.', 1)[1] return [(member_name, host)] return [] class RedisFanoutExchange(RedisExchange): """Return a list of all hosts.""" def run(self, topic): topic = topic.split('~', 1)[1] hosts = self.redis.smembers(topic) good_hosts = filter( lambda host: self.matchmaker.is_alive(topic, host), hosts) return [(x, x.split('.', 1)[1]) for x in good_hosts] class MatchMakerRedis(mm_common.HeartbeatMatchMakerBase): """MatchMaker registering and looking-up hosts with a Redis server.""" def __init__(self): super(MatchMakerRedis, self).__init__() if not redis: raise ImportError("Failed to import module redis.") self.redis = redis.Redis( host=CONF.matchmaker_redis.host, port=CONF.matchmaker_redis.port, password=CONF.matchmaker_redis.password) self.add_binding(mm_common.FanoutBinding(), RedisFanoutExchange(self)) self.add_binding(mm_common.DirectBinding(), mm_common.DirectExchange()) self.add_binding(mm_common.TopicBinding(), RedisTopicExchange(self)) def ack_alive(self, key, host): topic = "%s.%s" % (key, host) if not self.redis.expire(topic, CONF.matchmaker_heartbeat_ttl): # If we could not update the expiration, the key # might have been pruned. Re-register, creating a new # key in Redis. self.register(self.topic_host[host], host) def is_alive(self, topic, host): if self.redis.ttl(host) == -1: self.expire(topic, host) return False return True def expire(self, topic, host): with self.redis.pipeline() as pipe: pipe.multi() pipe.delete(host) pipe.srem(topic, host) pipe.execute() def backend_register(self, key, key_host): with self.redis.pipeline() as pipe: pipe.multi() pipe.sadd(key, key_host) # No value is needed, we just # care if it exists. Sets aren't viable # because only keys can expire. pipe.set(key_host, '') pipe.execute() def backend_unregister(self, key, key_host): with self.redis.pipeline() as pipe: pipe.multi() pipe.srem(key, key_host) pipe.delete(key_host) pipe.execute() ironic-2014.1.rc1/ironic/openstack/common/rpc/dispatcher.py0000664000175300017540000001554012316614116024741 0ustar jenkinsjenkins00000000000000# Copyright 2012 Red Hat, Inc. # # 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. """ Code for rpc message dispatching. Messages that come in have a version number associated with them. RPC API version numbers are in the form: Major.Minor For a given message with version X.Y, the receiver must be marked as able to handle messages of version A.B, where: A = X B >= Y The Major version number would be incremented for an almost completely new API. The Minor version number would be incremented for backwards compatible changes to an existing API. A backwards compatible change could be something like adding a new method, adding an argument to an existing method (but not requiring it), or changing the type for an existing argument (but still handling the old type as well). The conversion over to a versioned API must be done on both the client side and server side of the API at the same time. However, as the code stands today, there can be both versioned and unversioned APIs implemented in the same code base. EXAMPLES ======== Nova was the first project to use versioned rpc APIs. Consider the compute rpc API as an example. The client side is in nova/compute/rpcapi.py and the server side is in nova/compute/manager.py. Example 1) Adding a new method. ------------------------------- Adding a new method is a backwards compatible change. It should be added to nova/compute/manager.py, and RPC_API_VERSION should be bumped from X.Y to X.Y+1. On the client side, the new method in nova/compute/rpcapi.py should have a specific version specified to indicate the minimum API version that must be implemented for the method to be supported. For example:: def get_host_uptime(self, ctxt, host): topic = _compute_topic(self.topic, ctxt, host, None) return self.call(ctxt, self.make_msg('get_host_uptime'), topic, version='1.1') In this case, version '1.1' is the first version that supported the get_host_uptime() method. Example 2) Adding a new parameter. ---------------------------------- Adding a new parameter to an rpc method can be made backwards compatible. The RPC_API_VERSION on the server side (nova/compute/manager.py) should be bumped. The implementation of the method must not expect the parameter to be present.:: def some_remote_method(self, arg1, arg2, newarg=None): # The code needs to deal with newarg=None for cases # where an older client sends a message without it. pass On the client side, the same changes should be made as in example 1. The minimum version that supports the new parameter should be specified. """ import six from ironic.openstack.common.rpc import common as rpc_common from ironic.openstack.common.rpc import serializer as rpc_serializer class RpcDispatcher(object): """Dispatch rpc messages according to the requested API version. This class can be used as the top level 'manager' for a service. It contains a list of underlying managers that have an API_VERSION attribute. """ def __init__(self, callbacks, serializer=None): """Initialize the rpc dispatcher. :param callbacks: List of proxy objects that are an instance of a class with rpc methods exposed. Each proxy object should have an RPC_API_VERSION attribute. :param serializer: The Serializer object that will be used to deserialize arguments before the method call and to serialize the result after it returns. """ self.callbacks = callbacks if serializer is None: serializer = rpc_serializer.NoOpSerializer() self.serializer = serializer super(RpcDispatcher, self).__init__() def _deserialize_args(self, context, kwargs): """Helper method called to deserialize args before dispatch. This calls our serializer on each argument, returning a new set of args that have been deserialized. :param context: The request context :param kwargs: The arguments to be deserialized :returns: A new set of deserialized args """ new_kwargs = dict() for argname, arg in six.iteritems(kwargs): new_kwargs[argname] = self.serializer.deserialize_entity(context, arg) return new_kwargs def dispatch(self, ctxt, version, method, namespace, **kwargs): """Dispatch a message based on a requested version. :param ctxt: The request context :param version: The requested API version from the incoming message :param method: The method requested to be called by the incoming message. :param namespace: The namespace for the requested method. If None, the dispatcher will look for a method on a callback object with no namespace set. :param kwargs: A dict of keyword arguments to be passed to the method. :returns: Whatever is returned by the underlying method that gets called. """ if not version: version = '1.0' had_compatible = False for proxyobj in self.callbacks: # Check for namespace compatibility try: cb_namespace = proxyobj.RPC_API_NAMESPACE except AttributeError: cb_namespace = None if namespace != cb_namespace: continue # Check for version compatibility try: rpc_api_version = proxyobj.RPC_API_VERSION except AttributeError: rpc_api_version = '1.0' is_compatible = rpc_common.version_is_compatible(rpc_api_version, version) had_compatible = had_compatible or is_compatible if not hasattr(proxyobj, method): continue if is_compatible: kwargs = self._deserialize_args(ctxt, kwargs) result = getattr(proxyobj, method)(ctxt, **kwargs) return self.serializer.serialize_entity(ctxt, result) if had_compatible: raise AttributeError("No such RPC function '%s'" % method) else: raise rpc_common.UnsupportedRpcVersion(version=version) ironic-2014.1.rc1/ironic/openstack/common/log.py0000664000175300017540000005364312316614116022616 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2011 OpenStack Foundation. # Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # 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. """Openstack logging handler. This module adds to logging functionality by adding the option to specify a context object when calling the various log methods. If the context object is not specified, default formatting is used. Additionally, an instance uuid may be passed as part of the log message, which is intended to make it easier for admins to find messages related to a specific instance. It also allows setting of formatting information through conf. """ import inspect import itertools import logging import logging.config import logging.handlers import os import re import sys import traceback from oslo.config import cfg import six from six import moves from ironic.openstack.common.gettextutils import _ # noqa from ironic.openstack.common import importutils from ironic.openstack.common import jsonutils from ironic.openstack.common import local _DEFAULT_LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S" _SANITIZE_KEYS = ['adminPass', 'admin_pass', 'password', 'admin_password'] # NOTE(ldbragst): Let's build a list of regex objects using the list of # _SANITIZE_KEYS we already have. This way, we only have to add the new key # to the list of _SANITIZE_KEYS and we can generate regular expressions # for XML and JSON automatically. _SANITIZE_PATTERNS = [] _FORMAT_PATTERNS = [r'(%(key)s\s*[=]\s*[\"\']).*?([\"\'])', r'(<%(key)s>).*?()', r'([\"\']%(key)s[\"\']\s*:\s*[\"\']).*?([\"\'])', r'([\'"].*?%(key)s[\'"]\s*:\s*u?[\'"]).*?([\'"])'] for key in _SANITIZE_KEYS: for pattern in _FORMAT_PATTERNS: reg_ex = re.compile(pattern % {'key': key}, re.DOTALL) _SANITIZE_PATTERNS.append(reg_ex) common_cli_opts = [ cfg.BoolOpt('debug', short='d', default=False, help='Print debugging output (set logging level to ' 'DEBUG instead of default WARNING level).'), cfg.BoolOpt('verbose', short='v', default=False, help='Print more verbose output (set logging level to ' 'INFO instead of default WARNING level).'), ] logging_cli_opts = [ cfg.StrOpt('log-config-append', metavar='PATH', deprecated_name='log-config', help='The name of logging configuration file. It does not ' 'disable existing loggers, but just appends specified ' 'logging configuration to any other existing logging ' 'options. Please see the Python logging module ' 'documentation for details on logging configuration ' 'files.'), cfg.StrOpt('log-format', default=None, metavar='FORMAT', help='DEPRECATED. ' 'A logging.Formatter log message format string which may ' 'use any of the available logging.LogRecord attributes. ' 'This option is deprecated. Please use ' 'logging_context_format_string and ' 'logging_default_format_string instead.'), cfg.StrOpt('log-date-format', default=_DEFAULT_LOG_DATE_FORMAT, metavar='DATE_FORMAT', help='Format string for %%(asctime)s in log records. ' 'Default: %(default)s'), cfg.StrOpt('log-file', metavar='PATH', deprecated_name='logfile', help='(Optional) Name of log file to output to. ' 'If no default is set, logging will go to stdout.'), cfg.StrOpt('log-dir', deprecated_name='logdir', help='(Optional) The base directory used for relative ' '--log-file paths'), cfg.BoolOpt('use-syslog', default=False, help='Use syslog for logging.'), cfg.StrOpt('syslog-log-facility', default='LOG_USER', help='syslog facility to receive log lines') ] generic_log_opts = [ cfg.BoolOpt('use_stderr', default=True, help='Log output to standard error') ] log_opts = [ cfg.StrOpt('logging_context_format_string', default='%(asctime)s.%(msecs)03d %(process)d %(levelname)s ' '%(name)s [%(request_id)s %(user)s %(tenant)s] ' '%(instance)s%(message)s', help='format string to use for log messages with context'), cfg.StrOpt('logging_default_format_string', default='%(asctime)s.%(msecs)03d %(process)d %(levelname)s ' '%(name)s [-] %(instance)s%(message)s', help='format string to use for log messages without context'), cfg.StrOpt('logging_debug_format_suffix', default='%(funcName)s %(pathname)s:%(lineno)d', help='data to append to log format when level is DEBUG'), cfg.StrOpt('logging_exception_prefix', default='%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s ' '%(instance)s', help='prefix each line of exception output with this format'), cfg.ListOpt('default_log_levels', default=[ 'amqp=WARN', 'amqplib=WARN', 'boto=WARN', 'keystone=INFO', 'qpid=WARN', 'sqlalchemy=WARN', 'suds=INFO', 'iso8601=WARN', ], help='list of logger=LEVEL pairs'), cfg.BoolOpt('publish_errors', default=False, help='publish error events'), cfg.BoolOpt('fatal_deprecations', default=False, help='make deprecations fatal'), # NOTE(mikal): there are two options here because sometimes we are handed # a full instance (and could include more information), and other times we # are just handed a UUID for the instance. cfg.StrOpt('instance_format', default='[instance: %(uuid)s] ', help='If an instance is passed with the log message, format ' 'it like this'), cfg.StrOpt('instance_uuid_format', default='[instance: %(uuid)s] ', help='If an instance UUID is passed with the log message, ' 'format it like this'), ] CONF = cfg.CONF CONF.register_cli_opts(common_cli_opts) CONF.register_cli_opts(logging_cli_opts) CONF.register_opts(generic_log_opts) CONF.register_opts(log_opts) # our new audit level # NOTE(jkoelker) Since we synthesized an audit level, make the logging # module aware of it so it acts like other levels. logging.AUDIT = logging.INFO + 1 logging.addLevelName(logging.AUDIT, 'AUDIT') try: NullHandler = logging.NullHandler except AttributeError: # NOTE(jkoelker) NullHandler added in Python 2.7 class NullHandler(logging.Handler): def handle(self, record): pass def emit(self, record): pass def createLock(self): self.lock = None def _dictify_context(context): if context is None: return None if not isinstance(context, dict) and getattr(context, 'to_dict', None): context = context.to_dict() return context def _get_binary_name(): return os.path.basename(inspect.stack()[-1][1]) def _get_log_file_path(binary=None): logfile = CONF.log_file logdir = CONF.log_dir if logfile and not logdir: return logfile if logfile and logdir: return os.path.join(logdir, logfile) if logdir: binary = binary or _get_binary_name() return '%s.log' % (os.path.join(logdir, binary),) return None def mask_password(message, secret="***"): """Replace password with 'secret' in message. :param message: The string which includes security information. :param secret: value with which to replace passwords, defaults to "***". :returns: The unicode value of message with the password fields masked. For example: >>> mask_password("'adminPass' : 'aaaaa'") "'adminPass' : '***'" >>> mask_password("'admin_pass' : 'aaaaa'") "'admin_pass' : '***'" >>> mask_password('"password" : "aaaaa"') '"password" : "***"' >>> mask_password("'original_password' : 'aaaaa'") "'original_password' : '***'" >>> mask_password("u'original_password' : u'aaaaa'") "u'original_password' : u'***'" """ message = six.text_type(message) # NOTE(ldbragst): Check to see if anything in message contains any key # specified in _SANITIZE_KEYS, if not then just return the message since # we don't have to mask any passwords. if not any(key in message for key in _SANITIZE_KEYS): return message secret = r'\g<1>' + secret + r'\g<2>' for pattern in _SANITIZE_PATTERNS: message = re.sub(pattern, secret, message) return message class BaseLoggerAdapter(logging.LoggerAdapter): def audit(self, msg, *args, **kwargs): self.log(logging.AUDIT, msg, *args, **kwargs) class LazyAdapter(BaseLoggerAdapter): def __init__(self, name='unknown', version='unknown'): self._logger = None self.extra = {} self.name = name self.version = version @property def logger(self): if not self._logger: self._logger = getLogger(self.name, self.version) return self._logger class ContextAdapter(BaseLoggerAdapter): warn = logging.LoggerAdapter.warning def __init__(self, logger, project_name, version_string): self.logger = logger self.project = project_name self.version = version_string @property def handlers(self): return self.logger.handlers def deprecated(self, msg, *args, **kwargs): stdmsg = _("Deprecated: %s") % msg if CONF.fatal_deprecations: self.critical(stdmsg, *args, **kwargs) raise DeprecatedConfig(msg=stdmsg) else: self.warn(stdmsg, *args, **kwargs) def process(self, msg, kwargs): # NOTE(mrodden): catch any Message/other object and # coerce to unicode before they can get # to the python logging and possibly # cause string encoding trouble if not isinstance(msg, six.string_types): msg = six.text_type(msg) if 'extra' not in kwargs: kwargs['extra'] = {} extra = kwargs['extra'] context = kwargs.pop('context', None) if not context: context = getattr(local.store, 'context', None) if context: extra.update(_dictify_context(context)) instance = kwargs.pop('instance', None) instance_uuid = (extra.get('instance_uuid', None) or kwargs.pop('instance_uuid', None)) instance_extra = '' if instance: instance_extra = CONF.instance_format % instance elif instance_uuid: instance_extra = (CONF.instance_uuid_format % {'uuid': instance_uuid}) extra.update({'instance': instance_extra}) extra.update({"project": self.project}) extra.update({"version": self.version}) extra['extra'] = extra.copy() return msg, kwargs class JSONFormatter(logging.Formatter): def __init__(self, fmt=None, datefmt=None): # NOTE(jkoelker) we ignore the fmt argument, but its still there # since logging.config.fileConfig passes it. self.datefmt = datefmt def formatException(self, ei, strip_newlines=True): lines = traceback.format_exception(*ei) if strip_newlines: lines = [itertools.ifilter( lambda x: x, line.rstrip().splitlines()) for line in lines] lines = list(itertools.chain(*lines)) return lines def format(self, record): message = {'message': record.getMessage(), 'asctime': self.formatTime(record, self.datefmt), 'name': record.name, 'msg': record.msg, 'args': record.args, 'levelname': record.levelname, 'levelno': record.levelno, 'pathname': record.pathname, 'filename': record.filename, 'module': record.module, 'lineno': record.lineno, 'funcname': record.funcName, 'created': record.created, 'msecs': record.msecs, 'relative_created': record.relativeCreated, 'thread': record.thread, 'thread_name': record.threadName, 'process_name': record.processName, 'process': record.process, 'traceback': None} if hasattr(record, 'extra'): message['extra'] = record.extra if record.exc_info: message['traceback'] = self.formatException(record.exc_info) return jsonutils.dumps(message) def _create_logging_excepthook(product_name): def logging_excepthook(exc_type, value, tb): extra = {} if CONF.verbose: extra['exc_info'] = (exc_type, value, tb) getLogger(product_name).critical(str(value), **extra) return logging_excepthook class LogConfigError(Exception): message = _('Error loading logging config %(log_config)s: %(err_msg)s') def __init__(self, log_config, err_msg): self.log_config = log_config self.err_msg = err_msg def __str__(self): return self.message % dict(log_config=self.log_config, err_msg=self.err_msg) def _load_log_config(log_config_append): try: logging.config.fileConfig(log_config_append, disable_existing_loggers=False) except moves.configparser.Error as exc: raise LogConfigError(log_config_append, str(exc)) def setup(product_name): """Setup logging.""" if CONF.log_config_append: _load_log_config(CONF.log_config_append) else: _setup_logging_from_conf() sys.excepthook = _create_logging_excepthook(product_name) def set_defaults(logging_context_format_string): cfg.set_defaults(log_opts, logging_context_format_string= logging_context_format_string) def _find_facility_from_conf(): facility_names = logging.handlers.SysLogHandler.facility_names facility = getattr(logging.handlers.SysLogHandler, CONF.syslog_log_facility, None) if facility is None and CONF.syslog_log_facility in facility_names: facility = facility_names.get(CONF.syslog_log_facility) if facility is None: valid_facilities = facility_names.keys() consts = ['LOG_AUTH', 'LOG_AUTHPRIV', 'LOG_CRON', 'LOG_DAEMON', 'LOG_FTP', 'LOG_KERN', 'LOG_LPR', 'LOG_MAIL', 'LOG_NEWS', 'LOG_AUTH', 'LOG_SYSLOG', 'LOG_USER', 'LOG_UUCP', 'LOG_LOCAL0', 'LOG_LOCAL1', 'LOG_LOCAL2', 'LOG_LOCAL3', 'LOG_LOCAL4', 'LOG_LOCAL5', 'LOG_LOCAL6', 'LOG_LOCAL7'] valid_facilities.extend(consts) raise TypeError(_('syslog facility must be one of: %s') % ', '.join("'%s'" % fac for fac in valid_facilities)) return facility def _setup_logging_from_conf(): log_root = getLogger(None).logger for handler in log_root.handlers: log_root.removeHandler(handler) if CONF.use_syslog: facility = _find_facility_from_conf() syslog = logging.handlers.SysLogHandler(address='/dev/log', facility=facility) log_root.addHandler(syslog) logpath = _get_log_file_path() if logpath: filelog = logging.handlers.WatchedFileHandler(logpath) log_root.addHandler(filelog) if CONF.use_stderr: streamlog = ColorHandler() log_root.addHandler(streamlog) elif not CONF.log_file: # pass sys.stdout as a positional argument # python2.6 calls the argument strm, in 2.7 it's stream streamlog = logging.StreamHandler(sys.stdout) log_root.addHandler(streamlog) if CONF.publish_errors: handler = importutils.import_object( "ironic.openstack.common.log_handler.PublishErrorsHandler", logging.ERROR) log_root.addHandler(handler) datefmt = CONF.log_date_format for handler in log_root.handlers: # NOTE(alaski): CONF.log_format overrides everything currently. This # should be deprecated in favor of context aware formatting. if CONF.log_format: handler.setFormatter(logging.Formatter(fmt=CONF.log_format, datefmt=datefmt)) log_root.info('Deprecated: log_format is now deprecated and will ' 'be removed in the next release') else: handler.setFormatter(ContextFormatter(datefmt=datefmt)) if CONF.debug: log_root.setLevel(logging.DEBUG) elif CONF.verbose: log_root.setLevel(logging.INFO) else: log_root.setLevel(logging.WARNING) for pair in CONF.default_log_levels: mod, _sep, level_name = pair.partition('=') level = logging.getLevelName(level_name) logger = logging.getLogger(mod) logger.setLevel(level) _loggers = {} def getLogger(name='unknown', version='unknown'): if name not in _loggers: _loggers[name] = ContextAdapter(logging.getLogger(name), name, version) return _loggers[name] def getLazyLogger(name='unknown', version='unknown'): """Returns lazy logger. Creates a pass-through logger that does not create the real logger until it is really needed and delegates all calls to the real logger once it is created. """ return LazyAdapter(name, version) class WritableLogger(object): """A thin wrapper that responds to `write` and logs.""" def __init__(self, logger, level=logging.INFO): self.logger = logger self.level = level def write(self, msg): self.logger.log(self.level, msg) class ContextFormatter(logging.Formatter): """A context.RequestContext aware formatter configured through flags. The flags used to set format strings are: logging_context_format_string and logging_default_format_string. You can also specify logging_debug_format_suffix to append extra formatting if the log level is debug. For information about what variables are available for the formatter see: http://docs.python.org/library/logging.html#formatter """ def format(self, record): """Uses contextstring if request_id is set, otherwise default.""" # NOTE(sdague): default the fancier formating params # to an empty string so we don't throw an exception if # they get used for key in ('instance', 'color'): if key not in record.__dict__: record.__dict__[key] = '' if record.__dict__.get('request_id', None): self._fmt = CONF.logging_context_format_string else: self._fmt = CONF.logging_default_format_string if (record.levelno == logging.DEBUG and CONF.logging_debug_format_suffix): self._fmt += " " + CONF.logging_debug_format_suffix # Cache this on the record, Logger will respect our formated copy if record.exc_info: record.exc_text = self.formatException(record.exc_info, record) return logging.Formatter.format(self, record) def formatException(self, exc_info, record=None): """Format exception output with CONF.logging_exception_prefix.""" if not record: return logging.Formatter.formatException(self, exc_info) stringbuffer = moves.StringIO() traceback.print_exception(exc_info[0], exc_info[1], exc_info[2], None, stringbuffer) lines = stringbuffer.getvalue().split('\n') stringbuffer.close() if CONF.logging_exception_prefix.find('%(asctime)') != -1: record.asctime = self.formatTime(record, self.datefmt) formatted_lines = [] for line in lines: pl = CONF.logging_exception_prefix % record.__dict__ fl = '%s%s' % (pl, line) formatted_lines.append(fl) return '\n'.join(formatted_lines) class ColorHandler(logging.StreamHandler): LEVEL_COLORS = { logging.DEBUG: '\033[00;32m', # GREEN logging.INFO: '\033[00;36m', # CYAN logging.AUDIT: '\033[01;36m', # BOLD CYAN logging.WARN: '\033[01;33m', # BOLD YELLOW logging.ERROR: '\033[01;31m', # BOLD RED logging.CRITICAL: '\033[01;31m', # BOLD RED } def format(self, record): record.color = self.LEVEL_COLORS[record.levelno] return logging.StreamHandler.format(self, record) class DeprecatedConfig(Exception): message = _("Fatal call to deprecated config: %(msg)s") def __init__(self, msg): super(Exception, self).__init__(self.message % dict(msg=msg)) ironic-2014.1.rc1/ironic/openstack/common/gettextutils.py0000664000175300017540000004454212316614116024600 0ustar jenkinsjenkins00000000000000# Copyright 2012 Red Hat, Inc. # 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. """ gettext for openstack-common modules. Usual usage in an openstack.common module: from ironic.openstack.common.gettextutils import _ """ import copy import functools import gettext import locale from logging import handlers import os import re from babel import localedata import six _localedir = os.environ.get('ironic'.upper() + '_LOCALEDIR') _t = gettext.translation('ironic', localedir=_localedir, fallback=True) # We use separate translation catalogs for each log level, so set up a # mapping between the log level name and the translator. The domain # for the log level is project_name + "-log-" + log_level so messages # for each level end up in their own catalog. _t_log_levels = dict( (level, gettext.translation('ironic' + '-log-' + level, localedir=_localedir, fallback=True)) for level in ['info', 'warning', 'error', 'critical'] ) _AVAILABLE_LANGUAGES = {} USE_LAZY = False def enable_lazy(): """Convenience function for configuring _() to use lazy gettext Call this at the start of execution to enable the gettextutils._ function to use lazy gettext functionality. This is useful if your project is importing _ directly instead of using the gettextutils.install() way of importing the _ function. """ global USE_LAZY USE_LAZY = True def _(msg): if USE_LAZY: return Message(msg, domain='ironic') else: if six.PY3: return _t.gettext(msg) return _t.ugettext(msg) def _log_translation(msg, level): """Build a single translation of a log message """ if USE_LAZY: return Message(msg, domain='ironic' + '-log-' + level) else: translator = _t_log_levels[level] if six.PY3: return translator.gettext(msg) return translator.ugettext(msg) # Translators for log levels. # # The abbreviated names are meant to reflect the usual use of a short # name like '_'. The "L" is for "log" and the other letter comes from # the level. _LI = functools.partial(_log_translation, level='info') _LW = functools.partial(_log_translation, level='warning') _LE = functools.partial(_log_translation, level='error') _LC = functools.partial(_log_translation, level='critical') def install(domain, lazy=False): """Install a _() function using the given translation domain. Given a translation domain, install a _() function using gettext's install() function. The main difference from gettext.install() is that we allow overriding the default localedir (e.g. /usr/share/locale) using a translation-domain-specific environment variable (e.g. NOVA_LOCALEDIR). :param domain: the translation domain :param lazy: indicates whether or not to install the lazy _() function. The lazy _() introduces a way to do deferred translation of messages by installing a _ that builds Message objects, instead of strings, which can then be lazily translated into any available locale. """ if lazy: # NOTE(mrodden): Lazy gettext functionality. # # The following introduces a deferred way to do translations on # messages in OpenStack. We override the standard _() function # and % (format string) operation to build Message objects that can # later be translated when we have more information. def _lazy_gettext(msg): """Create and return a Message object. Lazy gettext function for a given domain, it is a factory method for a project/module to get a lazy gettext function for its own translation domain (i.e. nova, glance, cinder, etc.) Message encapsulates a string so that we can translate it later when needed. """ return Message(msg, domain=domain) from six import moves moves.builtins.__dict__['_'] = _lazy_gettext else: localedir = '%s_LOCALEDIR' % domain.upper() if six.PY3: gettext.install(domain, localedir=os.environ.get(localedir)) else: gettext.install(domain, localedir=os.environ.get(localedir), unicode=True) class Message(six.text_type): """A Message object is a unicode object that can be translated. Translation of Message is done explicitly using the translate() method. For all non-translation intents and purposes, a Message is simply unicode, and can be treated as such. """ def __new__(cls, msgid, msgtext=None, params=None, domain='ironic', *args): """Create a new Message object. In order for translation to work gettext requires a message ID, this msgid will be used as the base unicode text. It is also possible for the msgid and the base unicode text to be different by passing the msgtext parameter. """ # If the base msgtext is not given, we use the default translation # of the msgid (which is in English) just in case the system locale is # not English, so that the base text will be in that locale by default. if not msgtext: msgtext = Message._translate_msgid(msgid, domain) # We want to initialize the parent unicode with the actual object that # would have been plain unicode if 'Message' was not enabled. msg = super(Message, cls).__new__(cls, msgtext) msg.msgid = msgid msg.domain = domain msg.params = params return msg def translate(self, desired_locale=None): """Translate this message to the desired locale. :param desired_locale: The desired locale to translate the message to, if no locale is provided the message will be translated to the system's default locale. :returns: the translated message in unicode """ translated_message = Message._translate_msgid(self.msgid, self.domain, desired_locale) if self.params is None: # No need for more translation return translated_message # This Message object may have been formatted with one or more # Message objects as substitution arguments, given either as a single # argument, part of a tuple, or as one or more values in a dictionary. # When translating this Message we need to translate those Messages too translated_params = _translate_args(self.params, desired_locale) translated_message = translated_message % translated_params return translated_message @staticmethod def _translate_msgid(msgid, domain, desired_locale=None): if not desired_locale: system_locale = locale.getdefaultlocale() # If the system locale is not available to the runtime use English if not system_locale[0]: desired_locale = 'en_US' else: desired_locale = system_locale[0] locale_dir = os.environ.get(domain.upper() + '_LOCALEDIR') lang = gettext.translation(domain, localedir=locale_dir, languages=[desired_locale], fallback=True) if six.PY3: translator = lang.gettext else: translator = lang.ugettext translated_message = translator(msgid) return translated_message def __mod__(self, other): # When we mod a Message we want the actual operation to be performed # by the parent class (i.e. unicode()), the only thing we do here is # save the original msgid and the parameters in case of a translation params = self._sanitize_mod_params(other) unicode_mod = super(Message, self).__mod__(params) modded = Message(self.msgid, msgtext=unicode_mod, params=params, domain=self.domain) return modded def _sanitize_mod_params(self, other): """Sanitize the object being modded with this Message. - Add support for modding 'None' so translation supports it - Trim the modded object, which can be a large dictionary, to only those keys that would actually be used in a translation - Snapshot the object being modded, in case the message is translated, it will be used as it was when the Message was created """ if other is None: params = (other,) elif isinstance(other, dict): params = self._trim_dictionary_parameters(other) else: params = self._copy_param(other) return params def _trim_dictionary_parameters(self, dict_param): """Return a dict that only has matching entries in the msgid.""" # NOTE(luisg): Here we trim down the dictionary passed as parameters # to avoid carrying a lot of unnecessary weight around in the message # object, for example if someone passes in Message() % locals() but # only some params are used, and additionally we prevent errors for # non-deepcopyable objects by unicoding() them. # Look for %(param) keys in msgid; # Skip %% and deal with the case where % is first character on the line keys = re.findall('(?:[^%]|^)?%\((\w*)\)[a-z]', self.msgid) # If we don't find any %(param) keys but have a %s if not keys and re.findall('(?:[^%]|^)%[a-z]', self.msgid): # Apparently the full dictionary is the parameter params = self._copy_param(dict_param) else: params = {} # Save our existing parameters as defaults to protect # ourselves from losing values if we are called through an # (erroneous) chain that builds a valid Message with # arguments, and then does something like "msg % kwds" # where kwds is an empty dictionary. src = {} if isinstance(self.params, dict): src.update(self.params) src.update(dict_param) for key in keys: params[key] = self._copy_param(src[key]) return params def _copy_param(self, param): try: return copy.deepcopy(param) except TypeError: # Fallback to casting to unicode this will handle the # python code-like objects that can't be deep-copied return six.text_type(param) def __add__(self, other): msg = _('Message objects do not support addition.') raise TypeError(msg) def __radd__(self, other): return self.__add__(other) def __str__(self): # NOTE(luisg): Logging in python 2.6 tries to str() log records, # and it expects specifically a UnicodeError in order to proceed. msg = _('Message objects do not support str() because they may ' 'contain non-ascii characters. ' 'Please use unicode() or translate() instead.') raise UnicodeError(msg) def get_available_languages(domain): """Lists the available languages for the given translation domain. :param domain: the domain to get languages for """ if domain in _AVAILABLE_LANGUAGES: return copy.copy(_AVAILABLE_LANGUAGES[domain]) localedir = '%s_LOCALEDIR' % domain.upper() find = lambda x: gettext.find(domain, localedir=os.environ.get(localedir), languages=[x]) # NOTE(mrodden): en_US should always be available (and first in case # order matters) since our in-line message strings are en_US language_list = ['en_US'] # NOTE(luisg): Babel <1.0 used a function called list(), which was # renamed to locale_identifiers() in >=1.0, the requirements master list # requires >=0.9.6, uncapped, so defensively work with both. We can remove # this check when the master list updates to >=1.0, and update all projects list_identifiers = (getattr(localedata, 'list', None) or getattr(localedata, 'locale_identifiers')) locale_identifiers = list_identifiers() for i in locale_identifiers: if find(i) is not None: language_list.append(i) # NOTE(luisg): Babel>=1.0,<1.3 has a bug where some OpenStack supported # locales (e.g. 'zh_CN', and 'zh_TW') aren't supported even though they # are perfectly legitimate locales: # https://github.com/mitsuhiko/babel/issues/37 # In Babel 1.3 they fixed the bug and they support these locales, but # they are still not explicitly "listed" by locale_identifiers(). # That is why we add the locales here explicitly if necessary so that # they are listed as supported. aliases = {'zh': 'zh_CN', 'zh_Hant_HK': 'zh_HK', 'zh_Hant': 'zh_TW', 'fil': 'tl_PH'} for (locale, alias) in six.iteritems(aliases): if locale in language_list and alias not in language_list: language_list.append(alias) _AVAILABLE_LANGUAGES[domain] = language_list return copy.copy(language_list) def translate(obj, desired_locale=None): """Gets the translated unicode representation of the given object. If the object is not translatable it is returned as-is. If the locale is None the object is translated to the system locale. :param obj: the object to translate :param desired_locale: the locale to translate the message to, if None the default system locale will be used :returns: the translated object in unicode, or the original object if it could not be translated """ message = obj if not isinstance(message, Message): # If the object to translate is not already translatable, # let's first get its unicode representation message = six.text_type(obj) if isinstance(message, Message): # Even after unicoding() we still need to check if we are # running with translatable unicode before translating return message.translate(desired_locale) return obj def _translate_args(args, desired_locale=None): """Translates all the translatable elements of the given arguments object. This method is used for translating the translatable values in method arguments which include values of tuples or dictionaries. If the object is not a tuple or a dictionary the object itself is translated if it is translatable. If the locale is None the object is translated to the system locale. :param args: the args to translate :param desired_locale: the locale to translate the args to, if None the default system locale will be used :returns: a new args object with the translated contents of the original """ if isinstance(args, tuple): return tuple(translate(v, desired_locale) for v in args) if isinstance(args, dict): translated_dict = {} for (k, v) in six.iteritems(args): translated_v = translate(v, desired_locale) translated_dict[k] = translated_v return translated_dict return translate(args, desired_locale) class TranslationHandler(handlers.MemoryHandler): """Handler that translates records before logging them. The TranslationHandler takes a locale and a target logging.Handler object to forward LogRecord objects to after translating them. This handler depends on Message objects being logged, instead of regular strings. The handler can be configured declaratively in the logging.conf as follows: [handlers] keys = translatedlog, translator [handler_translatedlog] class = handlers.WatchedFileHandler args = ('/var/log/api-localized.log',) formatter = context [handler_translator] class = openstack.common.log.TranslationHandler target = translatedlog args = ('zh_CN',) If the specified locale is not available in the system, the handler will log in the default locale. """ def __init__(self, locale=None, target=None): """Initialize a TranslationHandler :param locale: locale to use for translating messages :param target: logging.Handler object to forward LogRecord objects to after translation """ # NOTE(luisg): In order to allow this handler to be a wrapper for # other handlers, such as a FileHandler, and still be able to # configure it using logging.conf, this handler has to extend # MemoryHandler because only the MemoryHandlers' logging.conf # parsing is implemented such that it accepts a target handler. handlers.MemoryHandler.__init__(self, capacity=0, target=target) self.locale = locale def setFormatter(self, fmt): self.target.setFormatter(fmt) def emit(self, record): # We save the message from the original record to restore it # after translation, so other handlers are not affected by this original_msg = record.msg original_args = record.args try: self._translate_and_log_record(record) finally: record.msg = original_msg record.args = original_args def _translate_and_log_record(self, record): record.msg = translate(record.msg, self.locale) # In addition to translating the message, we also need to translate # arguments that were passed to the log method that were not part # of the main message e.g., log.info(_('Some message %s'), this_one)) record.args = _translate_args(record.args, self.locale) self.target.emit(record) ironic-2014.1.rc1/ironic/openstack/common/sslutils.py0000664000175300017540000000551612316614116023713 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2013 IBM Corp. # # 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 import ssl from oslo.config import cfg from ironic.openstack.common.gettextutils import _ # noqa ssl_opts = [ cfg.StrOpt('ca_file', default=None, help="CA certificate file to use to verify " "connecting clients"), cfg.StrOpt('cert_file', default=None, help="Certificate file to use when starting " "the server securely"), cfg.StrOpt('key_file', default=None, help="Private key file to use when starting " "the server securely"), ] CONF = cfg.CONF CONF.register_opts(ssl_opts, "ssl") def is_enabled(): cert_file = CONF.ssl.cert_file key_file = CONF.ssl.key_file ca_file = CONF.ssl.ca_file use_ssl = cert_file or key_file if cert_file and not os.path.exists(cert_file): raise RuntimeError(_("Unable to find cert_file : %s") % cert_file) if ca_file and not os.path.exists(ca_file): raise RuntimeError(_("Unable to find ca_file : %s") % ca_file) if key_file and not os.path.exists(key_file): raise RuntimeError(_("Unable to find key_file : %s") % key_file) if use_ssl and (not cert_file or not key_file): raise RuntimeError(_("When running server in SSL mode, you must " "specify both a cert_file and key_file " "option value in your configuration file")) return use_ssl def wrap(sock): ssl_kwargs = { 'server_side': True, 'certfile': CONF.ssl.cert_file, 'keyfile': CONF.ssl.key_file, 'cert_reqs': ssl.CERT_NONE, } if CONF.ssl.ca_file: ssl_kwargs['ca_certs'] = CONF.ssl.ca_file ssl_kwargs['cert_reqs'] = ssl.CERT_REQUIRED return ssl.wrap_socket(sock, **ssl_kwargs) _SSL_PROTOCOLS = { "tlsv1": ssl.PROTOCOL_TLSv1, "sslv23": ssl.PROTOCOL_SSLv23, "sslv3": ssl.PROTOCOL_SSLv3 } try: _SSL_PROTOCOLS["sslv2"] = ssl.PROTOCOL_SSLv2 except AttributeError: pass def validate_ssl_version(version): key = version.lower() try: return _SSL_PROTOCOLS[key] except KeyError: raise RuntimeError(_("Invalid SSL version : %s") % version) ironic-2014.1.rc1/ironic/openstack/common/lockutils.py0000664000175300017540000002337112316614116024041 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2011 OpenStack Foundation. # 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 contextlib import errno import functools import os import shutil import subprocess import sys import tempfile import threading import time import weakref from oslo.config import cfg from ironic.openstack.common import fileutils from ironic.openstack.common.gettextutils import _ # noqa from ironic.openstack.common import local from ironic.openstack.common import log as logging LOG = logging.getLogger(__name__) util_opts = [ cfg.BoolOpt('disable_process_locking', default=False, help='Whether to disable inter-process locks.'), cfg.StrOpt('lock_path', default=os.environ.get("IRONIC_LOCK_PATH"), help=('Directory to use for lock files.')) ] CONF = cfg.CONF CONF.register_opts(util_opts) def set_defaults(lock_path): cfg.set_defaults(util_opts, lock_path=lock_path) class _InterProcessLock(object): """Lock implementation which allows multiple locks, working around issues like bugs.debian.org/cgi-bin/bugreport.cgi?bug=632857 and does not require any cleanup. Since the lock is always held on a file descriptor rather than outside of the process, the lock gets dropped automatically if the process crashes, even if __exit__ is not executed. There are no guarantees regarding usage by multiple green threads in a single process here. This lock works only between processes. Exclusive access between local threads should be achieved using the semaphores in the @synchronized decorator. Note these locks are released when the descriptor is closed, so it's not safe to close the file descriptor while another green thread holds the lock. Just opening and closing the lock file can break synchronisation, so lock files must be accessed only using this abstraction. """ def __init__(self, name): self.lockfile = None self.fname = name def __enter__(self): self.lockfile = open(self.fname, 'w') while True: try: # Using non-blocking locks since green threads are not # patched to deal with blocking locking calls. # Also upon reading the MSDN docs for locking(), it seems # to have a laughable 10 attempts "blocking" mechanism. self.trylock() return self except IOError as e: if e.errno in (errno.EACCES, errno.EAGAIN): # external locks synchronise things like iptables # updates - give it some time to prevent busy spinning time.sleep(0.01) else: raise def __exit__(self, exc_type, exc_val, exc_tb): try: self.unlock() self.lockfile.close() except IOError: LOG.exception(_("Could not release the acquired lock `%s`"), self.fname) def trylock(self): raise NotImplementedError() def unlock(self): raise NotImplementedError() class _WindowsLock(_InterProcessLock): def trylock(self): msvcrt.locking(self.lockfile.fileno(), msvcrt.LK_NBLCK, 1) def unlock(self): msvcrt.locking(self.lockfile.fileno(), msvcrt.LK_UNLCK, 1) class _PosixLock(_InterProcessLock): def trylock(self): fcntl.lockf(self.lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB) def unlock(self): fcntl.lockf(self.lockfile, fcntl.LOCK_UN) if os.name == 'nt': import msvcrt InterProcessLock = _WindowsLock else: import fcntl InterProcessLock = _PosixLock _semaphores = weakref.WeakValueDictionary() _semaphores_lock = threading.Lock() @contextlib.contextmanager def lock(name, lock_file_prefix=None, external=False, lock_path=None): """Context based lock This function yields a `threading.Semaphore` instance (if we don't use eventlet.monkey_patch(), else `semaphore.Semaphore`) unless external is True, in which case, it'll yield an InterProcessLock instance. :param lock_file_prefix: The lock_file_prefix argument is used to provide lock files on disk with a meaningful prefix. :param external: The external keyword argument denotes whether this lock should work across multiple processes. This means that if two different workers both run a a method decorated with @synchronized('mylock', external=True), only one of them will execute at a time. :param lock_path: The lock_path keyword argument is used to specify a special location for external lock files to live. If nothing is set, then CONF.lock_path is used as a default. """ with _semaphores_lock: try: sem = _semaphores[name] except KeyError: sem = threading.Semaphore() _semaphores[name] = sem with sem: LOG.debug(_('Got semaphore "%(lock)s"'), {'lock': name}) # NOTE(mikal): I know this looks odd if not hasattr(local.strong_store, 'locks_held'): local.strong_store.locks_held = [] local.strong_store.locks_held.append(name) try: if external and not CONF.disable_process_locking: LOG.debug(_('Attempting to grab file lock "%(lock)s"'), {'lock': name}) # We need a copy of lock_path because it is non-local local_lock_path = lock_path or CONF.lock_path if not local_lock_path: raise cfg.RequiredOptError('lock_path') if not os.path.exists(local_lock_path): fileutils.ensure_tree(local_lock_path) LOG.info(_('Created lock path: %s'), local_lock_path) def add_prefix(name, prefix): if not prefix: return name sep = '' if prefix.endswith('-') else '-' return '%s%s%s' % (prefix, sep, name) # NOTE(mikal): the lock name cannot contain directory # separators lock_file_name = add_prefix(name.replace(os.sep, '_'), lock_file_prefix) lock_file_path = os.path.join(local_lock_path, lock_file_name) try: lock = InterProcessLock(lock_file_path) with lock as lock: LOG.debug(_('Got file lock "%(lock)s" at %(path)s'), {'lock': name, 'path': lock_file_path}) yield lock finally: LOG.debug(_('Released file lock "%(lock)s" at %(path)s'), {'lock': name, 'path': lock_file_path}) else: yield sem finally: local.strong_store.locks_held.remove(name) def synchronized(name, lock_file_prefix=None, external=False, lock_path=None): """Synchronization decorator. Decorating a method like so:: @synchronized('mylock') def foo(self, *args): ... ensures that only one thread will execute the foo method at a time. Different methods can share the same lock:: @synchronized('mylock') def foo(self, *args): ... @synchronized('mylock') def bar(self, *args): ... This way only one of either foo or bar can be executing at a time. """ def wrap(f): @functools.wraps(f) def inner(*args, **kwargs): try: with lock(name, lock_file_prefix, external, lock_path): LOG.debug(_('Got semaphore / lock "%(function)s"'), {'function': f.__name__}) return f(*args, **kwargs) finally: LOG.debug(_('Semaphore / lock released "%(function)s"'), {'function': f.__name__}) return inner return wrap def synchronized_with_prefix(lock_file_prefix): """Partial object generator for the synchronization decorator. Redefine @synchronized in each project like so:: (in nova/utils.py) from nova.openstack.common import lockutils synchronized = lockutils.synchronized_with_prefix('nova-') (in nova/foo.py) from nova import utils @utils.synchronized('mylock') def bar(self, *args): ... The lock_file_prefix argument is used to provide lock files on disk with a meaningful prefix. """ return functools.partial(synchronized, lock_file_prefix=lock_file_prefix) def main(argv): """Create a dir for locks and pass it to command from arguments If you run this: python -m openstack.common.lockutils python setup.py testr a temporary directory will be created for all your locks and passed to all your tests in an environment variable. The temporary dir will be deleted afterwards and the return value will be preserved. """ lock_dir = tempfile.mkdtemp() os.environ["IRONIC_LOCK_PATH"] = lock_dir try: ret_val = subprocess.call(argv[1:]) finally: shutil.rmtree(lock_dir, ignore_errors=True) return ret_val if __name__ == '__main__': sys.exit(main(sys.argv)) ironic-2014.1.rc1/ironic/openstack/common/periodic_task.py0000664000175300017540000001555512316614116024655 0ustar jenkinsjenkins00000000000000# vim: tabstop=4 shiftwidth=4 softtabstop=4 # # 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 datetime import time from oslo.config import cfg import six from ironic.openstack.common.gettextutils import _ # noqa from ironic.openstack.common import log as logging from ironic.openstack.common import timeutils periodic_opts = [ cfg.BoolOpt('run_external_periodic_tasks', default=True, help=('Some periodic tasks can be run in a separate process. ' 'Should we run them here?')), ] CONF = cfg.CONF CONF.register_opts(periodic_opts) LOG = logging.getLogger(__name__) DEFAULT_INTERVAL = 60.0 class InvalidPeriodicTaskArg(Exception): message = _("Unexpected argument for periodic task creation: %(arg)s.") def periodic_task(*args, **kwargs): """Decorator to indicate that a method is a periodic task. This decorator can be used in two ways: 1. Without arguments '@periodic_task', this will be run on every cycle of the periodic scheduler. 2. With arguments: @periodic_task(spacing=N [, run_immediately=[True|False]]) this will be run on approximately every N seconds. If this number is negative the periodic task will be disabled. If the run_immediately argument is provided and has a value of 'True', the first run of the task will be shortly after task scheduler starts. If run_immediately is omitted or set to 'False', the first time the task runs will be approximately N seconds after the task scheduler starts. """ def decorator(f): # Test for old style invocation if 'ticks_between_runs' in kwargs: raise InvalidPeriodicTaskArg(arg='ticks_between_runs') # Control if run at all f._periodic_task = True f._periodic_external_ok = kwargs.pop('external_process_ok', False) if f._periodic_external_ok and not CONF.run_external_periodic_tasks: f._periodic_enabled = False else: f._periodic_enabled = kwargs.pop('enabled', True) # Control frequency f._periodic_spacing = kwargs.pop('spacing', 0) f._periodic_immediate = kwargs.pop('run_immediately', False) if f._periodic_immediate: f._periodic_last_run = None else: f._periodic_last_run = timeutils.utcnow() return f # NOTE(sirp): The `if` is necessary to allow the decorator to be used with # and without parens. # # In the 'with-parens' case (with kwargs present), this function needs to # return a decorator function since the interpreter will invoke it like: # # periodic_task(*args, **kwargs)(f) # # In the 'without-parens' case, the original function will be passed # in as the first argument, like: # # periodic_task(f) if kwargs: return decorator else: return decorator(args[0]) class _PeriodicTasksMeta(type): def __init__(cls, names, bases, dict_): """Metaclass that allows us to collect decorated periodic tasks.""" super(_PeriodicTasksMeta, cls).__init__(names, bases, dict_) # NOTE(sirp): if the attribute is not present then we must be the base # class, so, go ahead an initialize it. If the attribute is present, # then we're a subclass so make a copy of it so we don't step on our # parent's toes. try: cls._periodic_tasks = cls._periodic_tasks[:] except AttributeError: cls._periodic_tasks = [] try: cls._periodic_last_run = cls._periodic_last_run.copy() except AttributeError: cls._periodic_last_run = {} try: cls._periodic_spacing = cls._periodic_spacing.copy() except AttributeError: cls._periodic_spacing = {} for value in cls.__dict__.values(): if getattr(value, '_periodic_task', False): task = value name = task.__name__ if task._periodic_spacing < 0: LOG.info(_('Skipping periodic task %(task)s because ' 'its interval is negative'), {'task': name}) continue if not task._periodic_enabled: LOG.info(_('Skipping periodic task %(task)s because ' 'it is disabled'), {'task': name}) continue # A periodic spacing of zero indicates that this task should # be run every pass if task._periodic_spacing == 0: task._periodic_spacing = None cls._periodic_tasks.append((name, task)) cls._periodic_spacing[name] = task._periodic_spacing cls._periodic_last_run[name] = task._periodic_last_run @six.add_metaclass(_PeriodicTasksMeta) class PeriodicTasks(object): def run_periodic_tasks(self, context, raise_on_error=False): """Tasks to be run at a periodic interval.""" idle_for = DEFAULT_INTERVAL for task_name, task in self._periodic_tasks: full_task_name = '.'.join([self.__class__.__name__, task_name]) now = timeutils.utcnow() spacing = self._periodic_spacing[task_name] last_run = self._periodic_last_run[task_name] # If a periodic task is _nearly_ due, then we'll run it early if spacing is not None and last_run is not None: due = last_run + datetime.timedelta(seconds=spacing) if not timeutils.is_soon(due, 0.2): idle_for = min(idle_for, timeutils.delta_seconds(now, due)) continue if spacing is not None: idle_for = min(idle_for, spacing) LOG.debug(_("Running periodic task %(full_task_name)s"), {"full_task_name": full_task_name}) self._periodic_last_run[task_name] = timeutils.utcnow() try: task(self, context) except Exception as e: if raise_on_error: raise LOG.exception(_("Error during %(full_task_name)s: %(e)s"), {"full_task_name": full_task_name, "e": e}) time.sleep(0) return idle_for ironic-2014.1.rc1/ironic/openstack/common/test.py0000664000175300017540000000470512316614116023007 0ustar jenkinsjenkins00000000000000# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. # 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. """Common utilities used in testing""" import logging import os import fixtures import testtools _TRUE_VALUES = ('True', 'true', '1', 'yes') _LOG_FORMAT = "%(levelname)8s [%(name)s] %(message)s" class BaseTestCase(testtools.TestCase): def setUp(self): super(BaseTestCase, self).setUp() self._set_timeout() self._fake_output() self._fake_logs() self.useFixture(fixtures.NestedTempfile()) self.useFixture(fixtures.TempHomeDir()) def _set_timeout(self): test_timeout = os.environ.get('OS_TEST_TIMEOUT', 0) try: test_timeout = int(test_timeout) except ValueError: # If timeout value is invalid do not set a timeout. test_timeout = 0 if test_timeout > 0: self.useFixture(fixtures.Timeout(test_timeout, gentle=True)) def _fake_output(self): if os.environ.get('OS_STDOUT_CAPTURE') in _TRUE_VALUES: stdout = self.useFixture(fixtures.StringStream('stdout')).stream self.useFixture(fixtures.MonkeyPatch('sys.stdout', stdout)) if os.environ.get('OS_STDERR_CAPTURE') in _TRUE_VALUES: stderr = self.useFixture(fixtures.StringStream('stderr')).stream self.useFixture(fixtures.MonkeyPatch('sys.stderr', stderr)) def _fake_logs(self): if os.environ.get('OS_DEBUG') in _TRUE_VALUES: level = logging.DEBUG else: level = logging.INFO capture_logs = os.environ.get('OS_LOG_CAPTURE') in _TRUE_VALUES if capture_logs: self.useFixture( fixtures.FakeLogger( format=_LOG_FORMAT, level=level, nuke_handlers=capture_logs, ) ) else: logging.basicConfig(format=_LOG_FORMAT, level=level) ironic-2014.1.rc1/ironic/openstack/__init__.py0000664000175300017540000000000012316614116022257 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/common/0000775000175300017540000000000012316614636017470 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/common/states.py0000664000175300017540000000452712316614116021346 0ustar jenkinsjenkins00000000000000# Copyright (c) 2012 NTT DOCOMO, INC. # Copyright 2010 OpenStack Foundation # 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. """ Mapping of bare metal node states. A node may have empty {} `properties` and `driver_info` in which case, it is said to be "initialized" but "not available", and the state is NOSTATE. When updating `properties`, any data will be rejected if the data fails to be validated by the driver. Any node with non-empty `properties` is said to be "initialized", and the state is INIT. When the driver has received both `properties` and `driver_info`, it will check the power status of the node and update the `power_state` accordingly. If the driver fails to read the power state from the node, it will reject the `driver_info` change, and the state will remain as INIT. If the power status check succeeds, `power_state` will change to one of POWER_ON or POWER_OFF, accordingly. At this point, the power state may be changed via the API, a console may be started, and a tenant may be associated. The `power_state` for a node always represents the current power state. Any power operation sets this to the actual state when done (whether successful or not). It is set to ERROR only when unable to get the power state from a node. When `instance_uuid` is set to a non-empty / non-None value, the node is said to be "associated" with a tenant. An associated node can not be deleted. The `instance_uuid` field may be unset only if the node is in POWER_OFF or ERROR states. """ 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' POWER_ON = 'power on' POWER_OFF = 'power off' REBOOT = 'rebooting' SUSPEND = 'suspended' ironic-2014.1.rc1/ironic/common/image_service.py0000664000175300017540000000466012316614116022643 0ustar jenkinsjenkins00000000000000# Copyright 2010 OpenStack Foundation # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 ironic.openstack.common import importutils from oslo.config import cfg glance_opts = [ cfg.StrOpt('glance_host', default='$my_ip', help='Default glance hostname or IP address.'), cfg.IntOpt('glance_port', default=9292, help='Default glance port.'), cfg.StrOpt('glance_protocol', default='http', help='Default protocol to use when connecting to glance. ' 'Set to https for SSL.'), cfg.StrOpt('glance_api_servers', help='A list of the glance api servers available to ironic. ' 'Prefix with https:// for SSL-based glance API servers. ' 'Format is [hostname|IP]:port.'), cfg.BoolOpt('glance_api_insecure', default=False, help='Allow to perform insecure SSL (https) requests to ' 'glance.'), cfg.IntOpt('glance_num_retries', default=0, help='Number of retries when downloading an image from ' 'glance.'), cfg.StrOpt('auth_strategy', default='keystone', help='Default protocol to use when connecting to glance. ' 'Set to https for SSL.'), ] CONF = cfg.CONF CONF.register_opts(glance_opts, group='glance') def import_versioned_module(version, submodule=None): module = 'ironic.common.glance_service.v%s' % version if submodule: module = '.'.join((module, submodule)) return importutils.import_module(module) def Service(client=None, version=1, context=None): module = import_versioned_module(version, 'image_service') service_class = getattr(module, 'GlanceImageService') return service_class(client, version, context) ironic-2014.1.rc1/ironic/common/paths.py0000664000175300017540000000415412316614116021156 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # Copyright 2012 Red Hat, Inc. # # 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 oslo.config import cfg path_opts = [ cfg.StrOpt('pybasedir', default=os.path.abspath(os.path.join(os.path.dirname(__file__), '../')), help='Directory where the ironic python module is installed.'), cfg.StrOpt('bindir', default='$pybasedir/bin', help='Directory where ironic binaries are installed.'), cfg.StrOpt('state_path', default='$pybasedir', help="Top-level directory for maintaining ironic's state."), ] CONF = cfg.CONF CONF.register_opts(path_opts) def basedir_def(*args): """Return an uninterpolated path relative to $pybasedir.""" return os.path.join('$pybasedir', *args) def bindir_def(*args): """Return an uninterpolated path relative to $bindir.""" return os.path.join('$bindir', *args) def state_path_def(*args): """Return an uninterpolated path relative to $state_path.""" return os.path.join('$state_path', *args) def basedir_rel(*args): """Return a path relative to $pybasedir.""" return os.path.join(CONF.pybasedir, *args) def bindir_rel(*args): """Return a path relative to $bindir.""" return os.path.join(CONF.bindir, *args) def state_path_rel(*args): """Return a path relative to $state_path.""" return os.path.join(CONF.state_path, *args) ironic-2014.1.rc1/ironic/common/hash_ring.py0000664000175300017540000001063312316614116022000 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 array import hashlib import struct from oslo.config import cfg from ironic.common import exception hash_opts = [ cfg.IntOpt('hash_partition_exponent', default=16, help='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 is (2^hash_partition_exponent).'), cfg.IntOpt('hash_distribution_replicas', default=1, help='[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.'), ] CONF = cfg.CONF CONF.register_opts(hash_opts) class HashRing(object): def __init__(self, hosts, replicas=None): """Create a new hash ring across the specified hosts. :param hosts: an iterable of hosts which will be mapped. :param replicas: number of hosts to map to each hash partition, or len(hosts), which ever is lesser. Default: CONF.hash_distribution_replicas """ if replicas is None: replicas = CONF.hash_distribution_replicas try: self.hosts = list(hosts) self.replicas = replicas if replicas <= len(hosts) else len(hosts) except TypeError: raise exception.Invalid( _("Invalid hosts supplied when building HashRing.")) self.partition_shift = 32 - CONF.hash_partition_exponent self.part2host = array.array('H') for p in range(2 ** CONF.hash_partition_exponent): self.part2host.append(p % len(hosts)) def _get_partition(self, data): try: return (struct.unpack_from('>I', hashlib.md5(data).digest())[0] >> self.partition_shift) except TypeError: raise exception.Invalid( _("Invalid data supplied to HashRing.get_hosts.")) def get_hosts(self, data, ignore_hosts=None): """Get the list of hosts which the supplied data maps onto. :param data: A string identifier to be mapped across the ring. :param ignore_hosts: A list of hosts to skip when performing the hash. Useful to temporarily skip down hosts without performing a full rebalance. Default: None. :returns: a list of hosts. The length of this list depends on the number of replicas this `HashRing` was created with. It may be less than this if ignore_hosts is not None. """ host_ids = [] if ignore_hosts is None: ignore_host_ids = [] else: ignore_host_ids = [self.hosts.index(h) for h in ignore_hosts if h in self.hosts] partition = self._get_partition(data) for replica in range(0, self.replicas): if len(host_ids + ignore_host_ids) == len(self.hosts): # prevent infinite loop break while self.part2host[partition] in host_ids + ignore_host_ids: partition += 1 if partition >= len(self.part2host): partition = 0 host_ids.append(self.part2host[partition]) return [self.hosts[h] for h in host_ids] ironic-2014.1.rc1/ironic/common/utils.py0000664000175300017540000003467512316614116021212 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # Copyright 2011 Justin Santa Barbara # Copyright (c) 2012 NTT DOCOMO, INC. # 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. """Utilities and helper functions.""" import contextlib import errno import hashlib import os import random import re import shutil import tempfile import uuid import netaddr from oslo.config import cfg import paramiko import six from ironic.common import exception from ironic.openstack.common import log as logging from ironic.openstack.common import processutils utils_opts = [ cfg.StrOpt('rootwrap_config', default="/etc/ironic/rootwrap.conf", help='Path to the rootwrap configuration file to use for ' 'running commands as root.'), cfg.StrOpt('tempdir', default=None, help='Explicitly specify the temporary working directory.'), ] CONF = cfg.CONF CONF.register_opts(utils_opts) LOG = logging.getLogger(__name__) def _get_root_helper(): return 'sudo ironic-rootwrap %s' % CONF.rootwrap_config def execute(*cmd, **kwargs): """Convenience wrapper around oslo's execute() method.""" if kwargs.get('run_as_root') and not 'root_helper' in kwargs: kwargs['root_helper'] = _get_root_helper() result = processutils.execute(*cmd, **kwargs) LOG.debug(_('Execution completed, command line is "%s"'), ' '.join(cmd)) LOG.debug(_('Command stdout is: "%s"') % result[0]) LOG.debug(_('Command stderr is: "%s"') % result[1]) return result def trycmd(*args, **kwargs): """Convenience wrapper around oslo's trycmd() method.""" if kwargs.get('run_as_root') and not 'root_helper' in kwargs: kwargs['root_helper'] = _get_root_helper() return processutils.trycmd(*args, **kwargs) def ssh_connect(connection): """Method to connect to a remote system using ssh protocol. :param connection: a dict of connection parameters. :returns: paramiko.SSHClient -- an active ssh connection. :raises: SSHConnectFailed """ try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) key_contents = connection.get('key_contents') if key_contents: data = six.moves.StringIO(key_contents) if "BEGIN RSA PRIVATE" in key_contents: pkey = paramiko.RSAKey.from_private_key(data) elif "BEGIN DSA PRIVATE" in key_contents: pkey = paramiko.DSSKey.from_private_key(data) else: # Can't include the key contents - secure material. raise ValueError(_("Invalid private key")) else: pkey = None ssh.connect(connection.get('host'), username=connection.get('username'), password=connection.get('password'), port=connection.get('port', 22), pkey=pkey, key_filename=connection.get('key_filename'), timeout=connection.get('timeout', 10)) # send TCP keepalive packets every 20 seconds ssh.get_transport().set_keepalive(20) except Exception as e: LOG.debug(_("SSH connect failed: %s") % e) raise exception.SSHConnectFailed(host=connection.get('host')) return ssh def generate_uid(topic, size=8): characters = '01234567890abcdefghijklmnopqrstuvwxyz' choices = [random.choice(characters) for _x in range(size)] return '%s-%s' % (topic, ''.join(choices)) def random_alnum(size=32): characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' return ''.join(random.choice(characters) for _ in range(size)) class LazyPluggable(object): """A pluggable backend loaded lazily based on some value.""" def __init__(self, pivot, config_group=None, **backends): self.__backends = backends self.__pivot = pivot self.__backend = None self.__config_group = config_group def __get_backend(self): if not self.__backend: if self.__config_group is None: backend_name = CONF[self.__pivot] else: backend_name = CONF[self.__config_group][self.__pivot] if backend_name not in self.__backends: msg = _('Invalid backend: %s') % backend_name raise exception.IronicException(msg) backend = self.__backends[backend_name] if isinstance(backend, tuple): name = backend[0] fromlist = backend[1] else: name = backend fromlist = backend self.__backend = __import__(name, None, None, fromlist) return self.__backend def __getattr__(self, key): backend = self.__get_backend() return getattr(backend, key) def delete_if_exists(pathname): """delete a file, but ignore file not found error.""" try: os.unlink(pathname) except OSError as e: if e.errno == errno.ENOENT: return else: raise def is_int_like(val): """Check if a value looks like an int.""" try: return str(int(val)) == str(val) except Exception: return False def is_valid_boolstr(val): """Check if the provided string is a valid bool string or not.""" boolstrs = ('true', 'false', 'yes', 'no', 'y', 'n', '1', '0') return str(val).lower() in boolstrs def is_valid_mac(address): """Verify the format of a MAC address. Check if a MAC address is valid and contains six octets. Accepts colon-separated format only. :param address: MAC address to be validated. :returns: True if valid. False if not. """ m = "[0-9a-f]{2}(:[0-9a-f]{2}){5}$" if isinstance(address, six.string_types) and re.match(m, address.lower()): return True return False def validate_and_normalize_mac(address): """Validate a MAC address and return normalized form. Checks whether the supplied MAC address is formally correct and normalize it to all lower case. :param address: MAC address to be validated and normalized. :returns: Normalized and validated MAC address. :raises: InvalidMAC If the MAC address is not valid. """ if not is_valid_mac(address): raise exception.InvalidMAC(mac=address) return address.lower() def is_valid_ipv4(address): """Verify that address represents a valid IPv4 address.""" try: return netaddr.valid_ipv4(address) except Exception: return False def is_valid_ipv6(address): try: return netaddr.valid_ipv6(address) except Exception: return False def is_valid_ipv6_cidr(address): try: str(netaddr.IPNetwork(address, version=6).cidr) return True except Exception: return False def get_shortened_ipv6(address): addr = netaddr.IPAddress(address, version=6) return str(addr.ipv6()) def get_shortened_ipv6_cidr(address): net = netaddr.IPNetwork(address, version=6) return str(net.cidr) def is_valid_cidr(address): """Check if the provided ipv4 or ipv6 address is a valid CIDR address.""" try: # Validate the correct CIDR Address netaddr.IPNetwork(address) except netaddr.core.AddrFormatError: return False except UnboundLocalError: # NOTE(MotoKen): work around bug in netaddr 0.7.5 (see detail in # https://github.com/drkjam/netaddr/issues/2) return False # Prior validation partially verify /xx part # Verify it here ip_segment = address.split('/') if (len(ip_segment) <= 1 or ip_segment[1] == ''): return False return True def get_ip_version(network): """Returns the IP version of a network (IPv4 or IPv6). :raises: AddrFormatError if invalid network. """ if netaddr.IPNetwork(network).version == 6: return "IPv6" elif netaddr.IPNetwork(network).version == 4: return "IPv4" def convert_to_list_dict(lst, label): """Convert a value or list into a list of dicts.""" if not lst: return None if not isinstance(lst, list): lst = [lst] return [{label: x} for x in lst] def sanitize_hostname(hostname): """Return a hostname which conforms to RFC-952 and RFC-1123 specs.""" if isinstance(hostname, six.text_type): hostname = hostname.encode('latin-1', 'ignore') hostname = re.sub('[ _]', '-', hostname) hostname = re.sub('[^\w.-]+', '', hostname) hostname = hostname.lower() hostname = hostname.strip('.-') return hostname def read_cached_file(filename, cache_info, reload_func=None): """Read from a file if it has been modified. :param cache_info: dictionary to hold opaque cache. :param reload_func: optional function to be called with data when file is reloaded due to a modification. :returns: data from file """ mtime = os.path.getmtime(filename) if not cache_info or mtime != cache_info.get('mtime'): LOG.debug(_("Reloading cached file %s") % filename) with open(filename) as fap: cache_info['data'] = fap.read() cache_info['mtime'] = mtime if reload_func: reload_func(cache_info['data']) return cache_info['data'] def file_open(*args, **kwargs): """Open file see built-in file() documentation for more details Note: The reason this is kept in a separate module is to easily be able to provide a stub module that doesn't alter system state at all (for unit tests) """ return file(*args, **kwargs) def hash_file(file_like_object): """Generate a hash for the contents of a file.""" checksum = hashlib.sha1() for chunk in iter(lambda: file_like_object.read(32768), b''): checksum.update(chunk) return checksum.hexdigest() @contextlib.contextmanager def temporary_mutation(obj, **kwargs): """Temporarily set the attr on a particular object to a given value then revert when finished. One use of this is to temporarily set the read_deleted flag on a context object: with temporary_mutation(context, read_deleted="yes"): do_something_that_needed_deleted_objects() """ def is_dict_like(thing): return hasattr(thing, 'has_key') def get(thing, attr, default): if is_dict_like(thing): return thing.get(attr, default) else: return getattr(thing, attr, default) def set_value(thing, attr, val): if is_dict_like(thing): thing[attr] = val else: setattr(thing, attr, val) def delete(thing, attr): if is_dict_like(thing): del thing[attr] else: delattr(thing, attr) NOT_PRESENT = object() old_values = {} for attr, new_value in kwargs.items(): old_values[attr] = get(obj, attr, NOT_PRESENT) set_value(obj, attr, new_value) try: yield finally: for attr, old_value in old_values.items(): if old_value is NOT_PRESENT: delete(obj, attr) else: set_value(obj, attr, old_value) @contextlib.contextmanager def tempdir(**kwargs): tempfile.tempdir = CONF.tempdir tmpdir = tempfile.mkdtemp(**kwargs) try: yield tmpdir finally: try: shutil.rmtree(tmpdir) except OSError as e: LOG.error(_('Could not remove tmpdir: %s'), str(e)) def mkfs(fs, path, label=None): """Format a file or block device :param fs: Filesystem type (examples include 'swap', 'ext3', 'ext4' 'btrfs', etc.) :param path: Path to file or block device to format :param label: Volume label to use """ if fs == 'swap': args = ['mkswap'] else: args = ['mkfs', '-t', fs] #add -F to force no interactive execute on non-block device. if fs in ('ext3', 'ext4'): args.extend(['-F']) if label: if fs in ('msdos', 'vfat'): label_opt = '-n' else: label_opt = '-L' args.extend([label_opt, label]) args.append(path) execute(*args, run_as_root=True) def unlink_without_raise(path): try: os.unlink(path) except OSError as e: if e.errno == errno.ENOENT: return else: LOG.warn(_("Failed to unlink %(path)s, error: %(e)s") % {'path': path, 'e': e}) def rmtree_without_raise(path): try: if os.path.isdir(path): shutil.rmtree(path) except OSError as e: LOG.warn(_("Failed to remove dir %(path)s, error: %(e)s") % {'path': path, 'e': e}) def write_to_file(path, contents): with open(path, 'w') as f: f.write(contents) def create_link_without_raise(source, link): try: os.symlink(source, link) except OSError as e: if e.errno == errno.EEXIST: return else: LOG.warn(_("Failed to create symlink from %(source)s to %(link)s" ", error: %(e)s") % {'source': source, 'link': link, 'e': e}) def safe_rstrip(value, chars=None): """Removes trailing characters from a string if that does not make it empty :param value: A string value that will be stripped. :param chars: Characters to remove. :return: Stripped value. """ if not isinstance(value, six.string_types): LOG.warn(_("Failed to remove trailing character. Returning original " "object. Supplied object is not a string: %s,") % value) return value return value.rstrip(chars) or value def generate_uuid(): return str(uuid.uuid4()) def is_uuid_like(val): """Returns validation of a value as a UUID. For our purposes, a UUID is a canonical form string: aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa """ try: return str(uuid.UUID(val)) == val except (TypeError, ValueError, AttributeError): return False ironic-2014.1.rc1/ironic/common/__init__.py0000664000175300017540000000000012316614116021560 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/common/service.py0000664000175300017540000000550712316614116021502 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright © 2012 eNovance # # Author: Julien Danjou # # 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 socket from oslo.config import cfg from ironic.common import config from ironic.openstack.common import context from ironic.openstack.common import importutils from ironic.openstack.common import log from ironic.openstack.common import periodic_task from ironic.openstack.common.rpc import service as rpc_service service_opts = [ cfg.IntOpt('periodic_interval', default=60, help='Seconds between running periodic tasks.'), cfg.StrOpt('host', default=socket.getfqdn(), help='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.'), ] cfg.CONF.register_opts(service_opts) class PeriodicService(rpc_service.Service, periodic_task.PeriodicTasks): def start(self): super(PeriodicService, self).start() admin_context = context.RequestContext('admin', 'admin', is_admin=True) self.tg.add_dynamic_timer( self.manager.periodic_tasks, periodic_interval_max=cfg.CONF.periodic_interval, context=admin_context) def prepare_service(argv=[]): config.parse_args(argv) cfg.set_defaults(log.log_opts, default_log_levels=['amqplib=WARN', 'qpid.messaging=INFO', 'sqlalchemy=WARN', 'keystoneclient=INFO', 'stevedore=INFO', 'eventlet.wsgi.server=WARN', 'iso8601=WARN', 'paramiko=WARN', ]) log.setup('ironic') def load_manager(manager_modulename, manager_classname, host): manager_module = importutils.import_module(manager_modulename) manager_class = getattr(manager_module, manager_classname) return manager_class(host, manager_module.MANAGER_TOPIC) ironic-2014.1.rc1/ironic/common/context.py0000664000175300017540000000401012316614116021512 0ustar jenkinsjenkins00000000000000# -*- encoding: 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. from ironic.openstack.common import context class RequestContext(context.RequestContext): """Extends security contexts from the OpenStack common library.""" def __init__(self, auth_token=None, domain_id=None, domain_name=None, user=None, tenant=None, is_admin=False, is_public_api=False, read_only=False, show_deleted=False, request_id=None): """Stores several additional request parameters: :param domain_id: The ID of the domain. :param domain_name: The name of the domain. :param is_public_api: Specifies whether the request should be processed without authentication. """ self.is_public_api = is_public_api self.domain_id = domain_id self.domain_name = domain_name super(RequestContext, self).__init__(auth_token=auth_token, user=user, tenant=tenant, is_admin=is_admin, read_only=read_only, show_deleted=show_deleted, request_id=request_id) def to_dict(self): result = {'domain_id': self.domain_id, 'domain_name': self.domain_name, 'is_public_api': self.is_public_api} result.update(super(RequestContext, self).to_dict()) return result ironic-2014.1.rc1/ironic/common/driver_factory.py0000664000175300017540000000613012316614116023055 0ustar jenkinsjenkins00000000000000# Copyright 2013 Red Hat, Inc. # 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 ironic.common import exception from ironic.openstack.common import lockutils from ironic.openstack.common import log from stevedore import dispatch LOG = log.getLogger(__name__) EM_SEMAPHORE = 'extension_manager' def get_driver(driver_name): """Simple method to get a ref to an instance of a driver. Driver loading is handled by the DriverFactory class. This method conveniently wraps that class and returns the actual driver object. :param driver_name: the name of the driver class to load :returns: An instance of a class which implements ironic.drivers.base.BaseDriver :raises: DriverNotFound if the requested driver_name could not be found in the "ironic.drivers" namespace. """ try: factory = DriverFactory() return factory[driver_name].obj except KeyError: raise exception.DriverNotFound(driver_name=driver_name) class DriverFactory(object): """Discover, load and manage the drivers available.""" # NOTE(deva): loading the _extension_manager as a class member will break # stevedore when it loads a driver, because the driver will # import this file (and thus instantiate another factory). # Instead, we instantiate a NameDispatchExtensionManager only # once, the first time DriverFactory.__init__ is called. _extension_manager = None def __init__(self): if not DriverFactory._extension_manager: DriverFactory._init_extension_manager() def __getitem__(self, name): return self._extension_manager[name] # NOTE(deva): Use lockutils to avoid a potential race in eventlet # that might try to create two driver factories. @classmethod @lockutils.synchronized(EM_SEMAPHORE, 'ironic-') def _init_extension_manager(cls): # NOTE(deva): In case multiple greenthreads queue up on this lock # before _extension_manager is initialized, prevent # creation of multiple NameDispatchExtensionManagers. if not cls._extension_manager: cls._extension_manager = \ dispatch.NameDispatchExtensionManager('ironic.drivers', lambda x: True, invoke_on_load=True) @property def names(self): """The list of driver names available.""" return self._extension_manager.names() ironic-2014.1.rc1/ironic/common/images.py0000664000175300017540000002145012316614116021302 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # Copyright (c) 2010 Citrix Systems, Inc. # # 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. """ Handling of VM disk images. """ import os import re from oslo.config import cfg from ironic.common import exception from ironic.common import image_service as service from ironic.common import utils from ironic.openstack.common import fileutils from ironic.openstack.common import log as logging from ironic.openstack.common import strutils LOG = logging.getLogger(__name__) image_opts = [ cfg.BoolOpt('force_raw_images', default=True, help='Force backing images to raw format.'), ] CONF = cfg.CONF CONF.register_opts(image_opts) class QemuImgInfo(object): BACKING_FILE_RE = re.compile((r"^(.*?)\s*\(actual\s+path\s*:" r"\s+(.*?)\)\s*$"), re.I) TOP_LEVEL_RE = re.compile(r"^([\w\d\s\_\-]+):(.*)$") SIZE_RE = re.compile(r"\(\s*(\d+)\s+bytes\s*\)", re.I) def __init__(self, cmd_output=None): details = self._parse(cmd_output or '') self.image = details.get('image') self.backing_file = details.get('backing_file') self.file_format = details.get('file_format') self.virtual_size = details.get('virtual_size') self.cluster_size = details.get('cluster_size') self.disk_size = details.get('disk_size') self.snapshots = details.get('snapshot_list', []) self.encryption = details.get('encryption') def __str__(self): lines = [ 'image: %s' % self.image, 'file_format: %s' % self.file_format, 'virtual_size: %s' % self.virtual_size, 'disk_size: %s' % self.disk_size, 'cluster_size: %s' % self.cluster_size, 'backing_file: %s' % self.backing_file, ] if self.snapshots: lines.append("snapshots: %s" % self.snapshots) return "\n".join(lines) def _canonicalize(self, field): # Standardize on underscores/lc/no dash and no spaces # since qemu seems to have mixed outputs here... and # this format allows for better integration with python # - ie for usage in kwargs and such... field = field.lower().strip() return re.sub('[ -]', '_', field) def _extract_bytes(self, details): # Replace it with the byte amount real_size = self.SIZE_RE.search(details) if real_size: details = real_size.group(1) try: details = strutils.to_bytes(details) except (TypeError): pass return details def _extract_details(self, root_cmd, root_details, lines_after): real_details = root_details if root_cmd == 'backing_file': # Replace it with the real backing file backing_match = self.BACKING_FILE_RE.match(root_details) if backing_match: real_details = backing_match.group(2).strip() elif root_cmd in ['virtual_size', 'cluster_size', 'disk_size']: # Replace it with the byte amount (if we can convert it) real_details = self._extract_bytes(root_details) elif root_cmd == 'file_format': real_details = real_details.strip().lower() elif root_cmd == 'snapshot_list': # Next line should be a header, starting with 'ID' if not lines_after or not lines_after[0].startswith("ID"): msg = _("Snapshot list encountered but no header found!") raise ValueError(msg) del lines_after[0] real_details = [] # This is the sprintf pattern we will try to match # "%-10s%-20s%7s%20s%15s" # ID TAG VM SIZE DATE VM CLOCK (current header) while lines_after: line = lines_after[0] line_pieces = line.split() if len(line_pieces) != 6: break # Check against this pattern in the final position # "%02d:%02d:%02d.%03d" date_pieces = line_pieces[5].split(":") if len(date_pieces) != 3: break real_details.append({ 'id': line_pieces[0], 'tag': line_pieces[1], 'vm_size': line_pieces[2], 'date': line_pieces[3], 'vm_clock': line_pieces[4] + " " + line_pieces[5], }) del lines_after[0] return real_details def _parse(self, cmd_output): # Analysis done of qemu-img.c to figure out what is going on here # Find all points start with some chars and then a ':' then a newline # and then handle the results of those 'top level' items in a separate # function. # # TODO(harlowja): newer versions might have a json output format # we should switch to that whenever possible. # see: http://bit.ly/XLJXDX contents = {} lines = [x for x in cmd_output.splitlines() if x.strip()] while lines: line = lines.pop(0) top_level = self.TOP_LEVEL_RE.match(line) if top_level: root = self._canonicalize(top_level.group(1)) if not root: continue root_details = top_level.group(2).strip() details = self._extract_details(root, root_details, lines) contents[root] = details return contents def qemu_img_info(path): """Return an object containing the parsed output from qemu-img info.""" if not os.path.exists(path): return QemuImgInfo() out, err = utils.execute('env', 'LC_ALL=C', 'LANG=C', 'qemu-img', 'info', path) return QemuImgInfo(out) def convert_image(source, dest, out_format, run_as_root=False): """Convert image to other format.""" cmd = ('qemu-img', 'convert', '-O', out_format, source, dest) utils.execute(*cmd, run_as_root=run_as_root) def fetch(context, image_href, path, image_service=None): # TODO(vish): Improve context handling and add owner and auth data # when it is added to glance. Right now there is no # auth checking in glance, so we assume that access was # checked before we got here. if not image_service: image_service = service.Service(version=1, context=context) with fileutils.remove_path_on_error(path): with open(path, "wb") as image_file: image_service.download(image_href, image_file) def fetch_to_raw(context, image_href, path, image_service=None): path_tmp = "%s.part" % path fetch(context, image_href, path_tmp, image_service) image_to_raw(image_href, path, path_tmp) def image_to_raw(image_href, path, path_tmp): with fileutils.remove_path_on_error(path_tmp): data = qemu_img_info(path_tmp) fmt = data.file_format if fmt is None: raise exception.ImageUnacceptable( reason=_("'qemu-img info' parsing failed."), image_id=image_href) backing_file = data.backing_file if backing_file is not None: raise exception.ImageUnacceptable(image_id=image_href, reason=_("fmt=%(fmt)s backed by: %(backing_file)s") % {'fmt': fmt, 'backing_file': backing_file}) if fmt != "raw" and CONF.force_raw_images: staged = "%s.converted" % path LOG.debug(_("%(image)s was %(format)s, converting to raw") % {'image': image_href, 'format': fmt}) with fileutils.remove_path_on_error(staged): convert_image(path_tmp, staged, 'raw') os.unlink(path_tmp) data = qemu_img_info(staged) if data.file_format != "raw": raise exception.ImageConvertFailed(image_id=image_href, reason=_("Converted to raw, but format is now %s") % data.file_format) os.rename(staged, path) else: os.rename(path_tmp, path) ironic-2014.1.rc1/ironic/common/policy.py0000664000175300017540000000364712316614116021344 0ustar jenkinsjenkins00000000000000# Copyright (c) 2011 OpenStack Foundation # 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. """Policy Engine For Ironic.""" import os.path from oslo.config import cfg from ironic.common import exception from ironic.common import utils from ironic.openstack.common.gettextutils import _ from ironic.openstack.common import policy policy_opts = [ cfg.StrOpt('policy_file', default='policy.json', help=_('JSON file representing policy.')), cfg.StrOpt('policy_default_rule', default='default', help=_('Rule checked when requested rule is not found.')), ] CONF = cfg.CONF CONF.register_opts(policy_opts) _POLICY_PATH = None _POLICY_CACHE = {} def reset(): global _POLICY_PATH global _POLICY_CACHE _POLICY_PATH = None _POLICY_CACHE = {} policy.reset() def init(): global _POLICY_PATH global _POLICY_CACHE if not _POLICY_PATH: _POLICY_PATH = CONF.policy_file if not os.path.exists(_POLICY_PATH): _POLICY_PATH = CONF.find_file(_POLICY_PATH) if not _POLICY_PATH: raise exception.ConfigNotFound(path=CONF.policy_file) utils.read_cached_file(_POLICY_PATH, _POLICY_CACHE, reload_func=_set_rules) def _set_rules(data): default_rule = CONF.policy_default_rule policy.set_rules(policy.Rules.load_json(data, default_rule)) ironic-2014.1.rc1/ironic/common/keystone.py0000664000175300017540000000512612316614116021700 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. from keystoneclient import exceptions as ksexception from oslo.config import cfg from six.moves.urllib import parse from ironic.api import acl from ironic.common import exception CONF = cfg.CONF acl.register_opts(CONF) def get_service_url(service_type='baremetal', endpoint_type='internal'): """Wrapper for get service url from keystone service catalog.""" auth_url = CONF.keystone_authtoken.auth_uri if not auth_url: raise exception.CatalogFailure(_('Keystone API endpoint is missing')) api_v3 = CONF.keystone_authtoken.auth_version == 'v3.0' or \ 'v3' in parse.urlparse(auth_url).path if api_v3: from keystoneclient.v3 import client else: from keystoneclient.v2_0 import client api_version = 'v3' if api_v3 else 'v2.0' # NOTE(lucasagomes): Get rid of the trailing '/' otherwise urljoin() # fails to override the version in the URL auth_url = parse.urljoin(auth_url.rstrip('/'), api_version) try: ksclient = client.Client(username=CONF.keystone_authtoken.admin_user, password=CONF.keystone_authtoken.admin_password, tenant_name=CONF.keystone_authtoken.admin_tenant_name, auth_url=auth_url) except ksexception.Unauthorized: raise exception.CatalogUnauthorized except ksexception.AuthorizationFailure as err: raise exception.CatalogFailure(_('Could not perform authorization ' 'process for service catalog: %s') % err) if not ksclient.has_service_catalog(): raise exception.CatalogFailure(_('No keystone service catalog loaded')) try: endpoint = ksclient.service_catalog.url_for(service_type=service_type, endpoint_type=endpoint_type) except ksexception.EndpointNotFound: raise exception.CatalogNotFound(service_type=service_type, endpoint_type=endpoint_type) return endpoint ironic-2014.1.rc1/ironic/common/config.py0000664000175300017540000000215012316614116021276 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # Copyright 2012 Red Hat, Inc. # # 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 ironic.openstack.common import rpc from ironic import version def parse_args(argv, default_config_files=None): rpc.set_defaults(control_exchange='ironic') cfg.CONF(argv[1:], project='ironic', version=version.version_info.release_string(), default_config_files=default_config_files) ironic-2014.1.rc1/ironic/common/neutron.py0000664000175300017540000001016612316614116021531 0ustar jenkinsjenkins00000000000000# # Copyright 2014 OpenStack Foundation # 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 neutronclient.common import exceptions as neutron_client_exc from neutronclient.v2_0 import client as clientv20 from oslo.config import cfg from ironic.api import acl from ironic.common import exception from ironic.common import keystone from ironic.openstack.common import log as logging neutron_opts = [ cfg.StrOpt('url', default='http://127.0.0.1:9696', help='URL for connecting to neutron.'), cfg.IntOpt('url_timeout', default=30, help='Timeout value for connecting to neutron in seconds.'), ] CONF = cfg.CONF CONF.register_opts(neutron_opts, group='neutron') acl.register_opts(CONF) LOG = logging.getLogger(__name__) class NeutronAPI(object): """API for communicating to neutron 2.x API.""" def __init__(self, context): self.context = context self.client = None params = { 'timeout': CONF.neutron.url_timeout, 'insecure': CONF.keystone_authtoken.insecure, 'ca_cert': CONF.keystone_authtoken.certfile, } if context.auth_token is None: params['endpoint_url'] = (CONF.neutron.url or keystone.get_service_url('neutron')) params['username'] = CONF.keystone_authtoken.admin_user params['tenant_name'] = CONF.keystone_authtoken.admin_tenant_name params['password'] = CONF.keystone_authtoken.admin_password params['auth_url'] = (CONF.keystone_authtoken.auth_uri or '') else: params['token'] = context.auth_token params['endpoint_url'] = CONF.neutron.url params['auth_strategy'] = None self.client = clientv20.Client(**params) def update_port_dhcp_opts(self, port_id, dhcp_options): """Update a port's attributes. Update one or more DHCP options on the specified port. For the relevant API spec, see http://docs.openstack.org/api/openstack-network/2.0/content/extra-dhc-opt-ext-update.html # noqa :param port_id: designate which port these attributes will be applied to. :param dhcp_options: this will be a list of dicts, e.g. [{'opt_name': 'bootfile-name', 'opt_value': 'pxelinux.0'}, {'opt_name': 'server-ip-address', 'opt_value': '123.123.123.456'}, {'opt_name': 'tftp-server', 'opt_value': '123.123.123.123'}] :raises: FailedToUpdateDHCPOptOnPort """ port_req_body = {'port': {'extra_dhcp_opts': dhcp_options}} try: self.client.update_port(port_id, port_req_body) except neutron_client_exc.NeutronClientException: LOG.exception(_("Failed to update Neutron port %s."), port_id) raise exception.FailedToUpdateDHCPOptOnPort(port_id=port_id) def update_port_address(self, port_id, address): """Update a port's mac address. :param port_id: Neutron port id. :param address: new MAC address. :raises: FailedToUpdateMacOnPort """ port_req_body = {'port': {'mac_address': address}} try: self.client.update_port(port_id, port_req_body) except neutron_client_exc.NeutronClientException: LOG.exception(_("Failed to update MAC address on Neutron port %s." ), port_id) raise exception.FailedToUpdateMacOnPort(port_id=port_id) ironic-2014.1.rc1/ironic/common/glance_service/0000775000175300017540000000000012316614636022441 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/common/glance_service/service_utils.py0000664000175300017540000001556712316614116025702 0ustar jenkinsjenkins00000000000000# Copyright 2012 OpenStack Foundation # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 copy import logging from oslo.config import cfg import six import six.moves.urllib.parse as urlparse from ironic.common import exception from ironic.openstack.common import jsonutils from ironic.openstack.common import timeutils CONF = cfg.CONF LOG = logging.getLogger(__name__) def generate_glance_url(): """Generate the URL to glance.""" return "%s://%s:%d" % (CONF.glance.glance_protocol, CONF.glance.glance_host, CONF.glance.glance_port) def generate_image_url(image_ref): """Generate an image URL from an image_ref.""" return "%s/images/%s" % (generate_glance_url(), image_ref) def _extract_attributes(image): IMAGE_ATTRIBUTES = ['size', 'disk_format', 'owner', 'container_format', 'checksum', 'id', 'name', 'created_at', 'updated_at', 'deleted_at', 'deleted', 'status', 'min_disk', 'min_ram', 'is_public'] IMAGE_ATTRIBUTES_V2 = ['tags', 'visibility', 'protected', 'file', 'schema'] output = {} for attr in IMAGE_ATTRIBUTES: output[attr] = getattr(image, attr, None) output['properties'] = getattr(image, 'properties', {}) if hasattr(image, 'schema') and 'v2' in image['schema']: IMAGE_ATTRIBUTES = IMAGE_ATTRIBUTES + IMAGE_ATTRIBUTES_V2 for attr in IMAGE_ATTRIBUTES_V2: output[attr] = getattr(image, attr, None) output['schema'] = image['schema'] for image_property in set(image.keys()) - set(IMAGE_ATTRIBUTES): output['properties'][image_property] = image[image_property] return output def _convert_timestamps_to_datetimes(image_meta): """Returns image with timestamp fields converted to datetime objects.""" for attr in ['created_at', 'updated_at', 'deleted_at']: if image_meta.get(attr): image_meta[attr] = timeutils.parse_isotime(image_meta[attr]) return image_meta _CONVERT_PROPS = ('block_device_mapping', 'mappings') def _convert(metadata, method): metadata = copy.deepcopy(metadata) properties = metadata.get('properties') if properties: for attr in _CONVERT_PROPS: if attr in properties: prop = properties[attr] if method == 'from': if isinstance(prop, six.string_types): properties[attr] = jsonutils.loads(prop) if method == 'to': if not isinstance(prop, six.string_types): properties[attr] = jsonutils.dumps(prop) return metadata def _remove_read_only(image_meta): IMAGE_ATTRIBUTES = ['status', 'updated_at', 'created_at', 'deleted_at'] output = copy.deepcopy(image_meta) for attr in IMAGE_ATTRIBUTES: if attr in output: del output[attr] return output def _get_api_server(): """Shuffle a list of CONF.glance_api_servers and return an iterator that will cycle through the list, looping around to the beginning if necessary. """ api_server = CONF.glance.glance_api_servers or \ CONF.glance.glance_host + ':' + str(CONF.glance.glance_port) if '//' not in api_server: api_server = 'http://' + api_server url = urlparse.urlparse(api_server) port = url.port or 80 host = url.netloc.split(':', 1)[0] use_ssl = (url.scheme == 'https') return host, port, use_ssl def parse_image_ref(image_href): """Parse an image href into composite parts. :param image_href: href of an image :returns: a tuple of the form (image_id, host, port) :raises ValueError """ if '/' not in str(image_href): image_id = image_href (glance_host, glance_port, use_ssl) = _get_api_server() return (image_id, glance_host, glance_port, use_ssl) else: try: url = urlparse.urlparse(image_href) if url.scheme == 'glance': (glance_host, glance_port, use_ssl) = _get_api_server() image_id = image_href.split('/')[-1] else: glance_port = url.port or 80 glance_host = url.netloc.split(':', 1)[0] image_id = url.path.split('/')[-1] use_ssl = (url.scheme == 'https') return (image_id, glance_host, glance_port, use_ssl) except ValueError: raise exception.InvalidImageRef(image_href=image_href) def extract_query_params(params, version): _params = {} accepted_params = ('filters', 'marker', 'limit', 'sort_key', 'sort_dir') for param in accepted_params: if params.get(param): _params[param] = params.get(param) # ensure filters is a dict _params.setdefault('filters', {}) # NOTE(vish): don't filter out private images # NOTE(ghe): in v2, not passing any visibility doesn't filter prvate images if version == 1: _params['filters'].setdefault('is_public', 'none') return _params def translate_to_glance(image_meta): image_meta = _convert(image_meta, 'to') image_meta = _remove_read_only(image_meta) return image_meta def translate_from_glance(image): image_meta = _extract_attributes(image) image_meta = _convert_timestamps_to_datetimes(image_meta) image_meta = _convert(image_meta, 'from') return image_meta def is_image_available(context, image): """Check image availability. This check is needed in case Nova and Glance are deployed without authentication turned on. """ # The presence of an auth token implies this is an authenticated # request and we need not handle the noauth use-case. if hasattr(context, 'auth_token') and context.auth_token: return True if image.is_public or context.is_admin: return True properties = image.properties if context.project_id and ('owner_id' in properties): return str(properties['owner_id']) == str(context.project_id) if context.project_id and ('project_id' in properties): return str(properties['project_id']) == str(context.project_id) try: user_id = properties['user_id'] except KeyError: return False return str(user_id) == str(context.user_id) ironic-2014.1.rc1/ironic/common/glance_service/base_image_service.py0000664000175300017540000002564212316614116026611 0ustar jenkinsjenkins00000000000000# Copyright 2010 OpenStack Foundation # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 functools import logging import shutil import sys import time from glanceclient import client import six.moves.urllib.parse as urlparse from ironic.common import exception from ironic.common.glance_service import service_utils from oslo.config import cfg LOG = logging.getLogger(__name__) CONF = cfg.CONF def _translate_image_exception(image_id, exc_value): if isinstance(exc_value, (exception.Forbidden, exception.Unauthorized)): return exception.ImageNotAuthorized(image_id=image_id) if isinstance(exc_value, exception.NotFound): return exception.ImageNotFound(image_id=image_id) if isinstance(exc_value, exception.BadRequest): return exception.Invalid(exc_value) return exc_value def _translate_plain_exception(exc_value): if isinstance(exc_value, (exception.Forbidden, exception.Unauthorized)): return exception.NotAuthorized(exc_value) if isinstance(exc_value, exception.NotFound): return exception.NotFound(exc_value) if isinstance(exc_value, exception.BadRequest): return exception.Invalid(exc_value) return exc_value def check_image_service(func): """Creates a glance client if doesn't exists and calls the function.""" @functools.wraps(func) def wrapper(self, *args, **kwargs): """wrapper around methods calls :param image_href: href that describes the location of an image """ if self.client: return func(self, *args, **kwargs) image_href = kwargs.get('image_href') (image_id, self.glance_host, self.glance_port, use_ssl) = service_utils.parse_image_ref(image_href) if use_ssl: scheme = 'https' else: scheme = 'http' params = {} params['insecure'] = CONF.glance.glance_api_insecure if CONF.glance.auth_strategy == 'keystone': params['token'] = self.context.auth_token endpoint = '%s://%s:%s' % (scheme, self.glance_host, self.glance_port) self.client = client.Client(self.version, endpoint, **params) return func(self, *args, **kwargs) return wrapper class BaseImageService(object): def __init__(self, client=None, version=1, context=None): self.client = client self.version = version self.context = context def call(self, method, *args, **kwargs): """Call a glance client method. If we get a connection error, retry the request according to CONF.glance_num_retries. :param context: The request context, for access checks. :param version: The requested API version.v :param method: The method requested to be called. :param args: A list of positional arguments for the method called :param kwargs: A dict of keyword arguments for the method called :raises: GlanceConnectionFailed """ retry_excs = (exception.ServiceUnavailable, exception.InvalidEndpoint, exception.CommunicationError) image_excs = (exception.Forbidden, exception.Unauthorized, exception.NotFound, exception.BadRequest) num_attempts = 1 + CONF.glance.glance_num_retries for attempt in range(1, num_attempts + 1): try: return getattr(self.client.images, method)(*args, **kwargs) except retry_excs as e: host = self.glance_host port = self.glance_port extra = "retrying" error_msg = _("Error contacting glance server " "'%(host)s:%(port)s' for '%(method)s', " "%(extra)s.") if attempt == num_attempts: extra = 'done trying' LOG.exception(error_msg, {'host': host, 'port': port, 'num_attempts': num_attempts, 'method': method, 'extra': extra}) raise exception.GlanceConnectionFailed(host=host, port=port, reason=str(e)) LOG.exception(error_msg, {'host': host, 'port': port, 'num_attempts': num_attempts, 'attempt': attempt, 'method': method, 'extra': extra}) time.sleep(1) except image_excs as e: exc_type, exc_value, exc_trace = sys.exc_info() if method == 'list': new_exc = _translate_plain_exception( exc_value) else: new_exc = _translate_image_exception( args[0], exc_value) raise new_exc, None, exc_trace @check_image_service def _detail(self, method='list', **kwargs): """Calls out to Glance for a list of detailed image information. :returns: A list of dicts containing image metadata. """ LOG.debug(_("Getting a full list of images metadata from glance.")) params = service_utils.extract_query_params(kwargs, self.version) images = self.call(method, **params) _images = [] for image in images: if service_utils.is_image_available(self.context, image): _images.append(service_utils.translate_from_glance(image)) return _images @check_image_service def _show(self, image_href, method='get'): """Returns a dict with image data for the given opaque image id. :param image_id: The opaque image identifier. :returns: A dict containing image metadata. :raises: ImageNotFound """ LOG.debug(_("Getting image metadata from glance. Image: %s") % image_href) (image_id, self.glance_host, self.glance_port, use_ssl) = service_utils.parse_image_ref(image_href) image = self.call(method, image_id) if not service_utils.is_image_available(self.context, image): raise exception.ImageNotFound(image_id=image_id) base_image_meta = service_utils.translate_from_glance(image) return base_image_meta @check_image_service def _download(self, image_id, data=None, method='data'): """Calls out to Glance for data and writes data. :param image_id: The opaque image identifier. :param data: (Optional) File object to write data to. """ (image_id, self.glance_host, self.glance_port, use_ssl) = service_utils.parse_image_ref(image_id) if self.version == 2 \ and 'file' in CONF.glance.allowed_direct_url_schemes: location = self._get_location(image_id) url = urlparse.urlparse(location) if url.scheme == "file": with open(url.path, "r") as f: #TODO(ghe): Use system call for downloading files. # Bug #1199522 # FIXME(jbresnah) a system call to cp could have # significant performance advantages, however we # do not have the path to files at this point in # the abstraction. shutil.copyfileobj(f, data) return image_chunks = self.call(method, image_id) if data is None: return image_chunks else: for chunk in image_chunks: data.write(chunk) @check_image_service def _create(self, image_meta, data=None, method='create'): """Store the image data and return the new image object. :param image_meta: A dict containing image metadata :param data: (Optional) File object to create image from. :returns: dict -- New created image metadata """ sent_service_image_meta = service_utils.translate_to_glance(image_meta) #TODO(ghe): Allow copy-from or location headers Bug #1199532 if data: sent_service_image_meta['data'] = data recv_service_image_meta = self.call(method, **sent_service_image_meta) return service_utils.translate_from_glance(recv_service_image_meta) @check_image_service def _update(self, image_id, image_meta, data=None, method='update', purge_props=False): """Modify the given image with the new data. :param image_id: The opaque image identifier. :param data: (Optional) File object to update data from. :param purge_props: (Optional=False) Purge existing properties. :returns: dict -- New created image metadata """ (image_id, self.glance_host, self.glance_port, use_ssl) = service_utils.parse_image_ref(image_id) if image_meta: image_meta = service_utils.translate_to_glance(image_meta) else: image_meta = {} if self.version == 1: image_meta['purge_props'] = purge_props if data: image_meta['data'] = data #NOTE(bcwaldon): id is not an editable field, but it is likely to be # passed in by calling code. Let's be nice and ignore it. image_meta.pop('id', None) image_meta = self.call(method, image_id, **image_meta) if self.version == 2 and data: self.call('upload', image_id, data) image_meta = self._show(image_id) return image_meta @check_image_service def _delete(self, image_id, method='delete'): """Delete the given image. :param image_id: The opaque image identifier. :raises: ImageNotFound if the image does not exist. :raises: NotAuthorized if the user is not an owner. :raises: ImageNotAuthorized if the user is not authorized. """ (image_id, glance_host, glance_port, use_ssl) = service_utils.parse_image_ref(image_id) self.call(method, image_id) ironic-2014.1.rc1/ironic/common/glance_service/__init__.py0000664000175300017540000000000012316614116024531 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/common/glance_service/service.py0000664000175300017540000000513412316614116024447 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 abc import six @six.add_metaclass(abc.ABCMeta) class ImageService(object): """Provides storage and retrieval of disk image objects within Glance.""" @abc.abstractmethod def __init__(self): """Constructor.""" @abc.abstractmethod def detail(self): """Calls out to Glance for a list of detailed image information.""" @abc.abstractmethod def show(self, image_id): """Returns a dict with image data for the given opaque image id. :param image_id: The opaque image identifier. :returns: A dict containing image metadata. :raises: ImageNotFound """ @abc.abstractmethod def download(self, image_id, data=None): """Calls out to Glance for data and writes data. :param image_id: The opaque image identifier. :param data: (Optional) File object to write data to. """ @abc.abstractmethod def create(self, image_meta, data=None): """Store the image data and return the new image object. :param image_meta: A dict containing image metadata :param data: (Optional) File object to create image from. :returns: dict -- New created image metadata """ @abc.abstractmethod def update(self, image_id, image_meta, data=None, purge_props=False): """Modify the given image with the new data. :param image_id: The opaque image identifier. :param data: (Optional) File object to update data from. :param purge_props: (Optional=True) Purge existing properties. :returns: dict -- New created image metadata """ @abc.abstractmethod def delete(self, image_id): """Delete the given image. :param image_id: The opaque image identifier. :raises: ImageNotFound if the image does not exist. :raises: NotAuthorized if the user is not an owner. :raises: ImageNotAuthorized if the user is not authorized. """ ironic-2014.1.rc1/ironic/common/glance_service/v2/0000775000175300017540000000000012316614636022770 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/common/glance_service/v2/image_service.py0000664000175300017540000000500512316614116026135 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 ironic.common import exception as exc from ironic.common.glance_service import base_image_service from ironic.common.glance_service import service from ironic.common.glance_service import service_utils glance_opts = [ cfg.ListOpt('allowed_direct_url_schemes', default=[], help='A list of URL schemes that can be downloaded directly ' 'via the direct_url. Currently supported schemes: ' '[file].') ] CONF = cfg.CONF CONF.register_opts(glance_opts, group='glance') class GlanceImageService(base_image_service.BaseImageService, service.ImageService): def detail(self, **kwargs): return self._detail(method='list', **kwargs) def show(self, image_id): return self._show(image_id, method='get') def download(self, image_id, data=None): return self._download(image_id, method='data', data=data) def create(self, image_meta, data=None): image_id = self._create(image_meta, method='create', data=None)['id'] return self.update(image_id, None, data) def update(self, image_id, image_meta, data=None, purge_props=False): # NOTE(ghe): purge_props not working until bug 1206472 solved return self._update(image_id, image_meta, data, method='update', purge_props=False) def delete(self, image_id): return self._delete(image_id, method='delete') def _get_location(self, image_id): """Returns the direct url representing the backend storage location, or None if this attribute is not shown by Glance. """ image_meta = self.call('get', image_id) if not service_utils.is_image_available(self.context, image_meta): raise exc.ImageNotFound(image_id=image_id) return getattr(image_meta, 'direct_url', None) ironic-2014.1.rc1/ironic/common/glance_service/v2/__init__.py0000664000175300017540000000000012316614116025060 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/common/glance_service/v1/0000775000175300017540000000000012316614636022767 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/common/glance_service/v1/image_service.py0000664000175300017540000000303612316614116026136 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 ironic.common.glance_service import base_image_service from ironic.common.glance_service import service class GlanceImageService(base_image_service.BaseImageService, service.ImageService): def detail(self, **kwargs): return self._detail(method='list', **kwargs) def show(self, image_id): return self._show(image_id, method='get') def download(self, image_id, data=None): return self._download(image_id, method='data', data=data) def create(self, image_meta, data=None): return self._create(image_meta, method='create', data=data) def update(self, image_id, image_meta, data=None, purge_props=False): return self._update(image_id, image_meta, data=data, method='update', purge_props=purge_props) def delete(self, image_id): return self._delete(image_id, method='delete') ironic-2014.1.rc1/ironic/common/glance_service/v1/__init__.py0000664000175300017540000000000012316614116025057 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/common/safe_utils.py0000664000175300017540000000401512316614116022171 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # Copyright 2011 Justin Santa Barbara # 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. """Utilities and helper functions that won't produce circular imports.""" import inspect def getcallargs(function, *args, **kwargs): """This is a simplified inspect.getcallargs (2.7+). It should be replaced when python >= 2.7 is standard. """ keyed_args = {} argnames, varargs, keywords, defaults = inspect.getargspec(function) keyed_args.update(kwargs) #NOTE(alaski) the implicit 'self' or 'cls' argument shows up in # argnames but not in args or kwargs. Uses 'in' rather than '==' because # some tests use 'self2'. if 'self' in argnames[0] or 'cls' == argnames[0]: # The function may not actually be a method or have __self__. # Typically seen when it's stubbed with mox. if inspect.ismethod(function) and hasattr(function, '__self__'): keyed_args[argnames[0]] = function.__self__ else: keyed_args[argnames[0]] = None remaining_argnames = filter(lambda x: x not in keyed_args, argnames) keyed_args.update(dict(zip(remaining_argnames, args))) if defaults: num_defaults = len(defaults) for argname, value in zip(argnames[-num_defaults:], defaults): if argname not in keyed_args: keyed_args[argname] = value return keyed_args ironic-2014.1.rc1/ironic/common/exception.py0000664000175300017540000002245612316614116022042 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # 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. """Ironic base exception handling. Includes decorator for re-raising Ironic-type exceptions. SHOULD include dedicated exception logging. """ from oslo.config import cfg import six from ironic.openstack.common.gettextutils import _ from ironic.openstack.common import log as logging LOG = logging.getLogger(__name__) exc_log_opts = [ cfg.BoolOpt('fatal_exception_format_errors', default=False, help='Make exception message format errors fatal.'), ] CONF = cfg.CONF CONF.register_opts(exc_log_opts) def _cleanse_dict(original): """Strip all admin_password, new_pass, rescue_pass keys from a dict.""" return dict((k, v) for k, v in original.iteritems() if not "_pass" in k) class IronicException(Exception): """Base Ironic Exception To correctly use this class, inherit from it and define a 'message' property. That message will get printf'd with the keyword arguments provided to the constructor. """ message = _("An unknown exception occurred.") code = 500 headers = {} safe = False def __init__(self, message=None, **kwargs): self.kwargs = kwargs if 'code' not in self.kwargs: try: self.kwargs['code'] = self.code except AttributeError: pass if not message: try: message = self.message % kwargs except Exception as e: # kwargs doesn't match a variable in the message # log the issue and the kwargs LOG.exception(_('Exception in string format operation')) for name, value in kwargs.iteritems(): LOG.error("%s: %s" % (name, value)) if CONF.fatal_exception_format_errors: raise e else: # at least get the core message out if something happened message = self.message super(IronicException, self).__init__(message) def format_message(self): if self.__class__.__name__.endswith('_Remote'): return self.args[0] else: return six.text_type(self) class NotAuthorized(IronicException): message = _("Not authorized.") code = 403 class OperationNotPermitted(NotAuthorized): message = _("Operation not permitted.") class Invalid(IronicException): message = _("Unacceptable parameters.") code = 400 class Conflict(IronicException): message = _('Conflict.') code = 409 class TemporaryFailure(IronicException): message = _("Resource temporarily unavailable, please retry.") code = 503 class InvalidState(Conflict): message = _("Invalid resource state.") class MACAlreadyExists(Conflict): message = _("A Port with MAC address %(mac)s already exists.") class InvalidUUID(Invalid): message = _("Expected a uuid but received %(uuid)s.") class InvalidIdentity(Invalid): message = _("Expected an uuid or int but received %(identity)s.") class InvalidMAC(Invalid): message = _("Expected a MAC address but received %(mac)s.") class InvalidStateRequested(Invalid): message = _("Invalid state '%(state)s' requested for node %(node)s.") class PatchError(Invalid): message = _("Couldn't apply patch '%(patch)s'. Reason: %(reason)s") class InstanceDeployFailure(IronicException): message = _("Failed to deploy instance: %(reason)s") class ImageUnacceptable(IronicException): message = _("Image %(image_id)s is unacceptable: %(reason)s") class ImageConvertFailed(IronicException): message = _("Image %(image_id)s is unacceptable: %(reason)s") # Cannot be templated as the error syntax varies. # msg needs to be constructed when raised. class InvalidParameterValue(Invalid): message = _("%(err)s") class NotFound(IronicException): message = _("Resource could not be found.") code = 404 class DriverNotFound(NotFound): message = _("Failed to load driver %(driver_name)s.") class ImageNotFound(NotFound): message = _("Image %(image_id)s could not be found.") class NoValidHost(NotFound): message = _("No valid host was found. Reason: %(reason)s") class InstanceNotFound(NotFound): message = _("Instance %(instance)s could not be found.") class NodeNotFound(NotFound): message = _("Node %(node)s could not be found.") class NodeAssociated(InvalidState): message = _("Node %(node)s is associated with instance %(instance)s.") class PortNotFound(NotFound): message = _("Port %(port)s could not be found.") class FailedToUpdateDHCPOptOnPort(IronicException): message = _("Update DHCP options on port: %(port_id)s failed.") class FailedToUpdateMacOnPort(IronicException): message = _("Update MAC address on port: %(port_id)s failed.") class ChassisNotFound(NotFound): message = _("Chassis %(chassis)s could not be found.") class ConductorNotFound(NotFound): message = _("Conductor %(conductor)s could not be found.") class ConductorAlreadyRegistered(IronicException): message = _("Conductor %(conductor)s already registered.") class PowerStateFailure(InvalidState): message = _("Failed to set node power state to %(pstate)s.") class ExclusiveLockRequired(NotAuthorized): message = _("An exclusive lock is required, " "but the current context has a shared lock.") class NodeMaintenanceFailure(Invalid): message = _("Failed to toggle maintenance-mode flag " "for node %(node)s: %(reason)s") class NodeConsoleNotEnabled(Invalid): message = _("Console access is not enabled on node %(node)s") class NodeInMaintenance(Invalid): message = _("The %(op)s operation can't be performed on node " "%(node)s because it's in maintenance mode.") class NodeInWrongPowerState(InvalidState): message = _("Can not change instance association while node " "%(node)s is in power state %(pstate)s.") class ChassisNotEmpty(Invalid): message = _("Cannot complete the requested action because chassis " "%(chassis)s contains nodes.") class IPMIFailure(IronicException): message = _("IPMI call failed: %(cmd)s.") class SSHConnectFailed(IronicException): message = _("Failed to establish SSH connection to host %(host)s.") class SSHCommandFailed(IronicException): message = _("Failed to execute command via SSH: %(cmd)s.") class UnsupportedObjectError(IronicException): message = _('Unsupported object type %(objtype)s') class OrphanedObjectError(IronicException): message = _('Cannot call %(method)s on orphaned %(objtype)s object') class UnsupportedDriverExtension(Invalid): message = _('Driver %(driver)s does not support %(extension)s.') class IncompatibleObjectVersion(IronicException): message = _('Version %(objver)s of %(objname)s is not supported') class GlanceConnectionFailed(IronicException): message = _("Connection to glance host %(host)s:%(port)s failed: " "%(reason)s") class ImageNotAuthorized(NotAuthorized): message = _("Not authorized for image %(image_id)s.") class InvalidImageRef(Invalid): message = _("Invalid image href %(image_href)s.") class CatalogUnauthorized(IronicException): message = _("Unauthorised for keystone service catalog.") class CatalogFailure(IronicException): pass class CatalogNotFound(IronicException): message = _("Service type %(service_type)s with endpoint type " "%(endpoint_type)s not found in keystone service catalog.") class ServiceUnavailable(IronicException): message = _("Connection failed") class Forbidden(IronicException): message = _("Requested OpenStack Images API is forbidden") class BadRequest(IronicException): pass class InvalidEndpoint(IronicException): message = _("The provided endpoint is invalid") class CommunicationError(IronicException): message = _("Unable to communicate with the server.") class HTTPForbidden(Forbidden): pass class Unauthorized(IronicException): pass class HTTPNotFound(NotFound): pass class ConfigNotFound(IronicException): message = _("Could not find config at %(path)s") class NodeLocked(TemporaryFailure): message = _("Node %(node)s is locked by host %(host)s, please retry " "after the current operation is completed.") class NoFreeConductorWorker(TemporaryFailure): message = _('Requested action cannot be performed due to lack of free ' 'conductor workers.') code = 503 # Service Unavailable (temporary). class VendorPassthruException(IronicException): pass class ConfigInvalid(IronicException): message = _("Invalid configuration file. %(error_msg)s") ironic-2014.1.rc1/ironic/drivers/0000775000175300017540000000000012316614636017656 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/drivers/base.py0000664000175300017540000002434012316614116021136 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright 2013 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. """ Abstract base classes for drivers. """ import abc import six @six.add_metaclass(abc.ABCMeta) class BaseDriver(object): """Base class for all drivers. Defines the `core`, `standardized`, and `vendor-specific` interfaces for drivers. Any loadable driver must implement all `core` interfaces. Actual implementation may instantiate one or more classes, as long as the interfaces are appropriate. """ core_interfaces = [] standard_interfaces = [] power = None core_interfaces.append('power') """`Core` attribute for managing power state. A reference to an instance of :class:PowerInterface. """ deploy = None core_interfaces.append('deploy') """`Core` attribute for managing deployments. A reference to an instance of :class:DeployInterface. """ console = None standard_interfaces.append('console') """`Standard` attribute for managing console access. A reference to an instance of :class:ConsoleInterface. May be None, if unsupported by a driver. """ rescue = None # NOTE(deva): hide rescue from the interface list in Icehouse # because the API for this has not been created yet. # standard_interfaces.append('rescue') """`Standard` attribute for accessing rescue features. A reference to an instance of :class:RescueInterface. May be None, if unsupported by a driver. """ vendor = None """Attribute for accessing any vendor-specific extensions. A reference to an instance of :class:VendorInterface. May be None, if the driver does not implement any vendor extensions. """ @abc.abstractmethod def __init__(self): pass @six.add_metaclass(abc.ABCMeta) class DeployInterface(object): """Interface for deploy-related actions.""" @abc.abstractmethod def validate(self, task, node): """Validate the driver-specific Node deployment info. This method validates whether the 'driver_info' property of the supplied node contains the required information for this driver to deploy images to the node. :param task: a task from TaskManager. :param node: a single Node to validate. :raises: InvalidParameterValue """ @abc.abstractmethod def deploy(self, task, node): """Perform a deployment to a node. Perform the necessary work to deploy an image onto the specified node. This method will be called after prepare(), which may have already performed any preparatory steps, such as pre-caching some data for the node. :param task: a TaskManager instance. :param node: the Node to act upon. :returns: status of the deploy. One of ironic.common.states. """ @abc.abstractmethod def tear_down(self, task, node): """Tear down a previous deployment. Given a node that has been previously deployed to, do all cleanup and tear down necessary to "un-deploy" that node. :param task: a TaskManager instance. :param node: the Node to act upon. :returns: status of the deploy. One of ironic.common.states. """ @abc.abstractmethod def prepare(self, task, node): """Prepare the deployment environment for this node. If preparation of the deployment environment ahead of time is possible, this method should be implemented by the driver. If implemented, this method must be idempotent. It may be called multiple times for the same node on the same conductor, and it may be called by multiple conductors in parallel. Therefore, it must not require an exclusive lock. This method is called before `deploy`. :param task: a TaskManager instance. :param node: the Node for which to prepare a deployment environment on this Conductor. """ @abc.abstractmethod def clean_up(self, task, node): """Clean up the deployment environment for this node. If preparation of the deployment environment ahead of time is possible, this method should be implemented by the driver. It should erase anything cached by the `prepare` method. If implemented, this method must be idempotent. It may be called multiple times for the same node on the same conductor, and it may be called by multiple conductors in parallel. Therefore, it must not require an exclusive lock. This method is called before `tear_down`. :param task: a TaskManager instance. :param node: the Node whose deployment environment should be cleaned up on this Conductor. """ @abc.abstractmethod def take_over(self, task, node): """Take over management of this node from a dead conductor. If conductors' hosts maintain a static relationship to nodes, this method should be implemented by the driver to allow conductors to perform the necessary work during the remapping of nodes to conductors when a conductor joins or leaves the cluster. For example, the PXE driver has an external dependency: Neutron must forward DHCP BOOT requests to a conductor which has prepared the tftpboot environment for the given node. When a conductor goes offline, another conductor must change this setting in Neutron as part of remapping that node's control to itself. This is performed within the `takeover` method. :param task: a TaskManager instance. :param node: the Node which is now being managed by this Conductor. """ @six.add_metaclass(abc.ABCMeta) class PowerInterface(object): """Interface for power-related actions.""" @abc.abstractmethod def validate(self, task, node): """Validate the driver-specific Node power info. This method validates whether the 'driver_info' property of the supplied node contains the required information for this driver to manage the power state of the node. :param task: a task from TaskManager. :param node: a single Node to validate. :raises: InvalidParameterValue """ @abc.abstractmethod def get_power_state(self, task, node): """Return the power state of the node. TODO """ @abc.abstractmethod def set_power_state(self, task, node, power_state): """Set the power state of the node. TODO """ @abc.abstractmethod def reboot(self, task, node): """Perform a hard reboot of the node. TODO """ @six.add_metaclass(abc.ABCMeta) class ConsoleInterface(object): """Interface for console-related actions.""" @abc.abstractmethod def validate(self, task, node): """Validate the driver-specific Node console info. This method validates whether the 'driver_info' property of the supplied node contains the required information for this driver to provide console access to the Node. :param task: a task from TaskManager. :param node: a single Node to validate. :raises: InvalidParameterValue """ @abc.abstractmethod def start_console(self, task, node): """Start a remote console for the node. TODO """ @abc.abstractmethod def stop_console(self, task, node): """Stop the remote console session for the node. TODO """ @abc.abstractmethod def get_console(self, task, node): """Get connection information about the console. This method should return the necessary information for the client to access the console. :param task: a task from TaskManager. :param node: a single Node. :returns: the console connection information. """ @six.add_metaclass(abc.ABCMeta) class RescueInterface(object): """Interface for rescue-related actions.""" @abc.abstractmethod def validate(self, task, node): """Validate the rescue info stored in the node' properties. :param task: a task from TaskManager. :param node: a single Node to validate. :raises: InvalidParameterValue """ @abc.abstractmethod def rescue(self, task, node): """Boot the node into a rescue environment. TODO """ @abc.abstractmethod def unrescue(self, task, node): """Tear down the rescue environment, and return to normal. TODO """ @six.add_metaclass(abc.ABCMeta) class VendorInterface(object): """Interface for all vendor passthru functionality. Additional vendor- or driver-specific capabilities should be implemented as private methods and invoked from vendor_passthru(). """ @abc.abstractmethod def validate(self, task, node, **kwargs): """Validate vendor-specific actions. :param task: a task from TaskManager. :param node: a single Node. :param kwargs: info for action. :raises: UnsupportedDriverExtension if 'method' can not be mapped to the supported interfaces. :raises: InvalidParameterValue if **kwargs does not contain 'method'. """ @abc.abstractmethod def vendor_passthru(self, task, node, **kwargs): """Receive requests for vendor-specific actions. :param task: a task from TaskManager. :param node: a single Node. :param kwargs: info for action. :raises: UnsupportedDriverExtension if 'method' can not be mapped to the supported interfaces. :raises: InvalidParameterValue if **kwargs does not contain 'method'. """ ironic-2014.1.rc1/ironic/drivers/utils.py0000664000175300017540000000457312316614116021372 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 ironic.common import exception from ironic.drivers import base def _raise_unsupported_error(method=None): if method: raise exception.UnsupportedDriverExtension(_( "Unsupported method (%s) passed through to vendor extension.") % method) raise exception.InvalidParameterValue(_( "Method not specified when calling vendor extension.")) class MixinVendorInterface(base.VendorInterface): """Wrapper around multiple VendorInterfaces.""" def __init__(self, mapping): """Wrapper around multiple VendorInterfaces. :param mapping: dict of {'method': interface} specifying how to combine multiple vendor interfaces into one vendor driver. """ self.mapping = mapping def _map(self, **kwargs): method = kwargs.get('method') return self.mapping.get(method) or _raise_unsupported_error(method) def validate(self, *args, **kwargs): """Call validate on the appropriate interface only. :raises: UnsupportedDriverExtension if 'method' can not be mapped to the supported interfaces. :raises: InvalidParameterValue if **kwargs does not contain 'method'. """ route = self._map(**kwargs) route.validate(*args, **kwargs) def vendor_passthru(self, task, node, **kwargs): """Call vendor_passthru on the appropriate interface only. Returns or raises according to the requested vendor_passthru method. :raises: UnsupportedDriverExtension if 'method' can not be mapped to the supported interfaces. :raises: InvalidParameterValue if **kwargs does not contain 'method'. """ route = self._map(**kwargs) return route.vendor_passthru(task, node, **kwargs) ironic-2014.1.rc1/ironic/drivers/pxe.py0000664000175300017540000001027612316614116021023 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright 2013 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. """ PXE Driver and supporting meta-classes. """ from ironic.common import exception from ironic.drivers import base from ironic.drivers.modules import ipminative from ironic.drivers.modules import ipmitool from ironic.drivers.modules import pxe from ironic.drivers.modules import seamicro from ironic.drivers.modules import ssh from ironic.drivers import utils from ironic.openstack.common import importutils class PXEAndIPMIToolDriver(base.BaseDriver): """PXE + IPMITool driver. This driver implements the `core` functionality, combinding :class:`ironic.drivers.ipmi.IPMI` for power on/off and reboot with :class:`ironic.driver.pxe.PXE` for image deployment. Implementations are in those respective classes; this class is merely the glue between them. """ def __init__(self): self.power = ipmitool.IPMIPower() self.deploy = pxe.PXEDeploy() self.pxe_vendor = pxe.VendorPassthru() self.ipmi_vendor = ipmitool.VendorPassthru() self.mapping = {'pass_deploy_info': self.pxe_vendor, 'set_boot_device': self.ipmi_vendor} self.vendor = utils.MixinVendorInterface(self.mapping) class PXEAndSSHDriver(base.BaseDriver): """PXE + SSH driver. NOTE: This driver is meant only for testing environments. This driver implements the `core` functionality, combinding :class:`ironic.drivers.ssh.SSH` for power on/off and reboot of virtual machines tunneled over SSH, with :class:`ironic.driver.pxe.PXE` for image deployment. Implementations are in those respective classes; this class is merely the glue between them. """ def __init__(self): self.power = ssh.SSHPower() self.deploy = pxe.PXEDeploy() self.vendor = pxe.VendorPassthru() class PXEAndIPMINativeDriver(base.BaseDriver): """PXE + Native IPMI driver. This driver implements the `core` functionality, combining :class:`ironic.drivers.modules.ipminative.NativeIPMIPower` for power on/off and reboot with :class:`ironic.driver.modules.pxe.PXE` for image deployment. Implementations are in those respective classes; this class is merely the glue between them. """ def __init__(self): self.power = ipminative.NativeIPMIPower() self.deploy = pxe.PXEDeploy() self.pxe_vendor = pxe.VendorPassthru() self.ipmi_vendor = ipminative.VendorPassthru() self.mapping = {'pass_deploy_info': self.pxe_vendor, 'set_boot_device': self.ipmi_vendor} self.vendor = utils.MixinVendorInterface(self.mapping) class PXEAndSeaMicroDriver(base.BaseDriver): """PXE + SeaMicro driver. This driver implements the `core` functionality, combining :class:ironic.drivers.modules.seamicro.Power for power on/off and reboot with :class:ironic.driver.modules.pxe.PXE for image deployment. Implementations are in those respective classes; this class is merely the glue between them. """ def __init__(self): if not importutils.try_import('seamicroclient'): raise exception.DriverNotFound('PXEAndSeaMicroDriver') self.power = seamicro.Power() self.deploy = pxe.PXEDeploy() self.seamicro_vendor = seamicro.VendorPassthru() self.pxe_vendor = pxe.VendorPassthru() self.mapping = {'pass_deploy_info': self.pxe_vendor, 'attach_volume': self.seamicro_vendor, 'set_boot_device': self.seamicro_vendor, 'set_node_vlan_id': self.seamicro_vendor} self.vendor = utils.MixinVendorInterface(self.mapping) ironic-2014.1.rc1/ironic/drivers/fake.py0000664000175300017540000000536612316614116021141 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright 2013 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. """ Fake drivers used in testing. """ from ironic.common import exception from ironic.drivers import base from ironic.drivers.modules import fake from ironic.drivers.modules import ipminative from ironic.drivers.modules import ipmitool from ironic.drivers.modules import pxe from ironic.drivers.modules import seamicro from ironic.drivers.modules import ssh from ironic.drivers import utils from ironic.openstack.common import importutils class FakeDriver(base.BaseDriver): """Example implementation of a Driver.""" def __init__(self): self.power = fake.FakePower() self.deploy = fake.FakeDeploy() self.a = fake.FakeVendorA() self.b = fake.FakeVendorB() self.mapping = {'first_method': self.a, 'second_method': self.b} self.vendor = utils.MixinVendorInterface(self.mapping) self.console = fake.FakeConsole() class FakeIPMIToolDriver(base.BaseDriver): """Example implementation of a Driver.""" def __init__(self): self.power = ipmitool.IPMIPower() self.deploy = fake.FakeDeploy() self.vendor = ipmitool.VendorPassthru() class FakePXEDriver(base.BaseDriver): """Example implementation of a Driver.""" def __init__(self): self.power = fake.FakePower() self.deploy = pxe.PXEDeploy() self.vendor = pxe.VendorPassthru() class FakeSSHDriver(base.BaseDriver): """Example implementation of a Driver.""" def __init__(self): self.power = ssh.SSHPower() self.deploy = fake.FakeDeploy() class FakeIPMINativeDriver(base.BaseDriver): """Example implementation of a Driver.""" def __init__(self): self.power = ipminative.NativeIPMIPower() self.deploy = fake.FakeDeploy() self.vendor = ipminative.VendorPassthru() class FakeSeaMicroDriver(base.BaseDriver): """Fake SeaMicro driver.""" def __init__(self): if not importutils.try_import('seamicroclient'): raise exception.DriverNotFound('FakeSeaMicroDriver') self.power = seamicro.Power() self.deploy = fake.FakeDeploy() self.vendor = seamicro.VendorPassthru() ironic-2014.1.rc1/ironic/drivers/__init__.py0000664000175300017540000000000012316614116021746 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/drivers/modules/0000775000175300017540000000000012316614636021326 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/drivers/modules/seamicro.py0000664000175300017540000004125312316614116023500 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. """ Ironic SeaMicro interfaces. Provides basic power control of servers in SeaMicro chassis via python-seamicroclient. Provides vendor passthru methods for SeaMicro specific functionality. """ from oslo.config import cfg from ironic.common import exception from ironic.common import states from ironic.conductor import task_manager from ironic.drivers import base from ironic.openstack.common import importutils from ironic.openstack.common import log as logging from ironic.openstack.common import loopingcall seamicroclient = importutils.try_import('seamicroclient') if seamicroclient: from seamicroclient import client as seamicro_client from seamicroclient import exceptions as seamicro_client_exception opts = [ cfg.IntOpt('max_retry', default=3, help='Maximum retries for SeaMicro operations'), cfg.IntOpt('action_timeout', default=10, help='Seconds to wait for power action to be completed') ] CONF = cfg.CONF opt_group = cfg.OptGroup(name='seamicro', title='Options for the seamicro power driver') CONF.register_group(opt_group) CONF.register_opts(opts, opt_group) LOG = logging.getLogger(__name__) VENDOR_PASSTHRU_METHODS = ['attach_volume', 'set_boot_device', 'set_node_vlan_id'] VALID_BOOT_DEVICES = ['pxe', 'disk'] def _get_client(*args, **kwargs): """Creates the python-seamicro_client :param kwargs: A dict of keyword arguments to be passed to the method, which should contain: 'username', 'password', 'auth_url', 'api_version' parameters. :returns: SeaMicro API client. """ cl_kwargs = {'username': kwargs['username'], 'password': kwargs['password'], 'auth_url': kwargs['api_endpoint']} return seamicro_client.Client(kwargs['api_version'], **cl_kwargs) def _parse_driver_info(node): """Parses and creates seamicro driver info :param node: An Ironic node object. :returns: SeaMicro driver info. :raises: InvalidParameterValue if any required parameters are missing. """ info = node.get('driver_info', {}) api_endpoint = info.get('seamicro_api_endpoint') username = info.get('seamicro_username') password = info.get('seamicro_password') server_id = info.get('seamicro_server_id') api_version = info.get('seamicro_api_version', "2") if not api_endpoint: raise exception.InvalidParameterValue(_( "SeaMicro driver requires api_endpoint be set")) if not username or not password: raise exception.InvalidParameterValue(_( "SeaMicro driver requires both username and password be set")) if not server_id: raise exception.InvalidParameterValue(_( "SeaMicro driver requires server_id be set")) res = {'username': username, 'password': password, 'api_endpoint': api_endpoint, 'server_id': server_id, 'api_version': api_version, 'uuid': node.get('uuid')} return res def _get_server(driver_info): """Get server from server_id.""" s_client = _get_client(**driver_info) return s_client.servers.get(driver_info['server_id']) def _get_volume(driver_info, volume_id): """Get volume from volume_id.""" s_client = _get_client(**driver_info) return s_client.volumes.get(volume_id) def _get_power_status(node): """Get current power state of this node :param node: Ironic node one of :class:`ironic.db.models.Node` :raises: InvalidParameterValue if required seamicro parameters are missing. :raises: ServiceUnavailable on an error from SeaMicro Client. :returns: Power state of the given node """ seamicro_info = _parse_driver_info(node) try: server = _get_server(seamicro_info) if not hasattr(server, 'active') or server.active is None: return states.ERROR if not server.active: return states.POWER_OFF elif server.active: return states.POWER_ON except seamicro_client_exception.NotFound: raise exception.NodeNotFound(node=node.uuid) except seamicro_client_exception.ClientException as ex: LOG.error(_("SeaMicro client exception %(msg)s for node %(uuid)s"), {'msg': ex.message, 'uuid': node.uuid}) raise exception.ServiceUnavailable(message=ex.message) def _power_on(node, timeout=None): """Power ON this node :param node: An Ironic node object. :param timeout: Time in seconds to wait till power on is complete. :raises: InvalidParameterValue if required seamicro parameters are missing. :returns: Power state of the given node. """ if timeout is None: timeout = CONF.seamicro.action_timeout state = [None] retries = [0] seamicro_info = _parse_driver_info(node) server = _get_server(seamicro_info) def _wait_for_power_on(state, retries): """Called at an interval until the node is powered on.""" state[0] = _get_power_status(node) if state[0] == states.POWER_ON: raise loopingcall.LoopingCallDone() if retries[0] > CONF.seamicro.max_retry: state[0] = states.ERROR raise loopingcall.LoopingCallDone() try: retries[0] += 1 server.power_on() except seamicro_client_exception.ClientException: LOG.warning(_("Power-on failed for node %s."), node.uuid) timer = loopingcall.FixedIntervalLoopingCall(_wait_for_power_on, state, retries) timer.start(interval=timeout).wait() return state[0] def _power_off(node, timeout=None): """Power OFF this node :param node: Ironic node one of :class:`ironic.db.models.Node` :param timeout: Time in seconds to wait till power off is compelete :raises: InvalidParameterValue if required seamicro parameters are missing. :returns: Power state of the given node """ if timeout is None: timeout = CONF.seamicro.action_timeout state = [None] retries = [0] seamicro_info = _parse_driver_info(node) server = _get_server(seamicro_info) def _wait_for_power_off(state, retries): """Called at an interval until the node is powered off.""" state[0] = _get_power_status(node) if state[0] == states.POWER_OFF: raise loopingcall.LoopingCallDone() if retries[0] > CONF.seamicro.max_retry: state[0] = states.ERROR raise loopingcall.LoopingCallDone() try: retries[0] += 1 server.power_off() except seamicro_client_exception.ClientException: LOG.warning(_("Power-off failed for node %s."), node.uuid) timer = loopingcall.FixedIntervalLoopingCall(_wait_for_power_off, state, retries) timer.start(interval=timeout).wait() return state[0] def _reboot(node, timeout=None): """Reboot this node :param node: Ironic node one of :class:`ironic.db.models.Node` :param timeout: Time in seconds to wait till reboot is compelete :raises: InvalidParameterValue if required seamicro parameters are missing. :returns: Power state of the given node """ if timeout is None: timeout = CONF.seamicro.action_timeout state = [None] retries = [0] seamicro_info = _parse_driver_info(node) server = _get_server(seamicro_info) def _wait_for_reboot(state, retries): """Called at an interval until the node is rebooted successfully.""" state[0] = _get_power_status(node) if state[0] == states.POWER_ON: raise loopingcall.LoopingCallDone() if retries[0] > CONF.seamicro.max_retry: state[0] = states.ERROR raise loopingcall.LoopingCallDone() try: retries[0] += 1 server.reset() except seamicro_client_exception.ClientException: LOG.warning(_("Reboot failed for node %s."), node.uuid) timer = loopingcall.FixedIntervalLoopingCall(_wait_for_reboot, state, retries) server.reset() timer.start(interval=timeout).wait() return state[0] def _validate_volume(driver_info, volume_id): """Validates if volume is in Storage pools designated for ironic.""" volume = _get_volume(driver_info, volume_id) # Check if the ironic /ironic-/ naming scheme # is present in volume id try: pool_id = volume.id.split('/')[1].lower() except IndexError: pool_id = "" if "ironic-" in pool_id: return True else: raise exception.InvalidParameterValue(_( "Invalid volume id specified")) def _get_pools(driver_info, filters=None): """Get SeaMicro storage pools matching given filters.""" s_client = _get_client(**driver_info) return s_client.pools.list(filters=filters) def _create_volume(driver_info, volume_size): """Create volume in the SeaMicro storage pools designated for ironic.""" ironic_pools = _get_pools(driver_info, filters={'id': 'ironic-'}) if ironic_pools is None: raise exception.VendorPassthruException(_( "No storage pools found for ironic")) least_used_pool = sorted(ironic_pools, key=lambda x: x.freeSize)[0] return _get_client(**driver_info).volumes.create(volume_size, least_used_pool) class Power(base.PowerInterface): """SeaMicro Power Interface. This PowerInterface class provides a mechanism for controlling the power state of servers in a seamicro chassis. """ def validate(self, node): """Check that node 'driver_info' is valid. Check that node 'driver_info' contains the required fields. :param node: Single node object. :raises: InvalidParameterValue if required seamicro parameters are missing. """ _parse_driver_info(node) def get_power_state(self, task, node): """Get the current power state. Poll the host for the current power state of the node. :param task: A instance of `ironic.manager.task_manager.TaskManager`. :param node: A single node. :raises: InvalidParameterValue if required seamicro parameters are missing. :raises: ServiceUnavailable on an error from SeaMicro Client. :returns: power state. One of :class:`ironic.common.states`. """ return _get_power_status(node) @task_manager.require_exclusive_lock def set_power_state(self, task, node, pstate): """Turn the power on or off. Set the power state of a node. :param task: A instance of `ironic.manager.task_manager.TaskManager`. :param node: A single node. :param pstate: Either POWER_ON or POWER_OFF from :class: `ironic.common.states`. :raises: InvalidParameterValue if an invalid power state was specified. :raises: PowerStateFailure if the desired power state couldn't be set. """ if pstate == states.POWER_ON: state = _power_on(node) elif pstate == states.POWER_OFF: state = _power_off(node) else: raise exception.InvalidParameterValue(_( "set_power_state called with invalid power state.")) if state != pstate: raise exception.PowerStateFailure(pstate=pstate) @task_manager.require_exclusive_lock def reboot(self, task, node): """Cycles the power to a node. :param task: a TaskManager instance. :param node: An Ironic node object. :raises: InvalidParameterValue if required seamicro parameters are missing. :raises: PowerStateFailure if the final state of the node is not POWER_ON. """ state = _reboot(node) if state != states.POWER_ON: raise exception.PowerStateFailure(pstate=states.POWER_ON) class VendorPassthru(base.VendorInterface): """SeaMicro vendor-specific methods.""" def validate(self, task, node, **kwargs): method = kwargs['method'] if method in VENDOR_PASSTHRU_METHODS: return True else: raise exception.InvalidParameterValue(_( "Unsupported method (%s) passed to SeaMicro driver.") % method) def vendor_passthru(self, task, node, **kwargs): """Dispatch vendor specific method calls.""" method = kwargs['method'] if method in VENDOR_PASSTHRU_METHODS: return getattr(self, "_" + method)(task, node, **kwargs) def _set_node_vlan_id(self, task, node, **kwargs): """Sets a untagged vlan id for NIC 0 of node. @kwargs vlan_id: id of untagged vlan for NIC 0 of node """ vlan_id = kwargs.get('vlan_id') if not vlan_id: raise exception.InvalidParameterValue(_("No vlan id provided")) seamicro_info = _parse_driver_info(node) try: server = _get_server(seamicro_info) # remove current vlan for server if len(server.nic['0']['untaggedVlan']) > 0: server.unset_untagged_vlan(server.nic['0']['untaggedVlan']) server = server.refresh(5) server.set_untagged_vlan(vlan_id) except seamicro_client_exception.ClientException as ex: LOG.error(_("SeaMicro client exception: %s"), ex.message) raise exception.VendorPassthruException(message=ex.message) properties = node.properties properties['seamicro_vlan_id'] = vlan_id node.properties = properties node.save(task.context) def _attach_volume(self, task, node, **kwargs): """Attach volume from SeaMicro storage pools for ironic to node. If kwargs['volume_id'] not given, Create volume in SeaMicro storage pool and attach to node. @kwargs volume_id: id of pre-provisioned volume that is to be attached as root volume of node @kwargs volume_size: size of new volume to be created and attached as root volume of node """ seamicro_info = _parse_driver_info(node) volume_id = kwargs.get('volume_id') if volume_id is None: volume_size = kwargs.get('volume_size') if volume_size is None: raise exception.InvalidParameterValue( _("No volume size provided for creating volume")) volume_id = _create_volume(seamicro_info, volume_size) if _validate_volume(seamicro_info, volume_id): try: server = _get_server(seamicro_info) server.detach_volume() server = server.refresh(5) server.attach_volume(volume_id) except seamicro_client_exception.ClientException as ex: LOG.error(_("SeaMicro client exception: %s"), ex.message) raise exception.VendorPassthruException(message=ex.message) properties = node.properties properties['seamicro_volume_id'] = volume_id node.properties = properties node.save(task.context) def _set_boot_device(self, task, node, **kwargs): """Set the boot device of the node. @kwargs device: Boot device. One of [pxe, disk] """ boot_device = kwargs.get('device') if boot_device is None: raise exception.InvalidParameterValue(_("No boot device provided")) if boot_device not in VALID_BOOT_DEVICES: raise exception.InvalidParameterValue(_("Boot device is invalid")) seamicro_info = _parse_driver_info(node) try: server = _get_server(seamicro_info) if boot_device == "disk": boot_device = "hd0" server.set_boot_order(boot_device) except seamicro_client_exception.ClientException as ex: LOG.error(_("set_boot_device error: %s"), ex.message) raise exception.VendorPassthruException(message=ex.message) ironic-2014.1.rc1/ironic/drivers/modules/pxe_config.template0000664000175300017540000000113312316614116025173 0ustar jenkinsjenkins00000000000000default deploy label deploy kernel {{ pxe_options.deployment_aki_path }} append initrd={{ pxe_options.deployment_ari_path }} selinux=0 disk=cciss/c0d0,sda,hda,vda iscsi_target_iqn={{ pxe_options.deployment_iscsi_iqn }} deployment_id={{ pxe_options.deployment_id }} deployment_key={{ pxe_options.deployment_key }} ironic_api_url={{ pxe_options.ironic_api_url }} troubleshoot=0 {{ pxe_options.pxe_append_params|default("", true) }} ipappend 3 label boot kernel {{ pxe_options.aki_path }} append initrd={{ pxe_options.ari_path }} root={{ ROOT }} ro {{ pxe_options.pxe_append_params|default("", true) }} ironic-2014.1.rc1/ironic/drivers/modules/ipminative.py0000664000175300017540000003017012316614116024037 0ustar jenkinsjenkins00000000000000# coding=utf-8 # Copyright 2013 International Business Machines 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. """ Ironic Native IPMI power manager. """ from oslo.config import cfg from ironic.common import exception from ironic.common import states from ironic.conductor import task_manager from ironic.drivers import base from ironic.openstack.common import log as logging from pyghmi import exceptions as pyghmi_exception from pyghmi.ipmi import command as ipmi_command opts = [ cfg.IntOpt('retry_timeout', default=60, help='Maximum time in seconds to retry IPMI operations.'), ] CONF = cfg.CONF CONF.register_opts(opts, group='ipmi') LOG = logging.getLogger(__name__) def _parse_driver_info(node): """Gets the bmc access info for the given node. :raises: InvalidParameterValue when required ipmi credentials are missing. """ info = node.get('driver_info', {}) bmc_info = {} bmc_info['address'] = info.get('ipmi_address') bmc_info['username'] = info.get('ipmi_username') bmc_info['password'] = info.get('ipmi_password') # address, username and password must be present missing_info = [key for key in bmc_info if not bmc_info[key]] if missing_info: raise exception.InvalidParameterValue(_( "The following IPMI credentials are not supplied" " to IPMI driver: %s." ) % missing_info) # get additional info bmc_info['uuid'] = node.get('uuid') return bmc_info def _power_on(driver_info): """Turn the power on for this node. :param driver_info: the bmc access info for a node. :returns: power state POWER_ON, one of :class:`ironic.common.states`. :raises: IPMIFailure when the native ipmi call fails. :raises: PowerStateFailure when invalid power state is returned from ipmi. """ msg = _("IPMI power on failed for node %(node_id)s with the " "following error: %(error)s") try: ipmicmd = ipmi_command.Command(bmc=driver_info['address'], userid=driver_info['username'], password=driver_info['password']) wait = CONF.ipmi.retry_timeout ret = ipmicmd.set_power('on', wait) except pyghmi_exception.IpmiException as e: LOG.warning(msg % {'node_id': driver_info['uuid'], 'error': str(e)}) raise exception.IPMIFailure(cmd=str(e)) state = ret.get('powerstate') if state == 'on': return states.POWER_ON else: LOG.warning(msg % {'node_id': driver_info['uuid'], 'error': ret}) raise exception.PowerStateFailure(pstate=state) def _power_off(driver_info): """Turn the power off for this node. :param driver_info: the bmc access info for a node. :returns: power state POWER_OFF, one of :class:`ironic.common.states`. :raises: IPMIFailure when the native ipmi call fails. :raises: PowerStateFailure when invalid power state is returned from ipmi. """ msg = _("IPMI power off failed for node %(node_id)s with the " "following error: %(error)s") try: ipmicmd = ipmi_command.Command(bmc=driver_info['address'], userid=driver_info['username'], password=driver_info['password']) wait = CONF.ipmi.retry_timeout ret = ipmicmd.set_power('off', wait) except pyghmi_exception.IpmiException as e: LOG.warning(msg % {'node_id': driver_info['uuid'], 'error': str(e)}) raise exception.IPMIFailure(cmd=str(e)) state = ret.get('powerstate') if state == 'off': return states.POWER_OFF else: LOG.warning(msg % {'node_id': driver_info['uuid'], 'error': ret}) raise exception.PowerStateFailure(pstate=state) def _reboot(driver_info): """Reboot this node. If the power is off, turn it on. If the power is on, reset it. :param driver_info: the bmc access info for a node. :returns: power state POWER_ON, one of :class:`ironic.common.states`. :raises: IPMIFailure when the native ipmi call fails. :raises: PowerStateFailure when invalid power state is returned from ipmi. """ msg = _("IPMI power reboot failed for node %(node_id)s with the " "following error: %(error)s") try: ipmicmd = ipmi_command.Command(bmc=driver_info['address'], userid=driver_info['username'], password=driver_info['password']) wait = CONF.ipmi.retry_timeout ret = ipmicmd.set_power('boot', wait) except pyghmi_exception.IpmiException as e: LOG.warning(msg % {'node_id': driver_info['uuid'], 'error': str(e)}) raise exception.IPMIFailure(cmd=str(e)) state = ret.get('powerstate') if state == 'on': return states.POWER_ON else: LOG.warning(msg % {'node_id': driver_info['uuid'], 'error': ret}) raise exception.PowerStateFailure(pstate=state) def _power_status(driver_info): """Get the power status for this node. :param driver_info: the bmc access info for a node. :returns: power state POWER_ON, POWER_OFF or ERROR defined in :class:`ironic.common.states`. :raises: IPMIFailure when the native ipmi call fails. """ try: ipmicmd = ipmi_command.Command(bmc=driver_info['address'], userid=driver_info['username'], password=driver_info['password']) ret = ipmicmd.get_power() except pyghmi_exception.IpmiException as e: LOG.warning(_("IPMI get power state failed for node %(node_id)s " "with the following error: %(error)s") % {'node_id': driver_info['uuid'], 'error': str(e)}) raise exception.IPMIFailure(cmd=str(e)) state = ret.get('powerstate') if state == 'on': return states.POWER_ON elif state == 'off': return states.POWER_OFF else: # NOTE(linggao): Do not throw an exception here because it might # return other valid values. It is up to the caller to decide # what to do. LOG.warning(_("IPMI get power state for node %(node_id)s returns the " "following details: %(detail)s") % {'node_id': driver_info['uuid'], 'detail': ret}) return states.ERROR class NativeIPMIPower(base.PowerInterface): """The power driver using native python-ipmi library.""" def validate(self, task, node): """Check that node['driver_info'] contains IPMI credentials. :param task: a task from TaskManager. :param node: a single node to validate. :raises: InvalidParameterValue when required ipmi credentials are missing. """ _parse_driver_info(node) def get_power_state(self, task, node): """Get the current power state. :param task: a TaskManager instance. :param node: the node info. :returns: power state POWER_ON, POWER_OFF or ERROR defined in :class:`ironic.common.states`. :raises: InvalidParameterValue when required ipmi credentials are missing. :raises: IPMIFailure when the native ipmi call fails. """ driver_info = _parse_driver_info(node) return _power_status(driver_info) @task_manager.require_exclusive_lock def set_power_state(self, task, node, pstate): """Turn the power on or off. :param task: a TaskManager instance. :param node: the node info. :param pstate: a power state that will be set on the given node. :raises: IPMIFailure when the native ipmi call fails. :raises: InvalidParameterValue when an invalid power state is specified or required ipmi credentials are missing. :raises: PowerStateFailure when invalid power state is returned from ipmi. """ driver_info = _parse_driver_info(node) if pstate == states.POWER_ON: _power_on(driver_info) elif pstate == states.POWER_OFF: _power_off(driver_info) else: raise exception.InvalidParameterValue(_( "set_power_state called with an invalid power state: %s." ) % pstate) @task_manager.require_exclusive_lock def reboot(self, task, node): """Cycles the power to a node. :param task: a TaskManager instance. :param node: the node info. :raises: IPMIFailure when the native ipmi call fails. :raises: InvalidParameterValue when required ipmi credentials are missing. :raises: PowerStateFailure when invalid power state is returned from ipmi. """ driver_info = _parse_driver_info(node) _reboot(driver_info) class VendorPassthru(base.VendorInterface): @task_manager.require_exclusive_lock def _set_boot_device(self, task, node, device, persistent=False): """Set the boot device for a node. :param task: a TaskManager instance. :param node: The Node. :param device: Boot device. One of [net, network, pxe, hd, cd, cdrom, dvd, floppy, default, setup, f1] :param persistent: Whether to set next-boot, or make the change permanent. Default: False. :raises: InvalidParameterValue if an invalid boot device is specified or required ipmi credentials are missing. :raises: IPMIFailure when the native ipmi call fails. """ if device not in ipmi_command.boot_devices: raise exception.InvalidParameterValue(_( "Invalid boot device %s specified.") % device) driver_info = _parse_driver_info(node) try: ipmicmd = ipmi_command.Command(bmc=driver_info['address'], userid=driver_info['username'], password=driver_info['password']) ipmicmd.set_bootdev(device) except pyghmi_exception.IpmiException as e: LOG.warning(_("IPMI set boot device failed for node %(node_id)s " "with the following error: %(error)s") % {'node_id': driver_info['uuid'], 'error': str(e)}) raise exception.IPMIFailure(cmd=str(e)) def validate(self, node, **kwargs): """Validate vendor-specific actions. :param node: The node :param kwargs: the keyword arguments supplied :raises: InvalidParameterValue if an invalid boot device is specified, required ipmi credentials are missing or an invalid method is requested to the driver. """ method = kwargs['method'] if method == 'set_boot_device': device = kwargs.get('device') if device not in ipmi_command.boot_devices: raise exception.InvalidParameterValue(_( "Invalid boot device %s specified.") % device) else: raise exception.InvalidParameterValue(_( "Unsupported method (%s) passed to IPMINative driver.") % method) _parse_driver_info(node) def vendor_passthru(self, task, node, **kwargs): """Receive requests for vendor-specific actions. :param task: a TaskManager instance. :param node: The node :param kwargs: the keyword arguments supplied """ method = kwargs['method'] if method == 'set_boot_device': return self._set_boot_device( task, node, kwargs.get('device'), kwargs.get('persistent', False)) ironic-2014.1.rc1/ironic/drivers/modules/deploy_utils.py0000664000175300017540000002351212316614116024410 0ustar jenkinsjenkins00000000000000# Copyright (c) 2012 NTT DOCOMO, INC. # 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 import re import socket import stat import time from ironic.common import exception from ironic.common import utils from ironic.openstack.common import excutils from ironic.openstack.common import log as logging from ironic.openstack.common import processutils LOG = logging.getLogger(__name__) # All functions are called from deploy() directly or indirectly. # They are split for stub-out. def discovery(portal_address, portal_port): """Do iSCSI discovery on portal.""" utils.execute('iscsiadm', '-m', 'discovery', '-t', 'st', '-p', '%s:%s' % (portal_address, portal_port), run_as_root=True, check_exit_code=[0]) def login_iscsi(portal_address, portal_port, target_iqn): """Login to an iSCSI target.""" utils.execute('iscsiadm', '-m', 'node', '-p', '%s:%s' % (portal_address, portal_port), '-T', target_iqn, '--login', run_as_root=True, check_exit_code=[0]) # Ensure the login complete time.sleep(3) def logout_iscsi(portal_address, portal_port, target_iqn): """Logout from an iSCSI target.""" utils.execute('iscsiadm', '-m', 'node', '-p', '%s:%s' % (portal_address, portal_port), '-T', target_iqn, '--logout', run_as_root=True, check_exit_code=[0]) def delete_iscsi(portal_address, portal_port, target_iqn): """Delete the iSCSI target.""" utils.execute('iscsiadm', '-m', 'node', '-p', '%s:%s' % (portal_address, portal_port), '-T', target_iqn, '-o', 'delete', run_as_root=True, check_exit_code=[0]) def make_partitions(dev, root_mb, swap_mb, ephemeral_mb): """Create partitions for root and swap on a disk device.""" # Lead in with 1MB to allow room for the partition table itself, otherwise # the way sfdisk adjusts doesn't shift the partition up to compensate, and # we lose the space. # http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/raring/util-linux/ # raring/view/head:/fdisk/sfdisk.c#L1940 if ephemeral_mb: stdin_command = ('1,%d,83;\n,%d,82;\n,%d,83;\n0,0;\n' % (ephemeral_mb, swap_mb, root_mb)) else: stdin_command = ('1,%d,83;\n,%d,82;\n0,0;\n0,0;\n' % (root_mb, swap_mb)) utils.execute('sfdisk', '-uM', dev, process_input=stdin_command, run_as_root=True, attempts=3, check_exit_code=[0]) # avoid "device is busy" time.sleep(3) def is_block_device(dev): """Check whether a device is block or not.""" s = os.stat(dev) return stat.S_ISBLK(s.st_mode) def dd(src, dst): """Execute dd from src to dst.""" utils.execute('dd', 'if=%s' % src, 'of=%s' % dst, 'bs=1M', 'oflag=direct', run_as_root=True, check_exit_code=[0]) def mkswap(dev, label='swap1'): """Execute mkswap on a device.""" utils.mkfs('swap', dev, label) def mkfs_ephemeral(dev, ephemeral_format, label="ephemeral0"): utils.mkfs(ephemeral_format, dev, label) def block_uuid(dev): """Get UUID of a block device.""" out, _ = utils.execute('blkid', '-s', 'UUID', '-o', 'value', dev, run_as_root=True, check_exit_code=[0]) return out.strip() def switch_pxe_config(path, root_uuid): """Switch a pxe config from deployment mode to service mode.""" with open(path) as f: lines = f.readlines() root = 'UUID=%s' % root_uuid rre = re.compile(r'\{\{ ROOT \}\}') dre = re.compile('^default .*$') with open(path, 'w') as f: for line in lines: line = rre.sub(root, line) line = dre.sub('default boot', line) f.write(line) def notify(address, port): """Notify a node that it becomes ready to reboot.""" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect((address, port)) s.send('done') finally: s.close() def get_dev(address, port, iqn, lun): """Returns a device path for given parameters.""" dev = "/dev/disk/by-path/ip-%s:%s-iscsi-%s-lun-%s" \ % (address, port, iqn, lun) return dev def get_image_mb(image_path): """Get size of an image in Megabyte.""" mb = 1024 * 1024 image_byte = os.path.getsize(image_path) # round up size to MB image_mb = int((image_byte + mb - 1) / mb) return image_mb def work_on_disk(dev, root_mb, swap_mb, ephemeral_mb, ephemeral_format, image_path, preserve_ephemeral=False): """Create partitions and copy an image to the root partition. :param dev: Path for the device to work on. :param root_mb: Size of the root partition in megabytes. :param swap_mb: Size of the swap partition in megabytes. :param ephemeral_mb: Size of the ephemeral partition in megabytes. If 0, no ephemeral partition will be created. :param ephemeral_format: The type of file system to format the ephemeral partition. :param image_path: Path for the instance's disk image. :param preserve_ephemeral: If True, no filesystem is written to the ephemeral block device, preserving whatever content it had (if the partition table has not changed). """ # NOTE(lucasagomes): When there's an ephemeral partition we want # root to be last because that would allow root to resize and make it # safer to do takeovernode with slightly larger images if ephemeral_mb: ephemeral_part = "%s-part1" % dev swap_part = "%s-part2" % dev root_part = "%s-part3" % dev else: root_part = "%s-part1" % dev swap_part = "%s-part2" % dev if not is_block_device(dev): raise exception.InstanceDeployFailure(_("Parent device '%s' not found") % dev) make_partitions(dev, root_mb, swap_mb, ephemeral_mb) if not is_block_device(root_part): raise exception.InstanceDeployFailure(_("Root device '%s' not found") % root_part) if not is_block_device(swap_part): raise exception.InstanceDeployFailure(_("Swap device '%s' not found") % swap_part) if ephemeral_mb and not is_block_device(ephemeral_part): raise exception.InstanceDeployFailure( _("Ephemeral device '%s' not found") % ephemeral_part) dd(image_path, root_part) mkswap(swap_part) if ephemeral_mb and not preserve_ephemeral: mkfs_ephemeral(ephemeral_part, ephemeral_format) try: root_uuid = block_uuid(root_part) except processutils.ProcessExecutionError: with excutils.save_and_reraise_exception(): LOG.error(_("Failed to detect root device UUID.")) return root_uuid def deploy(address, port, iqn, lun, image_path, pxe_config_path, root_mb, swap_mb, ephemeral_mb, ephemeral_format, preserve_ephemeral=False): """All-in-one function to deploy a node. :param address: The iSCSI IP address. :param port: The iSCSI port number. :param iqn: The iSCSI qualified name. :param lun: The iSCSI logical unit number. :param image_path: Path for the instance's disk image. :param pxe_config_path: Path for the instance PXE config file. :param root_mb: Size of the root partition in megabytes. :param swap_mb: Size of the swap partition in megabytes. :param ephemeral_mb: Size of the ephemeral partition in megabytes. If 0, no ephemeral partition will be created. :param ephemeral_format: The type of file system to format the ephemeral partition. :param preserve_ephemeral: If True, no filesystem is written to the ephemeral block device, preserving whatever content it had (if the partition table has not changed). """ dev = get_dev(address, port, iqn, lun) image_mb = get_image_mb(image_path) if image_mb > root_mb: root_mb = image_mb discovery(address, port) login_iscsi(address, port, iqn) try: root_uuid = work_on_disk(dev, root_mb, swap_mb, ephemeral_mb, ephemeral_format, image_path, preserve_ephemeral) except processutils.ProcessExecutionError as err: with excutils.save_and_reraise_exception(): LOG.error(_("Deploy to address %s failed.") % address) LOG.error(_("Command: %s") % err.cmd) LOG.error(_("StdOut: %r") % err.stdout) LOG.error(_("StdErr: %r") % err.stderr) except exception.InstanceDeployFailure as e: with excutils.save_and_reraise_exception(): LOG.error(_("Deploy to address %s failed.") % address) LOG.error(e) finally: logout_iscsi(address, port, iqn) delete_iscsi(address, port, iqn) switch_pxe_config(pxe_config_path, root_uuid) # Ensure the node started netcat on the port after POST the request. time.sleep(3) notify(address, 10000) ironic-2014.1.rc1/ironic/drivers/modules/pxe.py0000664000175300017540000007231112316614116022471 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright 2013 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. """ PXE Driver and supporting meta-classes. """ import os import tempfile import jinja2 from oslo.config import cfg from ironic.common import exception from ironic.common.glance_service import service_utils from ironic.common import image_service as service from ironic.common import images from ironic.common import keystone from ironic.common import neutron from ironic.common import paths from ironic.common import states from ironic.common import utils from ironic.conductor import task_manager from ironic.conductor import utils as manager_utils from ironic.drivers import base from ironic.drivers.modules import deploy_utils from ironic.openstack.common import fileutils from ironic.openstack.common import lockutils from ironic.openstack.common import log as logging from ironic.openstack.common import loopingcall from ironic.openstack.common import strutils pxe_opts = [ cfg.StrOpt('pxe_append_params', default='nofb nomodeset vga=normal', help='Additional append parameters for baremetal PXE boot.'), cfg.StrOpt('pxe_config_template', default=paths.basedir_def( 'drivers/modules/pxe_config.template'), help='Template file for PXE configuration.'), cfg.StrOpt('tftp_server', default='$my_ip', help='IP address of Ironic compute node\'s tftp server.'), cfg.StrOpt('tftp_root', default='/tftpboot', help='Ironic compute node\'s tftp root path.'), cfg.StrOpt('images_path', default='/var/lib/ironic/images/', help='Directory where images are stored on disk.'), cfg.StrOpt('tftp_master_path', default='/tftpboot/master_images', help='Directory where master tftp images are stored on disk.'), cfg.StrOpt('instance_master_path', default='/var/lib/ironic/master_images', help='Directory where master instance images are stored on ' 'disk.'), # NOTE(dekehn): Additional boot files options may be created in the event # other architectures require different boot files. cfg.StrOpt('pxe_bootfile_name', default='pxelinux.0', help='Neutron bootfile DHCP parameter.'), ] LOG = logging.getLogger(__name__) CONF = cfg.CONF CONF.register_opts(pxe_opts, group='pxe') CONF.import_opt('use_ipv6', 'ironic.netconf') def _parse_driver_info(node): """Gets the driver-specific Node deployment info. This method validates whether the 'driver_info' property of the supplied node contains the required information for this driver to deploy images to the node. :param node: a single Node to validate. :returns: A dict with the driver_info values. """ info = node.get('driver_info', {}) d_info = {} d_info['image_source'] = info.get('pxe_image_source') d_info['deploy_kernel'] = info.get('pxe_deploy_kernel') d_info['deploy_ramdisk'] = info.get('pxe_deploy_ramdisk') d_info['root_gb'] = info.get('pxe_root_gb') missing_info = [] for label in d_info: if not d_info[label]: missing_info.append("pxe_%s" % label) if missing_info: raise exception.InvalidParameterValue(_( "Can not validate PXE bootloader. The following parameters " "were not passed to ironic: %s") % missing_info) # Internal use only d_info['deploy_key'] = info.get('pxe_deploy_key') # TODO(ghe): Should we get rid of swap partition? d_info['swap_mb'] = info.get('pxe_swap_mb', 0) d_info['ephemeral_gb'] = info.get('pxe_ephemeral_gb', 0) d_info['ephemeral_format'] = info.get('pxe_ephemeral_format') err_msg_invalid = _("Can not validate PXE bootloader. Invalid parameter " "pxe_%(param)s. Reason: %(reason)s") for param in ('root_gb', 'swap_mb', 'ephemeral_gb'): try: int(d_info[param]) except ValueError: reason = _("'%s' is not an integer value.") % d_info[param] raise exception.InvalidParameterValue(err_msg_invalid % {'param': param, 'reason': reason}) # NOTE(lucasagomes): For simpler code paths on the deployment side, # we always create a swap partition. if the size is # <= 0 we default to 1MB if int(d_info['swap_mb']) <= 0: d_info['swap_mb'] = 1 if d_info['ephemeral_gb'] and not d_info['ephemeral_format']: msg = _("The deploy contains an ephemeral partition, but no " "filesystem type was specified by the pxe_ephemeral_format " "parameter") raise exception.InvalidParameterValue(msg) preserve_ephemeral = info.get('pxe_preserve_ephemeral', False) try: d_info['preserve_ephemeral'] = strutils.bool_from_string( preserve_ephemeral, strict=True) except ValueError as e: raise exception.InvalidParameterValue(err_msg_invalid % {'param': 'preserve_ephemeral', 'reason': e}) return d_info def _build_pxe_config(node, pxe_info, ctx): """Build the PXE config file for a node This method builds the PXE boot configuration file for a node, given all the required parameters. The resulting file has both a "deploy" and "boot" label, which correspond to the two phases of booting. This may be extended later. :param pxe_options: A dict of values to set on the configuarion file :returns: A formated string with the file content. """ LOG.debug(_("Building PXE config for deployment %s.") % node['id']) # NOTE: we should strip '/' from the end because this is intended for # hardcoded ramdisk script ironic_api = (CONF.conductor.api_url or keystone.get_service_url()).rstrip('/') deploy_key = utils.random_alnum(32) driver_info = node['driver_info'] driver_info['pxe_deploy_key'] = deploy_key node['driver_info'] = driver_info node.save(ctx) pxe_options = { 'deployment_id': node['uuid'], 'deployment_key': deploy_key, 'deployment_iscsi_iqn': "iqn-%s" % node.uuid, 'deployment_aki_path': pxe_info['deploy_kernel'][1], 'deployment_ari_path': pxe_info['deploy_ramdisk'][1], 'aki_path': pxe_info['kernel'][1], 'ari_path': pxe_info['ramdisk'][1], 'ironic_api_url': ironic_api, 'pxe_append_params': CONF.pxe.pxe_append_params, } tmpl_path, tmpl_file = os.path.split(CONF.pxe.pxe_config_template) env = jinja2.Environment(loader=jinja2.FileSystemLoader(tmpl_path)) template = env.get_template(tmpl_file) return template.render({'pxe_options': pxe_options, 'ROOT': '{{ ROOT }}'}) def _get_node_mac_addresses(task, node): """Get all mac addresses for a node. :param task: a TaskManager instance. :param node: the Node to act upon. :returns: A list of macs address in the format xx:xx:xx:xx:xx:xx. """ for r in task.resources: if r.node.id == node['id']: return [p.address for p in r.ports] def _get_node_vif_ids(task): """Get all Neutron VIF ids for a node. This function does not handle multi node operations. :param task: a TaskManager instance. :returns: A dict of the Node's port UUIDs and their associated VIFs """ port_vifs = {} for port in task.resources[0].ports: vif = port.extra.get('vif_port_id') if vif: port_vifs[port.uuid] = vif return port_vifs def _get_pxe_mac_path(mac): """Convert a MAC address into a PXE config file name. :param mac: A mac address string in the format xx:xx:xx:xx:xx:xx. :returns: the path to the config file. """ return os.path.join( CONF.pxe.tftp_root, 'pxelinux.cfg', "01-" + mac.replace(":", "-").lower() ) def _get_pxe_config_file_path(node_uuid): """Generate the path for an instances PXE config file.""" return os.path.join(CONF.pxe.tftp_root, node_uuid, 'config') def _get_pxe_bootfile_name(): """Returns the pxe_bootfile_name option.""" return CONF.pxe.pxe_bootfile_name def _get_image_dir_path(node_uuid): """Generate the dir for an instances disk.""" return os.path.join(CONF.pxe.images_path, node_uuid) def _get_image_file_path(node_uuid): """Generate the full path for an instances disk.""" return os.path.join(_get_image_dir_path(node_uuid), 'disk') def _get_token_file_path(node_uuid): """Generate the path for PKI token file.""" return os.path.join(CONF.pxe.tftp_root, 'token-' + node_uuid) @lockutils.synchronized('master_image', 'ironic-') def _link_master_image(path, dest_path): """Create a link from path to dest_path using locking to avoid image manipulation during the process. """ if os.path.exists(path): os.link(path, dest_path) @lockutils.synchronized('master_image', 'ironic-') def _unlink_master_image(path): #TODO(ghe): keep images for a while (kind of local cache) # If an image has been used, it-s likely to be used again # With no space problems, we can keep it, so next time # only a new link needs to be created. # Replace algorithm to look: disk space (trigger) # lru, aged... # os.statvfs # heapq.nlargest(1, [(f, os.stat('./' + f).st_ctime) for f in # os.listdir('.') if os.stat('./' + f).st_nlink == 1], key=lambda s: s[1]) if os.path.exists(path) and os.stat(path).st_nlink == 1: utils.unlink_without_raise(path) @lockutils.synchronized('master_image', 'ironic-') def _create_master_image(tmp_path, master_uuid, path): """With recently download image, use it as master image, and link to instances uuid. Uses file locking to avoid image maniputalion during the process. """ if not os.path.exists(master_uuid): os.link(tmp_path, master_uuid) os.link(master_uuid, path) os.unlink(tmp_path) @lockutils.synchronized('get_image', 'ironic-') def _download_in_progress(lock_file): """Get image file lock to avoid downloading the same image simultaneously. """ if not os.path.exists(lock_file): open(lock_file, 'w') return False else: return True @lockutils.synchronized('get_image', 'ironic-') def _remove_download_in_progress_lock(lock_file): """Removes image file lock to indicate that image download has finished and we can start to use it. """ fileutils.delete_if_exists(lock_file) def _get_image(ctx, path, uuid, master_path=None, image_service=None): #TODO(ghe): Revise this logic and cdocument process Bug #1199665 # When master_path defined, we save the images in this dir using the iamge # uuid as the file name. Deployments that use this images, creates a hard # link to keep track of this. When the link count of a master image is # equal to 1, can be deleted. #TODO(ghe): have hard links and count links the same behaviour in all fs #TODO(ghe): timeout and retry for downloads def _wait_for_download(): if not os.path.exists(lock_file): raise loopingcall.LoopingCallDone() # If the download of the image needed is in progress (lock file present) # we wait until the locks disappears and create the link. if master_path is None: #NOTE(ghe): We don't share images between instances/hosts images.fetch_to_raw(ctx, uuid, path, image_service) else: master_uuid = os.path.join(master_path, service_utils.parse_image_ref(uuid)[0]) lock_file = os.path.join(master_path, master_uuid + '.lock') _link_master_image(master_uuid, path) if not os.path.exists(path): fileutils.ensure_tree(master_path) if not _download_in_progress(lock_file): with fileutils.remove_path_on_error(lock_file): #TODO(ghe): logging when image cannot be created fd, tmp_path = tempfile.mkstemp(dir=master_path) os.close(fd) images.fetch_to_raw(ctx, uuid, tmp_path, image_service) _create_master_image(tmp_path, master_uuid, path) _remove_download_in_progress_lock(lock_file) else: #TODO(ghe): expiration time timer = loopingcall.FixedIntervalLoopingCall( _wait_for_download) timer.start(interval=1).wait() _link_master_image(master_uuid, path) def _cache_tftp_images(ctx, node, pxe_info): """Fetch the necessary kernels and ramdisks for the instance.""" fileutils.ensure_tree( os.path.join(CONF.pxe.tftp_root, node.uuid)) LOG.debug(_("Fetching kernel and ramdisk for node %s") % node.uuid) for label in pxe_info: (uuid, path) = pxe_info[label] if not os.path.exists(path): _get_image(ctx, path, uuid, CONF.pxe.tftp_master_path, None) def _cache_instance_image(ctx, node): """Fetch the instance's image from Glance This method pulls the relevant AMI and associated kernel and ramdisk, and the deploy kernel and ramdisk from Glance, and writes them to the appropriate places on local disk. Both sets of kernel and ramdisk are needed for PXE booting, so these are stored under CONF.pxe.tftp_root. At present, the AMI is cached and certain files are injected. Debian/ubuntu-specific assumptions are made regarding the injected files. In a future revision, this functionality will be replaced by a more scalable and os-agnostic approach: the deployment ramdisk will fetch from Glance directly, and write its own last-mile configuration. """ d_info = _parse_driver_info(node) fileutils.ensure_tree(_get_image_dir_path(node.uuid)) image_path = _get_image_file_path(node.uuid) uuid = d_info['image_source'] LOG.debug(_("Fetching image %(ami)s for node %(uuid)s") % {'ami': uuid, 'uuid': node.uuid}) if not os.path.exists(image_path): _get_image(ctx, image_path, uuid, CONF.pxe.instance_master_path) return (uuid, image_path) def _get_tftp_image_info(node, ctx): """Generate the paths for tftp files for this instance Raises IronicException if - instance does not contain kernel_id or ramdisk_id - deploy_kernel_id or deploy_ramdisk_id can not be read from driver_info and defaults are not set """ #TODO(ghe): Called multiples times. Should we store image_info? d_info = _parse_driver_info(node) image_info = { 'deploy_kernel': [None, None], 'deploy_ramdisk': [None, None], } for label in image_info: image_info[label][0] = str(d_info[label]).split('/')[-1] image_info[label][1] = os.path.join(CONF.pxe.tftp_root, node.uuid, label) glance_service = service.Service(version=1, context=ctx) iproperties = glance_service.show(d_info['image_source'])['properties'] for label in ('kernel', 'ramdisk'): image_info[label] = [None, None] image_info[label][0] = str(iproperties[label + '_id']).split('/')[-1] image_info[label][1] = os.path.join(CONF.pxe.tftp_root, node.uuid, label) return image_info def _cache_images(node, pxe_info, ctx): """Prepare all the images for this instance.""" #TODO(ghe):parallized downloads #TODO(ghe): Embedded image client in ramdisk # - Get rid of iscsi, image location in baremetal service node and # image service, no master image, no image outdated... # - security concerns _cache_tftp_images(ctx, node, pxe_info) _cache_instance_image(ctx, node) #TODO(ghe): file injection # http://lists.openstack.org/pipermail/openstack-dev/2013-May/008728.html # http://lists.openstack.org/pipermail/openstack-dev/2013-July/011769.html # _inject_into_image(d_info, network_info, injected_files, admin_password) def _destroy_images(d_info, node_uuid): """Delete instance's image file.""" image_uuid = service_utils.parse_image_ref(d_info['image_source'])[0] utils.unlink_without_raise(_get_image_file_path(node_uuid)) utils.rmtree_without_raise(_get_image_dir_path(node_uuid)) master_image = os.path.join(CONF.pxe.instance_master_path, image_uuid) _unlink_master_image(master_image) def _create_token_file(task, node): """Save PKI token to file.""" token_file_path = _get_token_file_path(node['uuid']) token = task.context.auth_token if token: utils.write_to_file(token_file_path, token) else: utils.unlink_without_raise(token_file_path) def _destroy_token_file(node): """Delete PKI token file.""" token_file_path = _get_token_file_path(node['uuid']) utils.unlink_without_raise(token_file_path) def _dhcp_options_for_instance(): """Retrives the DHCP PXE boot options.""" return [{'opt_name': 'bootfile-name', 'opt_value': _get_pxe_bootfile_name()}, {'opt_name': 'server-ip-address', 'opt_value': CONF.pxe.tftp_server}, {'opt_name': 'tftp-server', 'opt_value': CONF.pxe.tftp_server} ] def _update_neutron(task, node): """Send or update the DHCP BOOT options to Neutron for this node.""" options = _dhcp_options_for_instance() vifs = _get_node_vif_ids(task) if not vifs: LOG.warning(_("No VIFs found for node %(node)s when attempting to " "update Neutron DHCP BOOT options."), {'node': node.uuid}) return # TODO(deva): decouple instantiation of NeutronAPI from task.context. # Try to use the user's task.context.auth_token, but if it # is not present, fall back to a server-generated context. # We don't need to recreate this in every method call. api = neutron.NeutronAPI(task.context) failures = [] for port_id, port_vif in vifs.iteritems(): try: api.update_port_dhcp_opts(port_vif, options) except exception.FailedToUpdateDHCPOptOnPort: failures.append(port_id) if failures: if len(failures) == len(vifs): raise exception.FailedToUpdateDHCPOptOnPort(_( "Failed to set DHCP BOOT options for any port on node %s.") % node.uuid) else: LOG.warning(_("Some errors were encountered when updating the " "DHCP BOOT options for node %(node)s on the " "following ports: %(ports)s."), {'node': node.uuid, 'ports': failures}) def _create_pxe_config(task, node, pxe_info): """Generate pxe configuration file and link mac ports to it for tftp booting. """ fileutils.ensure_tree(os.path.join(CONF.pxe.tftp_root, node.uuid)) fileutils.ensure_tree(os.path.join(CONF.pxe.tftp_root, 'pxelinux.cfg')) pxe_config_file_path = _get_pxe_config_file_path(node.uuid) pxe_config = _build_pxe_config(node, pxe_info, task.context) utils.write_to_file(pxe_config_file_path, pxe_config) for port in _get_node_mac_addresses(task, node): mac_path = _get_pxe_mac_path(port) utils.unlink_without_raise(mac_path) utils.create_link_without_raise(pxe_config_file_path, mac_path) class PXEDeploy(base.DeployInterface): """PXE Deploy Interface: just a stub until the real driver is ported.""" def validate(self, task, node): """Validate the driver-specific Node deployment info. :param task: a task from TaskManager. :param node: a single Node to validate. :returns: InvalidParameterValue. """ if not _get_node_mac_addresses(task, node): raise exception.InvalidParameterValue(_("Node %s does not have " "any port associated with it.") % node.uuid) _parse_driver_info(node) # Try to get the URL of the Ironic API try: # TODO(lucasagomes): Validate the format of the URL CONF.conductor.api_url or keystone.get_service_url() except (exception.CatalogFailure, exception.CatalogNotFound, exception.CatalogUnauthorized): raise exception.InvalidParameterValue(_( "Couldn't get the URL of the Ironic API service from the " "configuration file or keystone catalog.")) @task_manager.require_exclusive_lock def deploy(self, task, node): """Perform start deployment a node. Creates a temporary keystone token file, updates the Neutron DHCP port options for next boot, and issues a reboot request to the power driver. This causes the node to boot into the deployment ramdisk and triggers the next phase of PXE-based deployment via VendorPassthru._continue_deploy(). :param task: a TaskManager instance. :param node: the Node to act upon. :returns: deploy state DEPLOYING. """ # TODO(yuriyz): more secure way needed for pass auth token # to deploy ramdisk _create_token_file(task, node) _update_neutron(task, node) manager_utils.node_set_boot_device(task, node, 'pxe', persistent=True) manager_utils.node_power_action(task, node, states.REBOOT) return states.DEPLOYWAIT @task_manager.require_exclusive_lock def tear_down(self, task, node): """Tear down a previous deployment. Power off the node. All actual clean-up is done in the clean_up() method which should be called separately. :param task: a TaskManager instance. :param node: the Node to act upon. :returns: deploy state DELETED. """ manager_utils.node_power_action(task, node, states.POWER_OFF) # Remove the internal pxe_deploy_key attribute driver_info = node.driver_info if driver_info.pop('pxe_deploy_key', None): node.driver_info = driver_info node.save(task.context) return states.DELETED def prepare(self, task, node): """Prepare the deployment environment for this node. Generates the TFTP configuration for PXE-booting both the deployment and user images, fetches the images from Glance and adds them to the local cache. :param task: a TaskManager instance. :param node: the Node to act upon. """ # TODO(deva): optimize this if rerun on existing files pxe_info = _get_tftp_image_info(node, task.context) _create_pxe_config(task, node, pxe_info) _cache_images(node, pxe_info, task.context) def clean_up(self, task, node): """Clean up the deployment environment for this node. Delete the deploy and user images from the local cache, if no remaining active nodes require them. Removes the TFTP configuration files for this node. As a precaution, this method also ensures the keystone auth token file was removed. :param task: a TaskManager instance. :param node: the Node to act upon. """ # FIXME(ghe): Possible error to get image info if eliminated from # glance. Retrieve image info and store in db. # If we keep master images, no need to get the info, # and we may ignore this. pxe_info = _get_tftp_image_info(node, task.context) d_info = _parse_driver_info(node) for label in pxe_info: (uuid, path) = pxe_info[label] master_path = os.path.join(CONF.pxe.tftp_master_path, uuid) utils.unlink_without_raise(path) _unlink_master_image(master_path) utils.unlink_without_raise(_get_pxe_config_file_path( node.uuid)) for port in _get_node_mac_addresses(task, node): mac_path = _get_pxe_mac_path(port) utils.unlink_without_raise(mac_path) utils.rmtree_without_raise( os.path.join(CONF.pxe.tftp_root, node.uuid)) _destroy_images(d_info, node.uuid) _destroy_token_file(node) def take_over(self, task, node): _update_neutron(task, node) class VendorPassthru(base.VendorInterface): """Interface to mix IPMI and PXE vendor-specific interfaces.""" def _get_deploy_info(self, node, **kwargs): d_info = _parse_driver_info(node) deploy_key = kwargs.get('key') if d_info['deploy_key'] != deploy_key: raise exception.InvalidParameterValue(_("Deploy key is not match")) params = {'address': kwargs.get('address'), 'port': kwargs.get('port', '3260'), 'iqn': kwargs.get('iqn'), 'lun': kwargs.get('lun', '1'), 'image_path': _get_image_file_path(node.uuid), 'pxe_config_path': _get_pxe_config_file_path( node.uuid), 'root_mb': 1024 * int(d_info['root_gb']), 'swap_mb': int(d_info['swap_mb']), 'ephemeral_mb': 1024 * int(d_info['ephemeral_gb']), 'preserve_ephemeral': d_info['preserve_ephemeral'], } missing = [key for key in params.keys() if params[key] is None] if missing: raise exception.InvalidParameterValue(_( "Parameters %s were not passed to ironic" " for deploy.") % missing) # ephemeral_format is nullable params['ephemeral_format'] = d_info.get('ephemeral_format') return params def validate(self, task, node, **kwargs): method = kwargs['method'] if method == 'pass_deploy_info': self._get_deploy_info(node, **kwargs) else: raise exception.InvalidParameterValue(_( "Unsupported method (%s) passed to PXE driver.") % method) return True @task_manager.require_exclusive_lock def _continue_deploy(self, task, node, **kwargs): """Resume a deployment upon getting POST data from deploy ramdisk. This method raises no exceptions because it is intended to be invoked asynchronously as a callback from the deploy ramdisk. """ def _set_failed_state(msg): node.provision_state = states.DEPLOYFAIL node.target_provision_state = states.NOSTATE node.save(task.context) try: manager_utils.node_power_action(task, node, states.POWER_OFF) except Exception: msg = (_('Node %s failed to power off while handling deploy ' 'failure. This may be a serious condition. Node ' 'should be removed from Ironic or put in maintenance ' 'mode until the problem is resolved.') % node.uuid) LOG.error(msg) finally: # NOTE(deva): node_power_action() erases node.last_error # so we need to set it again here. node.last_error = msg node.save(task.context) if node.provision_state != states.DEPLOYWAIT: LOG.error(_('Node %s is not waiting to be deployed.') % node.uuid) return node.provision_state = states.DEPLOYING node.save(task.context) # remove cached keystone token immediately _destroy_token_file(node) params = self._get_deploy_info(node, **kwargs) ramdisk_error = kwargs.get('error') if ramdisk_error: LOG.error(_('Error returned from PXE deploy ramdisk: %s') % ramdisk_error) _set_failed_state(_('Failure in PXE deploy ramdisk.')) return LOG.info(_('Continuing deployment for node %(node)s, params ' '%(params)s') % {'node': node.uuid, 'params': params}) try: deploy_utils.deploy(**params) except Exception as e: LOG.error(_('PXE deploy failed for instance %(instance)s. ' 'Error: %(error)s') % {'instance': node.instance_uuid, 'error': e}) _set_failed_state(_('PXE driver failed to continue deployment.')) else: LOG.info(_('Deployment to node %s done') % node.uuid) node.provision_state = states.ACTIVE node.target_provision_state = states.NOSTATE node.save(task.context) def vendor_passthru(self, task, node, **kwargs): method = kwargs['method'] if method == 'pass_deploy_info': self._continue_deploy(task, node, **kwargs) ironic-2014.1.rc1/ironic/drivers/modules/fake.py0000664000175300017540000001076612316614116022611 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright 2013 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. """ Fake driver interfaces used in testing. This is also an example of some kinds of things which can be done within drivers. For instance, the MultipleVendorInterface class demonstrates how to load more than one interface and wrap them in some logic to route incoming vendor_passthru requests appropriately. This can be useful eg. when mixing functionality between a power interface and a deploy interface, when both rely on seprate vendor_passthru methods. """ from ironic.common import exception from ironic.common import states from ironic.drivers import base def _raise_unsupported_error(method=None): if method: raise exception.InvalidParameterValue(_( "Unsupported method (%s) passed through to vendor extension.") % method) raise exception.InvalidParameterValue(_( "Method not specified when calling vendor extension.")) class FakePower(base.PowerInterface): """Example implementation of a simple power interface.""" def validate(self, task, node): pass def get_power_state(self, task, node): return node.get('power_state', states.NOSTATE) def set_power_state(self, task, node, power_state): if power_state not in [states.POWER_ON, states.POWER_OFF]: raise exception.InvalidParameterValue(_("set_power_state called " "with an invalid power state: %s.") % power_state) node['power_state'] = power_state def reboot(self, task, node): pass class FakeDeploy(base.DeployInterface): """Example imlementation of a deploy interface that uses a separate power interface. """ def validate(self, task, node): pass def deploy(self, task, node): pass def tear_down(self, task, node): pass def prepare(self, task, node): pass def clean_up(self, task, node): pass def take_over(self, task, node): pass class FakeVendorA(base.VendorInterface): """Example implementation of a vendor passthru interface.""" def validate(self, task, node, **kwargs): method = kwargs.get('method') if method == 'first_method': bar = kwargs.get('bar') if not bar: raise exception.InvalidParameterValue(_( "Parameter 'bar' not passed to method 'first_method'.")) return _raise_unsupported_error(method) def _private_method(self, task, node, bar): return True if bar == 'baz' else False def vendor_passthru(self, task, node, **kwargs): method = kwargs.get('method') if method == 'first_method': bar = kwargs.get('bar') return self._private_method(task, node, bar) _raise_unsupported_error(method) class FakeVendorB(base.VendorInterface): """Example implementation of a secondary vendor passthru.""" def validate(self, task, node, **kwargs): method = kwargs.get('method') if method == 'second_method': bar = kwargs.get('bar') if not bar: raise exception.InvalidParameterValue(_( "Parameter 'bar' not passed to method 'second_method'.")) return _raise_unsupported_error(method) def _private_method(self, task, node, bar): return True if bar == 'kazoo' else False def vendor_passthru(self, task, node, **kwargs): method = kwargs.get('method') if method == 'second_method': bar = kwargs.get('bar') return self._private_method(task, node, bar) _raise_unsupported_error(method) class FakeConsole(base.ConsoleInterface): """Example implementation of a simple console interface.""" def validate(self, task, node): return True def start_console(self, task, node): pass def stop_console(self, task, node): pass def get_console(self, task, node): return {} ironic-2014.1.rc1/ironic/drivers/modules/__init__.py0000664000175300017540000000000012316614116023416 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/drivers/modules/ipmitool.py0000664000175300017540000003237312316614116023535 0ustar jenkinsjenkins00000000000000# coding=utf-8 # Copyright 2012 Hewlett-Packard Development Company, L.P. # Copyright (c) 2012 NTT DOCOMO, INC. # 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. """ Ironic IPMI power manager. """ import contextlib import os import stat import tempfile from oslo.config import cfg from ironic.common import exception from ironic.common import states from ironic.common import utils from ironic.conductor import task_manager from ironic.drivers import base from ironic.openstack.common import excutils from ironic.openstack.common import log as logging from ironic.openstack.common import loopingcall CONF = cfg.CONF LOG = logging.getLogger(__name__) VALID_BOOT_DEVICES = ['pxe', 'disk', 'safe', 'cdrom', 'bios'] VALID_PRIV_LEVELS = ['ADMINISTRATOR', 'CALLBACK', 'OPERATOR', 'USER'] @contextlib.contextmanager def _make_password_file(password): """Makes a temporary file that contains the password. :param password: the password :returns: the absolute pathname of the temporary file :raises: Exception from creating or writing to the temporary file """ try: fd, path = tempfile.mkstemp() os.fchmod(fd, stat.S_IRUSR | stat.S_IWUSR) with os.fdopen(fd, "w") as f: f.write(password) yield path utils.delete_if_exists(path) except Exception: with excutils.save_and_reraise_exception(): utils.delete_if_exists(path) def _parse_driver_info(node): """Gets the parameters required for ipmitool to access the node. :param node: the Node of interest. :returns: dictionary of parameters. :raises: InvalidParameterValue if any required parameters are missing. """ info = node.get('driver_info', {}) address = info.get('ipmi_address') username = info.get('ipmi_username') password = info.get('ipmi_password') port = info.get('ipmi_terminal_port') priv_level = info.get('ipmi_priv_level', 'ADMINISTRATOR') if not address: raise exception.InvalidParameterValue(_( "IPMI address not supplied to IPMI driver.")) if priv_level not in VALID_PRIV_LEVELS: valid_priv_lvls = ', '.join(VALID_PRIV_LEVELS) raise exception.InvalidParameterValue(_( "Invalid privilege level value:%(priv_level)s, the valid value" " can be one of %(valid_levels)s") % {'priv_level': priv_level, 'valid_levels': valid_priv_lvls}) return { 'address': address, 'username': username, 'password': password, 'port': port, 'uuid': node.get('uuid'), 'priv_level': priv_level } def _exec_ipmitool(driver_info, command): """Execute the ipmitool command. This uses the lanplus interface to communicate with the BMC device driver. :param driver_info: the ipmitool parameters for accessing a node. :param command: the ipmitool command to be executed. :returns: (stdout, stderr) from executing the command. :raises: some Exception from making the password file or from executing the command. """ args = ['ipmitool', '-I', 'lanplus', '-H', driver_info['address'], '-L', driver_info.get('priv_level') ] if driver_info['username']: args.append('-U') args.append(driver_info['username']) # 'ipmitool' command will prompt password if there is no '-f' option, # we set it to '\0' to write a password file to support empty password with _make_password_file(driver_info['password'] or '\0') as pw_file: args.append('-f') args.append(pw_file) args.extend(command.split(" ")) out, err = utils.execute(*args, attempts=3) LOG.debug(_("ipmitool stdout: '%(out)s', stderr: '%(err)s'"), {'out': out, 'err': err}) return out, err def _sleep_time(iter): """Return the time-to-sleep for the n'th iteration of a retry loop. This implementation increases exponentially. :param iter: iteration number :returns: number of seconds to sleep """ if iter <= 1: return 1 return iter ** 2 def _set_and_wait(target_state, driver_info): """Helper function for DynamicLoopingCall. This method changes the power state and polls the BMCuntil the desired power state is reached, or CONF.ipmi.retry_timeout would be exceeded by the next iteration. This method assumes the caller knows the current power state and does not check it prior to changing the power state. Most BMCs should be fine, but if a driver is concerned, the state should be checked prior to calling this method. :param target_state: desired power state :param driver_info: the ipmitool parameters for accessing a node. :returns: one of ironic.common.states :raises: IPMIFailure on an error from ipmitool (from _power_status call). """ if target_state == states.POWER_ON: state_name = "on" elif target_state == states.POWER_OFF: state_name = "off" def _wait(mutable): try: # Only issue power change command once if mutable['iter'] < 0: _exec_ipmitool(driver_info, "power %s" % state_name) else: mutable['power'] = _power_status(driver_info) except Exception: # Log failures but keep trying LOG.warning(_("IPMI power %(state)s failed for node %(node)s."), {'state': state_name, 'node': driver_info['uuid']}) finally: mutable['iter'] += 1 if mutable['power'] == target_state: raise loopingcall.LoopingCallDone() sleep_time = _sleep_time(mutable['iter']) if (sleep_time + mutable['total_time']) > CONF.ipmi.retry_timeout: # Stop if the next loop would exceed maximum retry_timeout LOG.error(_('IPMI power %(state)s timed out after ' '%(tries)s retries.'), {'state': state_name, 'tries': mutable['iter']}) mutable['power'] = states.ERROR raise loopingcall.LoopingCallDone() else: mutable['total_time'] += sleep_time return sleep_time # Use mutable objects so the looped method can change them. # Start 'iter' from -1 so that the first two checks are one second apart. status = {'power': None, 'iter': -1, 'total_time': 0} timer = loopingcall.DynamicLoopingCall(_wait, status) timer.start().wait() return status['power'] def _power_on(driver_info): """Turn the power ON for this node. :param driver_info: the ipmitool parameters for accessing a node. :returns: one of ironic.common.states POWER_ON or ERROR. :raises: IPMIFailure on an error from ipmitool (from _power_status call). """ return _set_and_wait(states.POWER_ON, driver_info) def _power_off(driver_info): """Turn the power OFF for this node. :param driver_info: the ipmitool parameters for accessing a node. :returns: one of ironic.common.states POWER_OFF or ERROR. :raises: IPMIFailure on an error from ipmitool (from _power_status call). """ return _set_and_wait(states.POWER_OFF, driver_info) def _power_status(driver_info): """Get the power status for a node. :param driver_info: the ipmitool access parameters for a node. :returns: one of ironic.common.states POWER_OFF, POWER_ON or ERROR. :raises: IPMIFailure on an error from ipmitool. """ cmd = "power status" try: out_err = _exec_ipmitool(driver_info, cmd) except Exception as e: LOG.warning(_("IPMI power status failed for node %(node_id)s with " "error: %(error)s.") % {'node_id': driver_info['uuid'], 'error': e}) raise exception.IPMIFailure(cmd=cmd) if out_err[0] == "Chassis Power is on\n": return states.POWER_ON elif out_err[0] == "Chassis Power is off\n": return states.POWER_OFF else: return states.ERROR class IPMIPower(base.PowerInterface): def validate(self, task, node): """Validate driver_info for ipmitool driver. Check that node['driver_info'] contains IPMI credentials and BMC is accessible with this credentials. :param task: a task from TaskManager. :param node: Single node object. :raises: InvalidParameterValue if required ipmi parameters are missing. """ driver_info = _parse_driver_info(node) try: _exec_ipmitool(driver_info, "mc guid") except Exception as e: msg = _("BMC inaccessible for node %(node)s: " "%(error)s") % {'node': node.uuid, 'error': e} raise exception.InvalidParameterValue(msg) def get_power_state(self, task, node): """Get the current power state. :param task: a TaskManager instance. :param node: The Node. :returns: one of ironic.common.states POWER_OFF, POWER_ON or ERROR. :raises: InvalidParameterValue if required ipmi parameters are missing. :raises: IPMIFailure on an error from ipmitool (from _power_status call). """ driver_info = _parse_driver_info(node) return _power_status(driver_info) @task_manager.require_exclusive_lock def set_power_state(self, task, node, pstate): """Turn the power on or off. :param task: a TaskManager instance. :param node: The Node. :param pstate: The desired power state, one of ironic.common.states POWER_ON, POWER_OFF. :raises: InvalidParameterValue if required ipmi parameters are missing or if an invalid power state was specified. :raises: PowerStateFailure if the power couldn't be set to pstate. """ driver_info = _parse_driver_info(node) if pstate == states.POWER_ON: state = _power_on(driver_info) elif pstate == states.POWER_OFF: state = _power_off(driver_info) else: raise exception.InvalidParameterValue(_("set_power_state called " "with invalid power state %s.") % pstate) if state != pstate: raise exception.PowerStateFailure(pstate=pstate) @task_manager.require_exclusive_lock def reboot(self, task, node): """Cycles the power to a node. :param task: a TaskManager instance. :param node: The Node. :raises: InvalidParameterValue if required ipmi parameters are missing. :raises: PowerStateFailure if the final state of the node is not POWER_ON. """ driver_info = _parse_driver_info(node) _power_off(driver_info) state = _power_on(driver_info) if state != states.POWER_ON: raise exception.PowerStateFailure(pstate=states.POWER_ON) class VendorPassthru(base.VendorInterface): @task_manager.require_exclusive_lock def _set_boot_device(self, task, node, device, persistent=False): """Set the boot device for a node. :param task: a TaskManager instance. :param node: The Node. :param device: Boot device. One of [pxe, disk, cdrom, safe, bios]. :param persistent: Whether to set next-boot, or make the change permanent. Default: False. :raises: InvalidParameterValue if an invalid boot device is specified or if required ipmi parameters are missing. :raises: IPMIFailure on an error from ipmitool. """ if device not in VALID_BOOT_DEVICES: raise exception.InvalidParameterValue(_( "Invalid boot device %s specified.") % device) cmd = "chassis bootdev %s" % device if persistent: cmd = cmd + " options=persistent" driver_info = _parse_driver_info(node) try: out, err = _exec_ipmitool(driver_info, cmd) # TODO(deva): validate (out, err) and add unit test for failure except Exception: raise exception.IPMIFailure(cmd=cmd) def validate(self, node, **kwargs): method = kwargs['method'] if method == 'set_boot_device': device = kwargs.get('device') if device not in VALID_BOOT_DEVICES: raise exception.InvalidParameterValue(_( "Invalid boot device %s specified.") % device) else: raise exception.InvalidParameterValue(_( "Unsupported method (%s) passed to IPMItool driver.") % method) return True def vendor_passthru(self, task, node, **kwargs): method = kwargs['method'] if method == 'set_boot_device': return self._set_boot_device( task, node, kwargs.get('device'), kwargs.get('persistent', False)) ironic-2014.1.rc1/ironic/drivers/modules/ssh.py0000664000175300017540000004125512316614116022475 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """ Ironic SSH power manager. Provides basic power control of virtual machines via SSH. For use in dev and test environments. Currently supported environments are: Virtual Box (vbox) Virsh (virsh) """ import os from oslo.config import cfg from ironic.common import exception from ironic.common import states from ironic.common import utils from ironic.conductor import task_manager from ironic.drivers import base from ironic.openstack.common import log as logging from ironic.openstack.common import processutils libvirt_opts = [ cfg.StrOpt('libvirt_uri', default='qemu:///system', help='libvirt uri') ] CONF = cfg.CONF CONF.register_opts(libvirt_opts, group='ssh') LOG = logging.getLogger(__name__) def _get_command_sets(virt_type): if virt_type == 'vbox': return { 'base_cmd': '/usr/bin/VBoxManage', 'start_cmd': 'startvm {_NodeName_}', 'stop_cmd': 'controlvm {_NodeName_} poweroff', 'reboot_cmd': 'controlvm {_NodeName_} reset', 'list_all': "list vms|awk -F'\"' '{print $2}'", 'list_running': 'list runningvms', 'get_node_macs': ("showvminfo --machinereadable {_NodeName_} | " "grep " '"macaddress" | awk -F ' "'" '"' "' '{print $2}'") } elif virt_type == 'vmware': return { 'base_cmd': '/bin/vim-cmd', 'start_cmd': 'vmsvc/power.on {_NodeName_}', 'stop_cmd': 'vmsvc/power.off {_NodeName_}', 'reboot_cmd': 'vmsvc/power.reboot {_NodeName_}', 'list_all': "vmsvc/getallvms | awk '$1 ~ /^[0-9]+$/ {print $1}'", # NOTE(arata): In spite of its name, list_running_cmd shows a # single vmid, not a list. But it is OK. 'list_running': ( "vmsvc/power.getstate {_NodeName_} | " "grep 'Powered on' >/dev/null && " "echo '\"{_NodeName_}\"' || true"), # NOTE(arata): `true` is needed to handle a false vmid, which can # be returned by list_cmd. In that case, get_node_macs # returns an empty list rather than fails with # non-zero status code. 'get_node_macs': ( "vmsvc/device.getdevices {_NodeName_} | " "grep macAddress | awk -F '\"' '{print $2}' || true"), } elif virt_type == "virsh": # NOTE(NobodyCam): changes to the virsh commands will impact CI # see https://review.openstack.org/83906 # Change-Id: I160e4202952b7551b855dc7d91784d6a184cb0ed # for more detail. virsh_cmds = { 'base_cmd': '/usr/bin/virsh', 'start_cmd': 'start {_NodeName_}', 'stop_cmd': 'destroy {_NodeName_}', 'reboot_cmd': 'reset {_NodeName_}', 'list_all': "list --all | tail -n +2 | awk -F\" \" '{print $2}'", 'list_running': ("list --all|grep running | " "awk -v qc='\"' -F\" \" '{print qc$2qc}'"), 'get_node_macs': ("dumpxml {_NodeName_} | grep " '"mac address" | awk -F' '"' "'" '" ' "'{print $2}' | tr -d ':'") } if CONF.ssh.libvirt_uri: virsh_cmds['base_cmd'] += ' --connect %s' % CONF.ssh.libvirt_uri return virsh_cmds else: raise exception.InvalidParameterValue(_( "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, ") % {'virt_type': virt_type}) def _normalize_mac(mac): return mac.replace('-', '').replace(':', '').lower() def _ssh_execute(ssh_obj, cmd_to_exec): """Executes a command via ssh. Executes a command via ssh and returns a list of the lines of the output from the command. :param ssh_obj: paramiko.SSHClient, an active ssh connection. :param cmd_to_exec: command to execute. :returns: list of the lines of output from the command. :raises: SSHCommandFailed on an error from ssh. """ try: output_list = processutils.ssh_execute(ssh_obj, cmd_to_exec)[0].split('\n') except Exception as e: LOG.debug(_("Cannot execute SSH cmd %(cmd)s. Reason: %(err)s.") % {'cmd': cmd_to_exec, 'err': e}) raise exception.SSHCommandFailed(cmd=cmd_to_exec) return output_list def _parse_driver_info(node): """Gets the information needed for accessing the node. :param node: the Node of interest. :returns: dictionary of information. :raises: InvalidParameterValue if any required parameters are missing or incorrect. """ info = node.get('driver_info', {}) address = info.get('ssh_address') username = info.get('ssh_username') password = info.get('ssh_password') try: port = int(info.get('ssh_port', 22)) except ValueError: raise exception.InvalidParameterValue(_( "SSHPowerDriver requires ssh_port to be integer value")) key_contents = info.get('ssh_key_contents') key_filename = info.get('ssh_key_filename') virt_type = info.get('ssh_virt_type') # NOTE(deva): we map 'address' from API to 'host' for common utils res = { 'host': address, 'username': username, 'port': port, 'virt_type': virt_type, 'uuid': node.get('uuid') } if not virt_type: raise exception.InvalidParameterValue(_( "SSHPowerDriver requires virt_type be set.")) cmd_set = _get_command_sets(virt_type) res['cmd_set'] = cmd_set if not address or not username: raise exception.InvalidParameterValue(_( "SSHPowerDriver requires both address and username be set.")) # Only one credential may be set (avoids complexity around having # precedence etc). if len(filter(None, (password, key_filename, key_contents))) != 1: raise exception.InvalidParameterValue(_( "SSHPowerDriver requires one and only one of password, " "key_contents and key_filename to be set.")) if password: res['password'] = password elif key_contents: res['key_contents'] = key_contents else: if not os.path.isfile(key_filename): raise exception.InvalidParameterValue(_( "SSH key file %s not found.") % key_filename) res['key_filename'] = key_filename return res def _get_power_status(ssh_obj, driver_info): """Returns a node's current power state. :param ssh_obj: paramiko.SSHClient, an active ssh connection. :param driver_info: information for accessing the node. :returns: one of ironic.common.states POWER_OFF, POWER_ON. :raises: NodeNotFound """ power_state = None cmd_to_exec = "%s %s" % (driver_info['cmd_set']['base_cmd'], driver_info['cmd_set']['list_running']) running_list = _ssh_execute(ssh_obj, cmd_to_exec) # Command should return a list of running vms. If the current node is # not listed then we can assume it is not powered on. node_name = _get_hosts_name_for_node(ssh_obj, driver_info) if node_name: for node in running_list: if not node: continue if node_name in node: power_state = states.POWER_ON break if not power_state: power_state = states.POWER_OFF else: err_msg = _('Node "%(host)s" with MAC address %(mac)s not found.') LOG.error(err_msg, {'host': driver_info['host'], 'mac': driver_info['macs']}) raise exception.NodeNotFound(node=driver_info['host']) return power_state def _get_connection(node): """Returns an SSH client connected to a node. :param node: the Node. :returns: paramiko.SSHClient, an active ssh connection. """ return utils.ssh_connect(_parse_driver_info(node)) def _get_hosts_name_for_node(ssh_obj, driver_info): """Get the name the host uses to reference the node. :param ssh_obj: paramiko.SSHClient, an active ssh connection. :param driver_info: information for accessing the node. :returns: the name or None if not found. """ matched_name = None cmd_to_exec = "%s %s" % (driver_info['cmd_set']['base_cmd'], driver_info['cmd_set']['list_all']) full_node_list = _ssh_execute(ssh_obj, cmd_to_exec) LOG.debug(_("Retrieved Node List: %s") % repr(full_node_list)) # for each node check Mac Addresses for node in full_node_list: if not node: continue LOG.debug(_("Checking Node: %s's Mac address.") % node) cmd_to_exec = "%s %s" % (driver_info['cmd_set']['base_cmd'], driver_info['cmd_set']['get_node_macs']) cmd_to_exec = cmd_to_exec.replace('{_NodeName_}', node) hosts_node_mac_list = _ssh_execute(ssh_obj, cmd_to_exec) for host_mac in hosts_node_mac_list: if not host_mac: continue for node_mac in driver_info['macs']: if not node_mac: continue if _normalize_mac(host_mac) in _normalize_mac(node_mac): LOG.debug(_("Found Mac address: %s") % node_mac) matched_name = node break if matched_name: break if matched_name: break return matched_name def _power_on(ssh_obj, driver_info): """Power ON this node. :param ssh_obj: paramiko.SSHClient, an active ssh connection. :param driver_info: information for accessing the node. :returns: one of ironic.common.states POWER_ON or ERROR. """ current_pstate = _get_power_status(ssh_obj, driver_info) if current_pstate == states.POWER_ON: _power_off(ssh_obj, driver_info) node_name = _get_hosts_name_for_node(ssh_obj, driver_info) cmd_to_power_on = "%s %s" % (driver_info['cmd_set']['base_cmd'], driver_info['cmd_set']['start_cmd']) cmd_to_power_on = cmd_to_power_on.replace('{_NodeName_}', node_name) _ssh_execute(ssh_obj, cmd_to_power_on) current_pstate = _get_power_status(ssh_obj, driver_info) if current_pstate == states.POWER_ON: return current_pstate else: return states.ERROR def _power_off(ssh_obj, driver_info): """Power OFF this node. :param ssh_obj: paramiko.SSHClient, an active ssh connection. :param driver_info: information for accessing the node. :returns: one of ironic.common.states POWER_OFF or ERROR. """ current_pstate = _get_power_status(ssh_obj, driver_info) if current_pstate == states.POWER_OFF: return current_pstate node_name = _get_hosts_name_for_node(ssh_obj, driver_info) cmd_to_power_off = "%s %s" % (driver_info['cmd_set']['base_cmd'], driver_info['cmd_set']['stop_cmd']) cmd_to_power_off = cmd_to_power_off.replace('{_NodeName_}', node_name) _ssh_execute(ssh_obj, cmd_to_power_off) current_pstate = _get_power_status(ssh_obj, driver_info) if current_pstate == states.POWER_OFF: return current_pstate else: return states.ERROR def _get_nodes_mac_addresses(task, node): """Get all mac addresses for a node. :param task: An instance of `ironic.manager.task_manager.TaskManager`. :param node: the Node of interest. :returns: a list of all the MAC addresses for the node. """ for r in task.resources: if r.node.id == node['id']: return [p.address for p in r.ports] class SSHPower(base.PowerInterface): """SSH Power Interface. This PowerInterface class provides a mechanism for controlling the power state of virtual machines via SSH. NOTE: This driver supports VirtualBox and Virsh commands. NOTE: This driver does not currently support multi-node operations. """ def validate(self, task, node): """Check that the node's 'driver_info' is valid. Check that the node's 'driver_info' contains the requisite fields and that an SSH connection to the node can be established. :param task: a task from TaskManager. :param node: Single node object. :raises: InvalidParameterValue if any connection parameters are incorrect or if ssh failed to connect to the node. """ if not _get_nodes_mac_addresses(task, node): raise exception.InvalidParameterValue(_("Node %s does not have " "any port associated with it.") % node.uuid) try: _get_connection(node) except exception.SSHConnectFailed as e: raise exception.InvalidParameterValue(_("SSH connection cannot" " be established: %s") % e) def get_power_state(self, task, node): """Get the current power state. Poll the host for the current power state of the node. :param task: An instance of `ironic.manager.task_manager.TaskManager`. :param node: A single node. :returns: power state. One of :class:`ironic.common.states`. :raises: InvalidParameterValue if any connection parameters are incorrect. :raises: NodeNotFound. :raises: SSHCommandFailed on an error from ssh. :raises: SSHConnectFailed if ssh failed to connect to the node. """ driver_info = _parse_driver_info(node) driver_info['macs'] = _get_nodes_mac_addresses(task, node) ssh_obj = _get_connection(node) return _get_power_status(ssh_obj, driver_info) @task_manager.require_exclusive_lock def set_power_state(self, task, node, pstate): """Turn the power on or off. Set the power state of a node. :param task: An instance of `ironic.manager.task_manager.TaskManager`. :param node: A single node. :param pstate: Either POWER_ON or POWER_OFF from :class: `ironic.common.states`. :raises: InvalidParameterValue if any connection parameters are incorrect, or if the desired power state is invalid. :raises: NodeNotFound. :raises: PowerStateFailure if it failed to set power state to pstate. :raises: SSHCommandFailed on an error from ssh. :raises: SSHConnectFailed if ssh failed to connect to the node. """ driver_info = _parse_driver_info(node) driver_info['macs'] = _get_nodes_mac_addresses(task, node) ssh_obj = _get_connection(node) if pstate == states.POWER_ON: state = _power_on(ssh_obj, driver_info) elif pstate == states.POWER_OFF: state = _power_off(ssh_obj, driver_info) else: raise exception.InvalidParameterValue(_("set_power_state called " "with invalid power state %s.") % pstate) if state != pstate: raise exception.PowerStateFailure(pstate=pstate) @task_manager.require_exclusive_lock def reboot(self, task, node): """Cycles the power to a node. Power cycles a node. :param task: An instance of `ironic.manager.task_manager.TaskManager`. :param node: A single node. :raises: InvalidParameterValue if any connection parameters are incorrect. :raises: NodeNotFound. :raises: PowerStateFailure if it failed to set power state to POWER_ON. :raises: SSHCommandFailed on an error from ssh. :raises: SSHConnectFailed if ssh failed to connect to the node. """ driver_info = _parse_driver_info(node) driver_info['macs'] = _get_nodes_mac_addresses(task, node) ssh_obj = _get_connection(node) current_pstate = _get_power_status(ssh_obj, driver_info) if current_pstate == states.POWER_ON: _power_off(ssh_obj, driver_info) state = _power_on(ssh_obj, driver_info) if state != states.POWER_ON: raise exception.PowerStateFailure(pstate=states.POWER_ON) ironic-2014.1.rc1/ironic/__init__.py0000664000175300017540000000134212316614116020302 0ustar jenkinsjenkins00000000000000# Copyright (c) 2014 Hewlett-Packard Development Company, L.P. # 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 os.environ['EVENTLET_NO_GREENDNS'] = 'yes' import eventlet eventlet.monkey_patch(os=False) ironic-2014.1.rc1/ironic/version.py0000664000175300017540000000130112316614116020223 0ustar jenkinsjenkins00000000000000# Copyright 2011 OpenStack Foundation # 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 pbr.version version_info = pbr.version.VersionInfo('ironic') ironic-2014.1.rc1/ironic/locale/0000775000175300017540000000000012316614636017437 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/it/0000775000175300017540000000000012316614636020053 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/it/LC_MESSAGES/0000775000175300017540000000000012316614636021640 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/it/LC_MESSAGES/ironic.po0000664000175300017540000016651612316614116023473 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:25+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Italian (http://www.transifex.com/projects/p/openstack/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "E' stato riscontrato un errore sconosciuto" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "Eccezione nell'operazione di formattazione della stringa" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "Non autorizzato." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "Parametri inaccettabili." #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "Era previsto un uuid ma è stato ricevuto %(uuid)s." #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "L'immagine %(image_id)s non è accettabile: %(reason)s" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "Impossibile trovare la risorsa." #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "Impossibile trovare l'immagine %(image_id)s." #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "Connessione per l'host glance %(host)s:%(port)s non riuscita: %(reason)s" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "Non autorizzato per l'immagine %(image_id)s." #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "href immagine %(image_href)s non valido." #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "Impossibile trovare la configurazione in %(path)s" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "Elenco istantanee rilevato ma nessuna intestazione è stata trovata!" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "analisi di 'qemu-img info' non riuscita." #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "fmt=%(fmt)s sottoposto a backup da: %(backing_file)s" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "Convertito in non elaborato, ma il formato ora è %s" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "Backend non valido: %s" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "Ricaricamento file memorizzato nella cache %s" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "Impossibile rimuovere tmpdir: %s" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "Impossibile scollegare %(path)s, errore: %(e)s" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "Impossibile rimuovere la dir %(path)s, errore: %(e)s" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "Impossibile creare symlink da %(source)s in %(link)s, errore: %(e)s" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "Errore durante il tentativo di contattare il server glance '%(host)s:%(port)s' per '%(method)s', %(extra)s." #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "ipmitool stdout: '%(out)s', stderr: '%(err)s'" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "Creazione PXE config per la distribuzione %s." #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "VCPU non impostate; è possibile che la raccolta CPU sia stata interrotta" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "%(host_state)s non dispone di %(requested_disk)s MB di disco utilizzabile, disponde solo di %(usable_disk_mb)s MB di disco utilizzabile." #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "%(host_state)s non dispone di %(requested_ram)s MB di ram utilizzabile, dispone solo di %(usable_ram)s MB di ram utilizzabile." #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "Eccezione originale in corso di eliminazione: %s" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "Impossibile rilasciare il blocco acquisito `%s`" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "Obsoleto: %s" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "La funzione syslog deve essere una tra le seguenti: %s" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "Chiamata errata alla configurazione obsoleta: %(msg)s" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "La durata dell'attività eseguita ha superato l'intervallo di %s secondi" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "chiamata in loop a durata fissa" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "chiamata in loop dinamico" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "Argomento imprevisto per creazione attività periodica: %(arg)s." #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "Abbadono dell'attività periodica %(task)s perché l'intervalo è negativo" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "Abbadono dell'attività periodica %(task)s perché è disabilitata" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "Esecuzione attività periodica %(full_task_name)s" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "Errore durante %(full_task_name)s: %(e)s" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "Impossibile comprendere la regola %(rule)s" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "Nessun gestore per le corrispondenze di tipo %s" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "Impossibile comprendere la regola %(rule)r" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "Gli argomenti parola chiave ricevuti sono sconosciuti per utils.execute: %r" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "Esecuzione del comando (sottoprocesso): %s" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "Il risultato é %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "%r non riuscito. Nuovo tentativo." #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "Eseguendo cmd (SSH): %s" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "Ambiente non supportato in SSH" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "input_processo non supportato in SSH" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "Impostazione completa di CONF:" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "Rilevato %s, esistente" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "Il processo principale è stato interrotto inaspettatamente, uscire" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "Eccezione non gestita" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "Sblocco troppo veloce, attendere" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "Child avviato %d" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "Avvio %d operatori" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "Child %(pid)d interrotto dal segnale %(sig)d" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "Child %(pid)s terminato con stato %(code)d" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "pid %d non incluso nell'elenco child" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "Intercettato %s, arresto in corso dei children" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "In attesa %d degli elementi secondari per uscire" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "Impossibile trovare il file_cert : %s" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "Impossibile trovare il file_ca: %s" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "Impossibile trovare il file_chiavi : %s" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "Quando si esegue il server in modalità SSL, è necessario specificare sia un valore dell'opzione cert_file che key_file nel file di configurazione" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "Moltiplicatore byte sconosciuto: %s" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "Parametro non valido: Unicode non è supportato dal database corrente." #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "la versione deve essere un numero intero" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "La chiave di ordinamento fornita non è valida." #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "Direzione ordinamento sconosciuta, deve essere 'desc' o 'asc'" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "Valore read_deleted non riconosciuto '%s'" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "Specificar la colonna %s nel parametro col_name_col_instance. È richiesto perché la colonna ha un tipo non supportato da sqlite)." #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "Il parametro col_name_col_instance ha un tipo errato di istanza della colonna per la colonna %s. Deve essere l'istanza di sqlalchemy.Column." #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "%s non ha priorità valide" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "Problema '%(e)s' durante il tentativo di inviare al sistema di notifiche. Payload=%(payload)s" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "Impossibile caricare il programma di notifica %s. Queste notifiche non verranno inviate." #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "Impossibile inviare la notifica a %(topic)s. Payload=%(message)s" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "Pool che crea una nuova connessione" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "contesto decompresso: %s" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "UNIQUE_ID è %s." #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "ricevuto %s" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "nessun metodo per il messaggio: %s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "nessun metodo per il messagggio: %s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "Eccezione prevista durante la gestione del messaggio (%s)" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "Eccezione durante la gestione del messaggio" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "Esecuzione chiamata sincrona su %s ..." #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "MSG_ID é %s" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "Esecuzione cast asincrono su %s..." #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "Rendere fanout cast asincrono..." #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "Invio %(event_type)s a %(topic)s" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "Si è verificata un'eccezione relativa a RPC sconosciuta." #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "Errore remoto: %(exc_type)s %(value)s\n%(traceback)s." #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "Trovato messaggio duplicato (%(msg_id)s). Viene ignorato." #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "Riutilizzo invalido di una connessione RPC." #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "La versione RPC specificata, %(version)s, non è supportata da questo endpoint." #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "Versione della busta RPC specificata, %(version)s, non supportata da questo endpoint." #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "Sollevando eccezione %s al chiamante" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "Riconnessione al server AMQP su %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "Connesso al server AMQP su %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "Impossibile connettersi al server AMQP su %(hostname)s:%(port)d dopo %(max_retries)d tentativi: %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "Il server AMQP in %(hostname)s:%(port)d non è raggiungibile: %(err_str)s. Riprovare tra %(sleep_time)d secondi." #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "Impossibile dichiarare il consumer per il topic '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "Timeout in attesa della risposta RPC: %s" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "Impossibile utilizzare il messaggio dalla coda: %s" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "Impossibile pubblicare il messaggio per il topic '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "Impossibile elaborare il messaggio... viene ignorato." #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "Impossibile connettersi al server AMQP: %(e)s. Attendere %(delay)s secondi" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "Connesso al serve AMQP su %s" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "Code AMQP ristabilite" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "Errore durante l'elaborazione del messaggio. Viene ignorato." #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "Serializzazione JSON non riuscita." #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "Deserializzazione: %s" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "Connessione a %(addr)s con %(type)s" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "-> Sottoscritto a %(subscribe)s" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "-> bind %(bind)s" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "Impossibile aprire il socket." #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "Sottoscrizione per %s" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "Impossibile ricevere su questo socket." #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "Impossibile inviare a questo socket." #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "Esecuzione funzione con contesto: %s" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "Invio risposta" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "Il messaggio RPC non include il metodo." #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "Registrazione del reattore" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "Reactor interno registrato" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "Utilizzo socket" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "Creazione del proxy per il topic: %s" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "L'argomento conteneva caratteri pericolosi." #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "Creazione file socket topic non riuscita." #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "Buffer di backlog per-topic locale pieno per il topic %(topic)s. Eliminare il messaggio." #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "Impossibile creare il daemon ricevente ZeroMQ. Il socket potrebbe già essere in uso." #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "CONSUMER RECEIVED DATA: %s" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "Versione envelope ZMQ non supportata o sconosciuta." #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "La registrazione dell'argomento viene ignorata. È già registrata." #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "Il consumer è un zmq.%s" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "Creazione payload" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "Creazione socket coda per il waiter di risposta" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "Invio cast" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "Cast inviato; In attesa di risposta" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "Messaggio ricevuto: %s" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "Decompressione risposta" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "Envelope ZMQ restituito non è supportato o è sconosciuto" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "Messaggio RPC non valido." #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "Invio messaggi a: %s" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "Nessun risultato di matchmaker. Nessun casting." #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "Nessuna corrispondenza per matchmaker." #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "Corrispondenza non trovata da MatchMaker." #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "Matchmaker non implementa la registrazione o heartbeat." #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "Registrare prima di avviare heartbeat." #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "Nessuna chiave che definisce l'host per topic '%s', consultare ringfile" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "Creazione connessione consumer per il servizio %s" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/ru_RU/0000775000175300017540000000000012316614636020473 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ru_RU/LC_MESSAGES/0000775000175300017540000000000012316614636022260 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ru_RU/LC_MESSAGES/ironic.po0000664000175300017540000014726412316614116024112 0ustar jenkinsjenkins00000000000000# Russian (Russia) translations for ironic. # Copyright (C) 2013 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-28 06:06+0000\n" "PO-Revision-Date: 2013-11-12 16:15+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Russian (Russia) " "(http://www.transifex.com/projects/p/openstack/language/ru_RU/)\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state" " %(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains" " nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not " "found in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor " "workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. " "Updating registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new " "state is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node " "state %(actual)s does not match expected state '%(state)s'. Updating DB " "state to '%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. " "Error: %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected " "state '%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted" " by another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with " "maintanence mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested " "state = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while " "aborting. More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following " "error: %(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details:" " %(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following " "error: %(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one " "of %(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:432 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed" " to ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason:" " %(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:129 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:156 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:357 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:387 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:485 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP " "BOOT options." msgstr "" #: ironic/drivers/modules/pxe.py:504 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:508 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node" " %(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:543 ironic/drivers/modules/ssh.py:377 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:554 msgid "" "Couldn't get the URL of the Ironic API service from the configuration " "file or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:664 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:681 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:695 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:716 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in " "maintenance mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:728 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:740 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:742 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:745 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:754 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:756 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:111 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:136 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:159 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:175 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:182 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:187 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:196 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:229 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:260 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:265 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:278 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:382 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after " "%(retries)d retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node " "%(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp " "the current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-" "deleted feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column " "%s It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could" " be a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method:" " \"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this " "endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/es/0000775000175300017540000000000012316614636020046 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/es/LC_MESSAGES/0000775000175300017540000000000012316614636021633 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/es/LC_MESSAGES/ironic.po0000664000175300017540000017435712316614116023470 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: # Alberto Molina Coballes , 2014 msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 19:40+0000\n" "Last-Translator: Alberto Molina Coballes \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/openstack/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "Método no especificado" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "id de chasis no especificado." #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "id de nodo no especificado." #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "El límite debe ser positivo" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "Sirviendo en http://%(host)s:%(port)s" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "Configuración:" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "Ha ocurrido una excepción desconocida." #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "Excepción en la operación de formato de serie" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "No Autorizado." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "Operación no permitida." #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "Parámetros inaceptables." #: ironic/common/exception.py:112 msgid "Conflict." msgstr "Conflicto." #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "Estado de recurso no válido." #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "Se esperaba un uuid pero se ha recibido %(uuid)s." #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "Se espera un uuid o entero pero se ha recibido %(identity)s." #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "Se espera una dirección MAC pero se ha recibido %(mac)s." #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "La imagen %(image_id)s es inaceptable: %(reason)s" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "No se ha podido encontrar el recurso." #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "No se ha podido encontrar la imagen %(image_id)s. " #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "No se ha podido encontrar el nodo %(node)s." #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "Nodo %(node)s está asociado a la instancia %(instance)s." #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "No se ha podido encontrar el puerto %(port)s." #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "No se ha podido encontrar el chasis %(chassis)s." #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "Ha fallado el establecimiento de conexión SSH al host %(host)s." #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "Tipo de objeto no soportado %(objtype)s" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "No se puede ejecutar %(method)s en un objecto huérfano %(objtype)s" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "Versión %(objver)s de %(objname)s no está soportada" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "La conexión con el host glance %(host)s:%(port)s ha fallado: %(reason)s" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "No está autorizado para la imagen %(image_id)s." #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "Href de imagen %(image_href)s no válida." #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "El endpoint proporcionado no es válido" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "No es posible comunicarse con el servidor." #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "No se ha podido encontrar configuración en %(path)s" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "Se ha encontrado la lista de instantáneas pero no se ha encontrado ninguna cabecera." #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "Se ha encontrado un error en el análisis de 'qemu-img info'." #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "fmt=%(fmt)s respaldado por: %(backing_file)s" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "Convertido a sin formato, pero el formato es ahora %s" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "Fichero JSON que representa la política." #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "Ha fallado la conexión SSH: %s" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "backend inválido: %s" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "Volviendo a cargar el archivo en memoria caché %s " #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "No se ha podido eliminar directorio temporal: %s" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "No se ha podido desenlazar %(path)s, error: %(e)s" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "No se ha podido eliminar directorio %(path)s, error: %(e)s" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "No se ha podido crear enlace simbólico de %(source)s a %(link)s, error: %(e)s" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "Error al contactar con el servidor de glance '%(host)s:%(port)s' para '%(method)s', %(extra)s." #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "no soportado" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "El nodo no se encuentra en modo mantenimiento" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "deshabilitado" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "Habilitando" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "Deshabilitando" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "Ha fallado la detección del dispositivo raíz UUID." #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "Comando: %s" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "Salida estándar: %r" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "Salida estándar de errores: %r" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "ipmitool salida estándar: '%(out)s', error estándar: '%(err)s'" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "'%s' no es un valor entero." #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "Creando configuración de PXE para el despliegue %s." #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "No se han encontrado pools de almacenamiento para ironic" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "fichero de clave ssh %s no encontrado." #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "VCPU no establecidas; suponiendo que la colección de CPU se ha interrumpido" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "%(host_state)s no tiene un disco utilizable de %(requested_disk)s MB, solo tiene %(usable_disk_mb)s MB de disco que se puede utilizar." #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "%(host_state)s no tiene una RAM utilizable de %(requested_ram)s MB, solo tiene %(usable_ram)s MB de RAM que se puede utilizar." #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "Error al establecer %(attr)s" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "Incapaz de instanciar tipo de objeto no registrado %(objtype)s" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "Se está descartando excepción original: %s" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "La excepción inesperada ha ocurrido %d vez(veces)... reintentando." #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "No se ha podido liberar el bloqueo adquirido `%s`" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "Semáforo obtenido \"%(lock)s\"" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "Intentando bloquear archivo \"%(lock)s\"" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "Candado creado ruta: %s" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "Se ha bloqueado el archivo \"%(lock)s\" en %(path)s" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "Se ha liberado el bloqueo de archivo \"%(lock)s\" en %(path)s" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "Semáforo / bloqueo obtenido \"%(function)s\"" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "Semáforo / bloqueo liberado \"%(function)s\"" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "En desuso: %s" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "Error al cargar la configuración de registro %(log_config)s: %(err_msg)s" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "El recurso syslog debe ser uno de: %s" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "Llamada muy grave a configuración en desuso: %(msg)s" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "la ejecución de tarea ha durado %s seg. más que el intervalo" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "en llamada en bucle de duración fija" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "Llamada dinámica repetitiva, en espera por %.02f segundos" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "en llamada en bucle dinámica" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "Argumento inesperado para la creación de tarea periódica: %(arg)s." #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "Omitiendo la tarea periódica %(task)s porque el intervalo es negativo" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "Omitiendo la tarea periódica %(task)s porque está inhabilitada" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "Ejecutando tarea periódica %(full_task_name)s" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "Error durante %(full_task_name)s: %(e)s" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "No se ha podido comprender la regla %(rule)s" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "No hay manejador para coincidencias de clase %s" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "No se ha podido comprender la regla %(rule)r" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "Se han obtenido argumentos de palabra clave desconocidos en utils.execute: %r" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "Ejecutando cmd (subprocesos): %s" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "El resultado fue %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "%r ha fallado. Volviendo a intentarlo." #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "corriendo cmd (SSH): %s" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "Entorno no soportado a través de SSH" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "entrada de proceso no soporta a través de SSH" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "Conjunto completo de CONF:" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "Se ha captado %s, saliendo" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "Excepción durante limpieza de rpc." #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "El proceso padre se ha detenido inesperadamente, saliendo" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "Excepción no controlada" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "Bifurcación demasiado rápida, en reposo" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "Se ha iniciado el hijo %d" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "Iniciando %d trabajadores" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "Hijo %(pid)d matado por señal %(sig)d" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "El hijo %(pid)s ha salido con el estado %(code)d" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "El pid %d no está en la lista de hijos" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "Se ha captado %s, deteniendo hijos" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "En espera de %d hijos para salir" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "No se puede encontrar cert_file: %s" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "No se puede encontrar ca_file: %s" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "No se puede encontrar key_file: %s" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "Al ejecutar el servidor en modalidad SSL, debe especificar un valor para las opciones cert_file y key_file en el archivo de configuración" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "Versión SSL inválida : %s" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "Valor '%(val)s' no reconocido, los valores aceptables son: %(acceptable)s" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "Formato inválido de cadena: %s" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "Multiplicador de bytes desconocido: %s" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "Parámetro no válido: la base de datos actual no soporta Unicode." #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "la versión debe ser un entero" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "La clave de clasificación proporcionada no es válida. " #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "Dirección de clasificación desconocida, debe ser 'desc' o ' asc'" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "Valor de read_deleted no reconocido '%s'" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "Especifique la columna %s en el parámetro col_name_col_instance. Es necesario porque la columna tiene un tipo no soportado por sqlite)." #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "col_name_col_instance param tiene el tipo incorrecto de instancia de columna para la columna %s. Debe ser una instancia de sqlalchemy.Column." #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "Tipo de identificador de columnas no soportado" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "%s no está en las prioridades válidas" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "Problema '%(e)s' al intentar enviar al sistema de notificación. Carga útil=%(payload)s" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "No se ha podido cargar el notificador %s. Estas notificaciones no se enviarán." #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "No se ha podido enviar notificación a %(topic)s. Carga útil=%(message)s" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "La agrupación está creando una conexión nueva" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "No hay subprocesos de llamada esperando por msg_id : %(msg_id)s, mensaje : %(data)s" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "_call_waiters: %s" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "contenido desempaquetado: %s" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "UNIQUE_ID es %s." #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "recibido %s" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "no hay método para el mensaje: %s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "No hay método para el mensaje: %s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "Se esperaba excepción durante el manejo de mensajes (%s)" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "Excepción durante el manejo de mensajes" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "Realizando llamada síncrona en %s ..." #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "MSG_ID es %s" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "Realizando difusión asíncrona en %s..." #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "Realizando difusión de diseminación asíncrona..." #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "Enviando %(event_type)s sobre %(topic)s" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "Se ha producido una excepción desconocida relacionada con RPC." #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "Error remoto: %(exc_type)s %(value)s\n%(traceback)s." #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "Tiempo de espera agotado en espera de una respuesta RPC - tema: \"%(topic)s\", método RPC: \"%(method)s\" información: \"%(info)s\"" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "Se ha encontrado un mensaje duplicado (%(msg_id)s). Se va a saltar." #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "Reuso invalido de una coneccion RPC" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "Versión de RPC especificada, %(version)s, no soportada por este punto final." #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "Versión de sobre de RPC especificada, %(version)s, no soportada por este punto final." #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "Límite de versión RPC especificada, %(version_cap)s, es muy baja" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "Devolviendo excepción %s al interlocutor" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "Fallo al procesar mensaje ... omitiendo." #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "Fallo al procesar mensaje ... se encolará nuevamente." #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "Volviendo a conectar con el servidor AMQP en %(hostname)s:%(port)d " #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "Conectado al servidor AMQP en %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "No se ha podido conectar con el servidor AMQP en %(hostname)s:%(port)d después de %(max_retries)d intentos: %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "El servidor AMQP en %(hostname)s:%(port)d es inalcanzable: %(err_str)s. Se volverá a intentar en %(sleep_time)d segundos." #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "No se ha podido declarar consumidor para el tema '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "Tiempo de espera excedido al esperar respuesta de RPC: %s" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "No se ha podido consumir el mensaje de la cola: %s" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "No se ha podido publicar el mensaje para el tema '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "No se ha podido procesar el mensaje... saltándoselo." #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "No se puede conectar con el servidor AMQP: %(e)s. En reposo durante %(delay)s segundos" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "Conectado con el servidor AMQP en %s" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "Colas AMQP reestablecidas" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "Error al procesar el mensaje. Saltándolo." #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "Ha fallado la serialización JSON." #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "Deserializando: %s" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "Conectando a %(addr)s con %(type)s" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "-> Suscrito a %(subscribe)s" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "-> enlace: %(bind)s" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "No se ha podido abrir el socket." #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "Subscribiéndose a %s" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "No se puede cerrar el socket ZeroMQ." #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "No puede recibir en este socket." #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "No puede enviar en este socket." #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "Ejecutando función con contexto: %s" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "Enviando respuesta" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "El mensaje de RPC no incluía método." #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "Registrando reactor" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "Registrado en reactor" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "Consumiendo socket" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "Creando proxy para el tema: %s" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "El tema contenía caracteres peligrosos." #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "Ha fallado la creación de archivo de socket de tema." #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "Almacenamiento intermedio de retraso por tema local para el tema %(topic)s. Descartando mensaje." #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "El directorio IPC requerido no existe en %s" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "Permiso denegado para el directorio IPC en %s" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "No se ha podido crear el daemon de destinatario ZeroMQ. Es posible que ya se esté utilizando el socket." #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "EL CONSUMIDOR HA RECIBIDO DATOS: %s" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "Versión de sobre de ZMQ no soportada o desconocida." #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "Se va a saltar el registro del tema. Ya está registrado." #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "El consumidor es un zmq.%s" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "Creando carga útil" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "Creando socket de cola para el elemento e espera de respuesta" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "Enviando difusión" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "Difusión enviada; esperando respuesta" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "Mensaje recibido: %s" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "Desempaquetando respuesta" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "Se ha devuelto un sobre de ZMQ no soportado o desconocido." #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "Mensaje de RPC no válido." #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "Enviando mensaje(s) a: %s" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "No hay resultados de Matchmaker. No hay difusión." #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "No hay coincidencias de Matchmaker." #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "rpc_zmq_matchmaker = %(orig)s está obsoleto; use %(new)s en su lugar" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "Coincidencia no encontrada por MatchMaker." #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "Matchmaker no implementa registro o pulsación." #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "Matchmaker no registrado: %(key)s, %(host)s" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "Registre antes de iniciar la pulsación." #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "No hay ninguna clave que defina hosts para el tema '%s', consulte ringfile" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "Creando conexión de consumidor para el servicio %s" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/pa_IN/0000775000175300017540000000000012316614636020425 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/pa_IN/LC_MESSAGES/0000775000175300017540000000000012316614636022212 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/pa_IN/LC_MESSAGES/ironic.po0000664000175300017540000015055412316614116024040 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Panjabi (Punjabi) (India) (http://www.transifex.com/projects/p/openstack/language/pa_IN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: pa_IN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/ro/0000775000175300017540000000000012316614636020057 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ro/LC_MESSAGES/0000775000175300017540000000000012316614636021644 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ro/LC_MESSAGES/ironic.po0000664000175300017540000015057612316614116023476 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/openstack/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/km/0000775000175300017540000000000012316614636020046 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/km/LC_MESSAGES/0000775000175300017540000000000012316614636021633 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/km/LC_MESSAGES/ironic.po0000664000175300017540000015051312316614116023454 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Khmer (http://www.transifex.com/projects/p/openstack/language/km/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: km\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/zh_CN/0000775000175300017540000000000012316614636020440 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/zh_CN/LC_MESSAGES/0000775000175300017540000000000012316614636022225 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/zh_CN/LC_MESSAGES/ironic.po0000664000175300017540000017027412316614116024054 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:25+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/openstack/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "解析HTTP响应失败: %s" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "配置" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "发生未知异常。" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "字符串格式操作中发生异常" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "未授权。" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "无法接受的参数。" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "期望 uuid,但是接收到 %(uuid)s。" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "镜像 %(image_id)s 无法接受,原因是: %(reason)s" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "资源没有找到。" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "镜像 %(image_id)s 没有找到。" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "不支持的对象类型 %(objtype)s" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "对于孤立对象 %(objtype)s 无法调用 %(method)s" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "%(objname)s 的版本 %(objver)s 不被支持" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "连接 Glance 主机 %(host)s:%(port)s 失败:%(reason)s" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "未针对映像 %(image_id)s 授权。" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "无效的镜像href %(image_href)s。" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "在 %(path)s 找不到配置文件。" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "遇到快照列表,但是找不到任何标题!" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "'qemu-img info'解析失败" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "fmt=%(fmt)s 由 %(backing_file)s 支持" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "转化为裸格式,但目前格式是 %s" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "无效的后台:%s" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "正在重新装入所缓存文件 %s" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "未能除去临时目录:%s" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "未能取消链接 %(path)s,发生错误:%(e)s" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "未能除去目录 %(path)s,发生错误:%(e)s" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "未能创建从 %(source)s 到 %(link)s 的符号链接,发生错误:%(e)s" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "针对“%(method)s”与 Glance 服务器“%(host)s:%(port)s”联系时出错,%(extra)s。" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "禁用" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "ipmitool 标准输出:“%(out)s”,标准错误:“%(err)s”" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "正在针对部署 %s 构建 PXE 配置。" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "未设置 VCPUs;假设 CPU 集合损坏了" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "%(host_state)s 没有 %(requested_disk)s MB 可用磁盘,它仅具有 %(usable_disk_mb)s MB 可用磁盘。" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "%(host_state)s 没有 %(requested_ram)s MB 可用 ram,它仅具有 %(usable_ram)s MB 可用 ram。" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "正在删除原始异常:%s" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "意外的异常已发生 %d 次...正在重试。" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "消息对象不支持附加。" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "消息对象不支持str(),因为其中可能包含非ASCII字符。请使用unicode()或translate()代替。" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "未能释放所获取锁定“%s”" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "已获取信号量 \"%(lock)s\"" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "正在尝试抓取文件锁 \"%(lock)s\"" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "已创建锁路径:%s" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "已在 %(path)s 处取得文件锁 \"%(lock)s\" " #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "已在 %(path)s 处释放文件锁 \"%(lock)s\"" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "已获取信号量 / 锁 \"%(function)s\"" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "已释放信号量 / 锁 \"%(function)s\"" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "建议不要使用:%s" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "加载登陆配置出错 %(log_config)s:%(err_msg)s" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "syslog设备必须作为一个 %s 。" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "对建议不要使用的配置进行了后果极严重的调用:%(msg)s" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "任务的运行时间超过时间间隔(超过 %s 秒)" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "在固定时段内循环调用" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "动态循环调用%.02f 秒休眠" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "在动态循环调用中" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "对于周期性任务创建,以下是意外自变量:%(arg)s。" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "正在跳过周期性任务 %(task)s,因为其时间间隔为负" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "正在跳过周期性任务 %(task)s,因为它已禁用" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "正在运行周期性任务 %(full_task_name)s" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "在 %(full_task_name)s 期间发生的错误:%(e)s" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "未能理解规则 %(rule)s" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "对于类型为 %s 的匹配项,不存在任何处理程序" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "未能理解规则 %(rule)r" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "发现未知的 utils.execute 关键字参数:%r" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "正在运行cmd (subprocess):%s" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "运行结果为 %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "%r 失败,重试。" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "运行cmd (SSH):%s" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "SSH上不支持环境变量" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "SSH上不支持的进程输入参数。" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "存在以下完整的一组配置:" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "捕获到 %s,正在退出" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "在RPC清除期间发生异常。" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "父进程已意外终止,正在退出" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "存在未处理的异常" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "派生速度太快,正在休眠" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "已启动子代 %d" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "正在启动 %d 工作程序" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "信号 %(sig)d 已终止子代 %(pid)d" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "子代 %(pid)s 已退出,状态为 %(code)d" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "pid %d 没有在子代列表中" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "捕获到 %s,正在停止子代" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "正在等待 %d 个子代退出" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "找不到 cert_file:%s" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "找不到 ca_file:%s" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "找不到 key_file:%s" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "以 SSL 方式运行服务器时,必须在配置文件中同时指定 cert_file 和 key_file 选项值" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "SSL版本无效:%s" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "不可识别的值 '%(val)s', 可接受的值是: %(acceptable)s" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "字符串格式无效: %s" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "字节乘数未知:%s" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "参数无效:当前数据库不支持 Unicode。" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "version应该是整数" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "表 \"%s\" 包含非utf8核对, 请确保所有表是 CHARSET=utf8" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "数据库不受版本控制,但是包含表格。请手动标记schema的当前版本。" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "提供的排序键无效。" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "排序方向未知,必须为“降序”或“升序”" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "无法识别的 read_deleted 取值”%s“" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "请在 col_name_col_instance 参数中指定列 %s。要求执行此操作的原因是列中包含不受 sqlite 支持的类型)。" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "对于列 %s,col_name_col_instance 参数具有不正确类型的列实例。它应该是 sqlalchemy.Column 的实例。" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "不支持的id列类型" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "%s 不在有效的优先级" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "Problem '%(e)s' 试图发送到通知系统。Payload=%(payload)s" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "未能装入通知器 %s。将不发送这些通知。" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "未能将通知发送到 %(topic)s。Payload=%(message)s" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "池正在创建新连接" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "没有任何调用线程正在等待 msg_id : %(msg_id)s, 消息 : %(data)s" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "_call_waiters: %s" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "调用等待的线程的数目大于警告阈值:%d。可能存在 MulticallProxyWaiter 泄漏。" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "未打包的上下文:%s" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "UNIQUE_ID 为 %s。" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "已接收 %s" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "没有适用于消息的方法:%s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "没有适用于消息的方法:%s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "在消息处理 (%s) 期间发生预期的异常" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "消息处理期间发生异常" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "正在对 %s 进行同步调用..." #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "消息ID(MSG_ID)是 %s" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "在 %s 做异步cast" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "做异步fanout cast" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "正在发送关于 %(topic)s 的 %(event_type)s" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "发生与 RPC 相关的未知异常。" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "远程错误:%(exc_type)s %(value)s\n%(traceback)s。" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "当等待在RPC响应超时-- 主题: \"%(topic)s\", RPC 方法: \"%(method)s\" info:\"%(info)s\"" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "<未知>" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "找到重复消息 (%(msg_id)s)。正在跳过该消息。" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "无效的RPC连接重用。" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "指定的 RPC 版本 %(version)s 不受此端点支持。" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "指定的 RPC 包络版本 %(version)s 不受此端点支持。" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "指定的RPC版本限定, %(version_cap)s, 过慢" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "返回 %s 异常给调用者" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "未能处理消息...正在跳过该消息。" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "未能处理消息...将重新排队。" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "正在重新连接位于 %(hostname)s:%(port)d 的AMQP服务器" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "连接到位于 %(hostname)s:%(port)d 的AMQP服务器" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "无法连接到位于%(hostname)s:%(port)d的AMQP server,尝试已经 %(max_retries)d 次:%(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "位于%(hostname)s:%(port)d的AMQP服务器不可达:%(err_str)s。%(sleep_time)d 秒钟后请再尝试。" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "为topic '%(topic)s'声明消费者失败:%(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "等待RPC响应超时:%s" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "从队列中消费消息失败:%s" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "给topic '%(topic)s'发布消息失败:%(err_str)s" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "qpid_topology_version的值无效: %d" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "未能处理消息... 正在跳过该消息。" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "无法连接至 AMQP 服务器:%(e)s。正在休眠,持续时间为 %(delay)s 秒" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "连接到 %s 的AMQP服务器" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "重建AMQP队列" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "处理消息时出错。正在跳过该消息。" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "JSON 序列化失败。" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "正在反序列化:%s" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "正在连接至具有 %(type)s 的 %(addr)s" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "-> 已预订 %(subscribe)s" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "-> 请绑定:%(bind)s" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "未能打开套接字。" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "正在预订 %s" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "无法在此套接字上执行“恢复”操作。" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "无法在此套接字上执行“发送”操作。" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "正在运行具有上下文的函数:%s" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "正在发送应答" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "RPC 消息未包括方法。" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "正在注册反应器" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "已注册内部反应器" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "正在使用套接字" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "正在为主题创建代理:%s" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "主题包含了危险字符。" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "主题套接字文件创建失败。" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "对于主题 %(topic)s,本地“每主题”储备缓冲区已满。正在删除消息。" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "在%s不存在需要的IPC目录" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "在 %s 的IPC目录的权限被拒绝" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "未能创建 ZeroMQ 接收器守护程序。套接字可能已在使用中。" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "使用者接收到数据:%s" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "ZMQ 包络版本不受支持或未知。" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "正在跳过主题注册。已注册。" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "使用者是 zmq。%s" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "正在创建有效内容" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "正在为应答等待线程创建队列套接字" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "正在发送传播内容" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "已发送传播内容;正在等待应答" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "接收到消息:%s" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "正在对响应进行解包" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "返回了不受支持或未知的 ZMQ 包络。" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "RPC 消息无效。" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "正在将消息发送至:%s" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "不存在任何 MatchMaker 结果。未在进行传播。" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "不存在任何来自 MatchMaker 的匹配项。" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "rpc_zmq_matchmaker = %(orig)s已被弃用; 请使用 %(new)s 作为替代" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "MatchMaker 找不到匹配项。" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "MatchMaker 没有实现注册或脉动信号。" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "Matchmaker已注销: %(key)s, %(host)s" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "请在启动脉动信号之前进行注册。" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "对于主题“%s”,不存在任何对主机进行定义的键,请参阅环文件" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "为服务 %s 创建消费者" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/de/0000775000175300017540000000000012316614636020027 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/de/LC_MESSAGES/0000775000175300017540000000000012316614636021614 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/de/LC_MESSAGES/ironic.po0000664000175300017540000016622012316614116023437 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: German (http://www.transifex.com/projects/p/openstack/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "Eine unbekannte Ausnahme ist aufgetreten." #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "Ausnahme bei Zeichenfolgeformatoperation" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "Nicht autorisiert." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "Unzulässige Parameter." #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "Image %(image_id)s ist nicht zulässig: %(reason)s" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "Ressource konnte nicht gefunden werden." #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "Image %(image_id)s konnte nicht gefunden werden." #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "Für Image %(image_id)s nicht autorisiert." #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "Ungültiger Image-Hyperlink %(image_href)s." #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "Konfiguration konnte unter %(path)s nicht gefunden werden" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "Momentaufnahmenliste gefunden, aber kein Header gefunden!" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "Auswertung von 'qemu-img info' fehlgeschlagen." #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "In unformatierten Zustand konvertiert, Format ist nun jedoch %s" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "Ungültiges Back-End: %s" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "Im Cache gespeicherte Datei %s wird neu geladen" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "tmpdir konnte nicht entfernt werden: %s" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "deaktivieren" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "Ursprüngliche Ausnahme wird gelöscht: %s" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "Angeforderte Sperre `%s` konnte nicht freigegeben werden" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "Veraltet: %s" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "Fehler beim laden der Logging Konfiguration %(log_config)s: %(err_msg)s" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "syslog-Funktion muss einer der folgenden Werte sein: %s" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "Schwerwiegender Aufruf an veraltete Konfiguration: %(msg)s" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "Ausgeführte Task hat Intervall um %s Sekunden überschritten" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "in Schleifenaufruf mit festgelegter Dauer" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "der dynamischen Schleifenaufruf ruht für %.02f Sekunden" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "in dynamischen Schleifenaufruf" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "Ausführen von regelmäßiger Task %(full_task_name)s" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "Fehler bei %(full_task_name)s: %(e)s" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "Regel %(rule)s konnte nicht verstanden werden" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "Kein Handler für Übereinstimmungen des Typs %s" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "Regel %(rule)r konnte nicht verstanden werden" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "Unbekannte Schlüsselwortargumente für utils.execute erhalten: %r" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "Führe Kommando (subprocess) aus: %s" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "Ergebnis war %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "%r fehlgeschlagen. Neuversuch." #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "CMD wird ausgeführt (Secure Shell): %s" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "Umgebung über Secure Shell nicht unterstützt" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "'process_input' über Secure Shell nicht unterstützt" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "Vollständiger Satz von CONF:" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "%s abgefangen. Vorgang wird beendet" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "Übergeordneter Prozess wurde unerwartet abgebrochen. Vorgang wird beendet" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "Nicht behandelte Ausnahme" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "Verzweigung zu schnell; im Ruhemodus" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "Untergeordnetes Element %d gestartet" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "Starten von %d Workers" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "Untergeordnetes Element %(pid)d durch Signal %(sig)d abgebrochen" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "Untergeordnete %(pid)s mit Status %(code)d beendet" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "PID %d nicht in Liste untergeordneter Elemente" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "%s abgefangen, untergeordnete Elemente werden gestoppt" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "Warten auf Beenden von %d untergeordneten Elementen" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "'cert_file' konnte nicht gefunden werden: %s" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "'ca_file' konnte nicht gefunden werden: %s" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "'key_file' konnte nicht gefunden werden: %s" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "Wenn der Server im SSL-Modus läuft, müssen Sie sowohl für die 'cert_file'- als auch für die 'key_file'-Option in Ihrer Konfigurationsdatei einen Wert angeben" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "Unbekannter Bytemultiplikator %s" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "Ungültiger Parameter: Unicode wird von der aktuellen Datenbank nicht unterstützt." #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "Version sollte eine Ganzzahl sein" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "Der angegebene Sortierschlüssel war nicht gültig. " #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "Unbekannte Sortierrichtung; muss 'desc' oder 'asc' sein" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "Nicht erkannter read_deleted-Wert '%s'" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "%s nicht in gültigen Prioritäten" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "Problem '%(e)s' bei Versuch, an Benachrichtigungssystem zu senden. Payload=%(payload)s" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "Benachrichtigung %s konnte nicht geladen werden. Diese Benachrichtigungen werden nicht gesendet." #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "Benachrichtigung konnte nicht an %(topic)s gesendet werden. Payload=%(message)s" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "Pool erstellt neue Verbindung" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "Die Anzahl an wartenden Anrufthreads ist größer als die Warnungsbegrenzung: %d. Möglicherweise gibt es ein Leck in 'MulticallProxyWaiter'." #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "entpackter Kontext: %s" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "UNIQUE_ID ist %s." #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "%s erhalten" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "keine Methode für diese Nachricht gefunden: %s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "keine Methode für diese Nachricht gefunden: %s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "Erwartete Ausnahme bei Nachrichtenbehandlung (%s)" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "Ausnahme bei Nachrichtenbehandlung" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "Synchroner Aufruf bei %s ..." #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "MSG_ID ist %s" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "Asynchroner Cast bei %s..." #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "Asynchroner Fan-out-Cast..." #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "Senden von %(event_type)s auf %(topic)s" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "Eine unbekannte Ausnahme in Zusammenhang mit RPC ist aufgetreten." #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "Ferner Fehler: %(exc_type)s %(value)s\n%(traceback)s." #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "Zeitüberschreitung beim Warten auf die RPC-Antwort - Thema: \"%(topic)s\", RPC Methode: \"%(method)s\" Information: \"%(info)s\"" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "Doppelte Nachricht (%(msg_id)s) gefunden. Wird übersprungen." #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "Ungültige Wiederverwendung einer RPC-Verbindung." #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "Angegebene RPC-Version %(version)s von diesem Endpunkt nicht unterstützt." #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "Angegebene RPC-Umschlagsversion %(version)s wird von diesem Endpunkt nicht unterstützt." #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "Angegebene RPC Version cap, %(version_cap)s, ist zu niedrig" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "Ausnahme %s wird an Aufrufenden zurückgegeben" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "Wiederherstellung der Verbindung zu AMQP-Server auf %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "Verbunden mit AMQP-Server auf %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "Herstellen einer Verbindung zu AMQP-Server auf %(hostname)s:%(port)d nach %(max_retries)d Versuchen nicht möglich: %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "AMQP-Server auf %(hostname)s:%(port)d ist nicht erreichbar: %(err_str)s. Erneuter Versuch in %(sleep_time)d Sekunden." #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "Fehler beim Deklarieren von Consumer für Topic '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "Zeitlimitüberschreitung bei Warten auf RPC-Antwort: %s" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "Nachricht aus Warteschlange wurde nicht verarbeitet: %s" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "Fehler beim Veröffentlichen von Nachricht zu Topic '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "Nachricht wurde nicht verarbeitet und wird übersprungen." #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "Verbindung zu AMQP-Server kann nicht hergestellt werden: %(e)s. %(delay)s Sekunden Ruhemodus" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "Verbunden mit AMQP-Server auf %s" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "AMQP-Warteschlangen erneut erstellt" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "Fehler beim Verarbeiten der Nachricht. Wird übersprungen." #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "JSON-Serialisierung fehlgeschlagen." #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "Deserialisierung: %s" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "Verbindung zu %(addr)s mit %(type)s wird hergestellt" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "-> %(subscribe)s abonniert" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "-> Bindung: %(bind)s" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "Socket konnte nicht geöffnet werden." #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "%s wird abonniert" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "Sie können auf diesem Socket nicht empfangen." #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "Sie können auf diesem Socket nicht senden." #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "Ausführen von Funktion mit Kontext: %s" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "Senden von Antwort" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "RPC-Nachricht hat keine Methode enthalten." #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "Registrieren von Reaktor" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "Eingangsreaktor registriert" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "Socketverwendung" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "Erstellen von Proxy für Topic: %s" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "Topic enthielt gefährliche Zeichen." #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "Erstellung von Topicsocketdatei fehlgeschlagen." #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "Lokaler topicbezogener Rückstandspuffer für Topic %(topic)s voll. Nachricht wird gelöscht." #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "das benötigte IPC-Verzeichnis existiert nicht unter %s" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "Zugriff verweigert zum IPC Verzeichnis %s" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "ZeroMQ-Empfängerdämon konnte nicht erstellt werden. Socket ist möglicherweise bereits belegt." #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "CONSUMER HAT DATEN ERHALTEN: %s" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "ZMQ-Umschlagsversion nicht unterstützt oder unbekannt." #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "Überspringen von Topicregistrierung. Bereits registriert." #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "Consumer ist zmq.%s" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "Erstellung von Nutzdaten" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "Erstellung von Warteschlangensocket für wartenden Antwortthread" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "Cast wird gesendet" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "Cast gesendet. Warten auf Antwort" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "Nachricht erhalten: %s" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "Entpacken von Antwort" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "Nicht unterstützter oder unbekannter ZMQ-Umschlag zurückgegeben." #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "RPC-Nachricht ungültig." #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "Senden von Nachricht(en) an: %s" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "Keine MatchMaker-Ergebnisse. Kein Casting." #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "Keine Übereinstimmung von MatchMaker." #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "rpc_zmq_matchmaker = %(orig)s is überholt; benutze stattdessen %(new)s" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "Übereinstimmung von MatchMaker nicht gefunden." #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "MatchMaker implementiert Registrierung oder Überwachungssignal nicht." #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "MatchMaker nicht registriert: %(key)s, %(host)s" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "Vor Starten von Überwachungssignal registrieren." #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "Keine schlüsseldefinierenden Hosts für Topic '%s', siehe Ringdatei" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "Erstellung von Consumerverbindung für Service %s" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/nl_NL/0000775000175300017540000000000012316614636020441 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/nl_NL/LC_MESSAGES/0000775000175300017540000000000012316614636022226 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/nl_NL/LC_MESSAGES/ironic.po0000664000175300017540000015056312316614116024054 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/openstack/language/nl_NL/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: nl_NL\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "gedeactiveerd" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/gl/0000775000175300017540000000000012316614636020041 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/gl/LC_MESSAGES/0000775000175300017540000000000012316614636021626 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/gl/LC_MESSAGES/ironic.po0000664000175300017540000015052512316614116023452 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Galician (http://www.transifex.com/projects/p/openstack/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/ko_KR/0000775000175300017540000000000012316614636020444 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ko_KR/LC_MESSAGES/0000775000175300017540000000000012316614636022231 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ko_KR/LC_MESSAGES/ironic.po0000664000175300017540000017245012316614116024056 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: # ujuc Gang , 2014 # ujuc Gang , 2014 msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:25+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/openstack/language/ko_KR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: ko_KR\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "메소드가 지정되지 않았습니다." #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "Chassis ID가 지정되지 않았습니다." #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "노드 ID가 지정되지 않았습니다." #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "제한 값은 양수여야 합니다." #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "http://%(host)s:%(port)s 에서 서비스중" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "구성:" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "알 수 없는 예외가 발생했습니다. " #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "문자열 형식화 오퍼레이션의 예외" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "권한이 없습니다. " #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "허용할 수 없는 매개변수입니다. " #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "uuid를 예상했지만 %(uuid)s을(를) 수신했습니다. " #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "%(image_id)s 이미지는 허용할 수 없음: %(reason)s" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "자원을 찾을 수 없습니다. " #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "%(image_id)s 이미지를 찾을 수 없습니다. " #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "글랜스 호스트 %(host)s:%(port)s에 대한 연결 실패: %(reason)s" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "%(image_id)s 이미지에 대한 권한이 없습니다. " #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "올바르지 않은 이미지 href %(image_href)s." #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "%(path)s에서 구성을 찾을 수 없음" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "스냅샷 목록이 있지만 헤더를 찾을 수 없습니다!" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "'qemu-img info' 구문 분석에 실패했습니다. " #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "fmt=%(fmt)s 백업: %(backing_file)s" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "원시로 변환되었지만 형식은 지금 %s임" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "올바르지 않은 백엔드: %s" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "캐시된 파일 %s 다시 로드 중" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "tmpdir을 제거할 수 없음: %s" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "%(path)s 링크 해제 실패, 오류: %(e)s" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "%(path)s 제거 실패, 오류: %(e)s" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "%(source)s에서 %(link)s(으)로의 symlink 작성 실패, 오류: %(e)s" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "'%(method)s'에 대한 글랜스 서버 '%(host)s:%(port)s'에 접속 중 오류 발생: %(extra)s." #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "provisioning" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "지원하지 않습니다." #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "disabled" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "명령어: %s" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "StdOut: %r" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "StdErr: %r" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "ipmitool stdout: '%(out)s', stderr: '%(err)s'" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "배치 %s에 대한 PXE 구성을 빌드 중입니다. " #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "VCPU 설정되지 않음: CPU 콜렉션 중단 가정" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "%(host_state)s에 %(requested_disk)sMB의 가용 디스크가 없습니다. %(usable_disk_mb)sMB의 가용 디스크만 있습니다." #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "%(host_state)s에 %(requested_ram)sMB의 RAM이 없습니다. %(usable_ram)sMB의 가용 RAM만 있습니다." #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "기존 예외가 삭제됨: %s" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "예기치 않은 예외 %d 번 발생하였습니다... 다시 시도중." #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "획득한 `%s` 잠금을 해제할 수 없음" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "세마포어 \"%(lock)s\" 받음." #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "더 이상 사용되지 않음: %s" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "%(log_config)s 설정 기록을 불러오는 중 오류가 발생했습니다: %(err_msg)s" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "syslog 기능이 다음 중 하나여야 함: %s" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "더 이상 사용되지 않는 구성에 대한 심각한 호출: %(msg)s" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "태스크 실행이 %s초의 간격을 지속함" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "고정 기간 루프 호출에서" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "%.02f 초 동안 대기할 동적 순환 반복 호출" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "동적 루프 호출에서" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "주기적 태스크 작성에 대한 예기치 않은 인수: %(arg)s." #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "간격이 음수이기 때문에 주기적 태스크 %(task)s을(를) 건너뜀" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "사용 안하기 때문에 주기적 태스크 %(task)s을(를) 건너뜀" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "주기적 태스크 %(full_task_name)s 실행 중" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "%(full_task_name)s 중 오류: %(e)s" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "%(rule)s 규칙을 이해하지 못했음" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "%s 유형의 일치에 대한 핸들러가 없음" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "%(rule)r 규칙을 이해하지 못했음" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "utils.execute에 대해 알 수 없는 키워드 인수를 가져옴: %r" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "cmd(하위 프로세스) 실행 중: %s" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "결과는 %s입니다." #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "%r 실패. 재시도 중입니다. " #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "cmd(SSH) 실행 중: %s" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "환경이 SSH를 통해 지원되지 않음" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "process_input이 SSH를 통해 지원되지 않음" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "CONF의 전체 세트:" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "%s 발견, 종료 중" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "상위 프로세스가 예기치 않게 정지했습니다. 종료 중" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "처리되지 않은 예외" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "포크가 너무 빠름. 정지 중" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "%d 하위를 시작했음" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "%d 작업자 시작 중" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "%(pid)d 하위가 %(sig)d 신호에 의해 강제 종료됨" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "%(pid)s 하위가 %(code)d 상태와 함께 종료했음" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "pid %d이(가) 하위 목록에 없음" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "%s 발견, 하위 중지 중" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "%d 하위에서 종료하기를 대기 중임" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "cert_file을 찾을 수 없습니다. : %s" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "ca_file을 찾을 수 없습니다. : %s" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "key_file을 찾을 수 없습니다. : %s" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "SSL 모드로 서버를 실행하는 경우 구성 파일에서 cert_file 및 key_file 옵션 값 둘 다를 지정해야 합니다. " #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "잘못된 SSL 버전 : %s" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "알 수 없는 바이트 승수: %s" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "올바르지 않은 매개변수: Unicode는 현재 데이터베이스에서 지원되지 않습니다. " #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "버전은 정수여야 함" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "제공되는 정렬 키가 올바르지 않습니다. " #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "알 수 없는 정렬 방향입니다. 'desc' 또는 'asc'여야 함" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "인식되지 않는 read_deleted 값 '%s'" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "col_name_col_instance 매개변수에 %s 열을 지정하십시오. sqlite에서 지원하지 않는 유형이 열에 있으므로 이는 필수입니다." #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "%s 열에 올바르지 않은 열 인스턴스 유형이 col_name_col_instance 매개변수에 있습니다. sqlalchemy.Column의 인스턴스여야 합니다." #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "%s이(가) 유효한 우선순위에 없음" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "알림 시스템에 보내려고 시도하는 중 '%(e)s' 문제점이 발생했습니다. 페이로드=%(payload)s" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "%s 알리미를 로드하지 못했습니다. 이들 알림은 발송되지 않습니다. " #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "%(topic)s(으)로 알림을 발송할 수 없습니다. 페이로드=%(message)s" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "풀이 새 연결을 작성 중임" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "_call_waiters: %s" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "호출 대기 수가 스레드에서 경고한 %d보다 더 많습니다. MulticallProxyWaiter에서 누수가 있을 수 있습니다." #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "압축이 풀리지 않은 컨텍스트: %s" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "UNIQUE_ID는 %s입니다." #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "%s 수신" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "메시지에 대한 메소드가 없음: %s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "메시지에 대한 메소드가 없음: %s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "메시지 처리 중에 예상된 예외(%s)" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "메시지 처리 중 예외" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "%s에서 동기 호출 작성 중..." #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "MSG_ID는 %s입니다. " #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "%s에서 비동기 캐스트 작성 중..." #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "비동기 팬아웃 캐스트 작성 중..." #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "%(topic)s에서 %(event_type)s 보내는 중" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "알 수 없는 RPC 관련 예외가 발생했습니다. " #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "원격 오류: %(exc_type)s %(value)s\n%(traceback)s." #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "RPC 응답 대기 시간을 초과 했습니다 - 토픽: \"%(topic)s\", RPC 방식: \"%(method)s\" 정보: \"%(info)s\"" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "중복 메시지(%(msg_id)s)를 찾았습니다. 이를 건너뜁니다. " #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "RPC 연결의 올바르지 않은 재사용입니다. " #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "지정된 RPC 버전 %(version)s이(가) 이 엔드포인트에서 지원되지 않습니다. " #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "지정된 RPC 엔벨로프 버전 %(version)s이(가) 이 엔드포인트에서 지원되지 않습니다. " #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "지정된 RPC 버전 캡 %(version_cap)s 이 너무 낮습니다." #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "%s 예외를 호출자에게 리턴 중" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "메시지 처리 실패 ... 건너뜁니다." #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "메시지 처리 실패 ... 큐에 다시 넣습니다." #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "%(hostname)s:%(port)d에서 AMQP 서버에 다시 연결 중" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "%(hostname)s:%(port)d에서 AMQP 서버에 연결되었음" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "%(max_retries)d번 시도 후에 %(hostname)s:%(port)d에서 AMQP 서버를 연결할 수 없음: %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "%(hostname)s:%(port)d의 AMQP 서버에 접근할 수 없음: %(err_str)s. %(sleep_time)d초 내에 다시 시도하십시오. " #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "'%(topic)s' 주제에 대한 이용자를 선언하지 못했음: %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "RPC 응답 대기 중에 제한시간 초과: %s" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "큐의 메시지를 이용하지 못했음: %s" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "'%(topic)s' 주제에 메시지를 공개하지 못했음: %(err_str)s" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "메시지를 처리하지 못했습니다. 건너뛰는 중입니다. " #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "AMQP 서버 %(e)s에 연결할 수 없습니다. %(delay)s 초 휴면 상태입니다. " #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "%s의 AMQP 서버에 연결했음" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "AMQP 큐 재설정" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "메시지 처리 오류입니다. 건너뛰는 중입니다. " #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "JSON 직렬화에 실패했습니다. " #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "직렬화 취소 중: %s" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "%(type)s을(를) 갖는 %(addr)s에 연결 중" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "-> %(subscribe)s에 등록" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "-> 바인드: %(bind)s" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "소켓을 열 수 없습니다. " #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "%s에 등록" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "이 소켓에서 수신할 수 없습니다. " #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "이 소켓에서 전송할 수 없습니다. " #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "다음 컨텍스트를 갖고 기능 실행 중: %s" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "응답 보내는 중" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "RPC 메시지에 메소드가 없습니다. " #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "리액터 등록 중" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "인 리액터 등록" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "소켓 이용 중" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "주제에 대한 프록시 작성: %s" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "올바르지 않은 문자가 있는 주제. " #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "주제 소켓 파일 작성에 실패했습니다. " #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "%(topic)s 주제에 대한 로컬 주제별 백로그 버퍼가 가득 찼습니다. 메시지 삭제 중입니다. " #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "%s 에서 필요한 IPC 디렉터리가 없습니다" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "%s에서 IPC 디렉터리에 대한 권한을 거부했습니다" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "ZeroMQ 수신기 디먼을 작성할 수 없습니다. 소켓이 이미 사용 중일 수 있습니다. " #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "CONSUMER RECEIVED DATA: %s" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "ZMQ Envelope 버전을 지원하지 않거나 알 수 없습니다. " #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "주제 등록을 건너뜁니다. 이미 등록되었습니다. " #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "이용자: zmq.%s" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "페이로드 작성 중" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "응답 대기자를 위한 큐 소켓 작성 중" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "캐스트 보내는 중" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "캐스트 전송. 응답 대기 중" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "수신된 메시지: %s" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "응답 압축 해제 중" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "지원되지 않거나 알 수 없는 ZMQ 엔벨로프가 리턴되었습니다. " #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "RPC 메시지가 올바르지 않습니다. " #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "메시지를 전송 중인 대상: %s" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "중개인 결과가 없습니다. 캐스트하지 않습니다. " #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "중개자와 일치하지 않습니다. " #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "rpc_zmq_matchmaker = %(orig)s 를 사용하지 않습니다; %(new)s 를 사용하도록 하십시오." #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "중개자가 일치를 찾지 못했습니다. " #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "중개자가 등록이나 하트비트를 구현하지 않습니다." #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "등록되지 않은 중개자: %(key)s, %(host)s" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "하트비트를 시작하기 전에 등록하십시오. " #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "'%s' 주제에 대한 키 정의 호스트가 없습니다. 링 파일 참조" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "%s 서비스에 대한 이용자 연결 작성" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/he_IL/0000775000175300017540000000000012316614636020417 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/he_IL/LC_MESSAGES/0000775000175300017540000000000012316614636022204 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/he_IL/LC_MESSAGES/ironic.po0000664000175300017540000015054212316614116024027 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Hebrew (Israel) (http://www.transifex.com/projects/p/openstack/language/he_IL/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: he_IL\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/fr/0000775000175300017540000000000012316614636020046 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/fr/LC_MESSAGES/0000775000175300017540000000000012316614636021633 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/fr/LC_MESSAGES/ironic.po0000664000175300017540000017353712316614116023467 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: # steff00 , 2013 # Sonny , 2014 # steff00 , 2013 msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:25+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: French (http://www.transifex.com/projects/p/openstack/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "Methode non spécifiée" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "L'identifiant du noeud n'a pas été spécifié" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "La limite doit être positive" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "Configuration :" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "Une exception inconnue s'est produite." #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "Exception dans l'opération de format de chaîne" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "Non autorisé." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "Opération non permise" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "Paramètres non acceptables" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "UUID attendu mais %(uuid)s reçu." #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "L'image %(image_id)s est inacceptable : %(reason)s" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "Ressource introuvable." #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "L'image %(image_id)s est introuvable." #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "La connexion à l'hôte Glance %(host)s : %(port)s a échoué : %(reason)s" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "Non autorisé pour l'image %(image_id)s." #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "href %(image_href)s d'image non valide." #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "Connexion échouée" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "Configuration introuvable dans %(path)s" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "Liste d'instantanés trouvée mais aucun en-tête trouvé !" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "Echec de l'analyse syntaxique de 'qemu-img info'." #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "fmt=%(fmt)s sauvegardé par : %(backing_file)s" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "Converti au format brut, mais le format est maintenant %s" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "Backend invalide : %s" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "rechargement du fichier du cache %s" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "Impossible de supprimer tmpdir : %s" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "Echec de la suppression du lien %(path)s, erreur : %(e)s" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "Echec de la suppression du répertoire %(path)s, erreur : %(e)s" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "Echec de la création du lien symlink de %(source)s vers %(link)s, erreur : %(e)s" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "Erreur lors du contact du serveur glance '%(host)s:%(port)s' pour '%(method)s', %(extra)s." #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "désactivé" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "ipmitool stdout : '%(out)s', stderr : '%(err)s'" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "Génération de la configuration de PXE pour le déploiement %s." #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "VCPU non défini ; collection CPU peut-être rompue" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "%(host_state)s n'a pas de disque utilisable de %(requested_disk)s Mo, seulement un disque de %(usable_disk_mb)s Mo." #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "%(host_state)s ne dispose pas d'une mémoire RAM utilisable de %(requested_ram)s Mo, seulement %(usable_ram)s Mo." #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "Exception d'origine en cours de suppression : %s" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "Exception inattendue survenue %d fois... Nouvel essai." #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "Les objets message ne supportent pas l'addition." #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "Les objets message ne supportent pas str() parce qu'il peuvent contenir des caractères non-ascii. Utiliser unicode() ou translate() à la place." #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "Impossible de libérer le verrou acquis `%s`" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "Sémaphore \"%(lock)s\" obtenu" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "Tentative d'appropriation du fichier verrouillé \"%(lock)s\"" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "Chemin de verrou créé: %s" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "Verrou de fichier \"%(lock)s\" obtenu au niveau de %(path)s" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "Verrou de fichier \"%(lock)s\" libéré au niveau de %(path)s" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "Sémaphore / verrou \"%(function)s\" obtenu" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "Sémaphore / verrou \"%(function)s\" libéré" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "Obsolète : %s" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "Erreur lors du chargement de la configuration %(log_config)s: %(err_msg)s" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "la fonction syslog doit correspondre à l'une des options suivantes : %s" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "Appel fatal adressé à une configuration obsolète : %(msg)s" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "durée d'exécution de la tâche supérieure à %s sec" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "dans l'appel en boucle de durée fixe" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "La boucle dynamique passe en veille pour %.02f secondes" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "dans l'appel en boucle dynamique" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "Argument inattendu pour la création de tâche périodique : %(arg)s." #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "Tâche périodique %(task)s ignorée car son intervalle est négatif" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "Tâche périodique %(task)s car elle est désactivée" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "Exécution de la tâche périodique %(full_task_name)s" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "Erreur pendant %(full_task_name)s : %(e)s" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "Impossible de comprendre la règle %(rule)s" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "Aucun gestionnaire pour les correspondances de type %s" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "Impossible de comprendre la règle %(rule)r" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "Arguments de mot clé inconnus obtenus pour utils.execute : %r" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "Execution de la commande (sous-processus) : %s" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "Le résultat était %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "Echec de %r. Nouvelle tentative." #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "Execution de la cmd (SSH): %s" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "Environnement non pris en charge sur SSH" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "process_input non pris en charge sur SSH" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "Ensemble complet de CONF :" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "%s interceptée, sortie" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "Exception pendant le nettoyage rpc." #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "Processus parent arrêté de manière inattendue, sortie" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "Exception non gérée" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "Bifurcation trop rapide, pause" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "Enfant démarré %d" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "Démarrage des travailleurs %d" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "Enfant %(pid)d arrêté par le signal %(sig)d" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "Processus fils %(pid)s terminé avec le status %(code)d" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "PID %d absent de la liste d'enfants" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "%s interceptée, arrêt de l'enfant" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "En attente %d enfants pour sortie" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "Impossible de trouver cert_file : %s" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "Impossible de trouver ca_file : %s" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "Impossible de trouver key_file : %s" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "Lors de l'exécution du serveur en mode SSL, vous devez spécifier une valeur d'option cert_file et key_file dans votre fichier de configuration" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "Version de SSL invalide : %s" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "Valeur inconnue '%(val)s', les valeurs acceptées sont: %(acceptable)s" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "Format de chaine de caractères non valide : %s" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "Multiplicateur d'octets inconnu : %s" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "Paramètre non valide : Unicode n'est pas pris en charge par la base de données actuelle." #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "la version doit être un entier" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "Les tables \"%s\" ont une collation non utf8, assurez-vous que pour toutes les tables CHARSET=utf8." #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "La base de données n'est pas versionnée, mais contient des tables. Veuillez indiquer manuellement la version courante du schéma." #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "La clé de tri fournie n'était pas valide." #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "Sens de tri inconnu, doit être 'desc' ou 'asc'" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "Valeur read_deleted non reconnue '%s'" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "Spécifiez la colonne %s dans le paramètre col_name_col_instance. Ceci est obligatoire car la colonne a un type non pris en charge dans sqlite)." #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "Le paramètre col_name_col_instance contient un type d'instance de colonne incorrect pour la colonne %s. Il devrait être une instance de sqlalchemy.Column." #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "Type de colonnes id non pris en charge" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "%s pas dans les priorités valides" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "Problème '%(e)s' lors de la tentative d'envoi au système de notification. Contenu = %(payload)s" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "Echec du chargement du notificateur %s. Ces notifications ne seront pas envoyées." #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "Impossible d'envoyer une notification à %(topic)s. Contenu = %(message)s" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "Pool créant une nouvelle connexion" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "Pas d'unité d'exécution appelante en attente de %(msg_id)s, message : %(data)s" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "_call_waiters: %s" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "Contexte décompacté : %s" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "UNIQUE_ID est %s." #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "%s reçu" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "Pas de méthode pour le message : %s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "Pas de méthode pour le message : %s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "Exception attendue pendant le traitement des messages (%s)" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "Exception pendant le traitement des messages" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "Exécution d'un appel synchrone sur %s ..." #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "MSG_ID est %s" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "Exécution d'un transtype asynchrone sur %s..." #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "Exécution d'un transtypage de sortance..." #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "Envoi de %(event_type)s sur %(topic)s" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "Exception d'appel de procédure distante inconnue." #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "Erreur distante : %(exc_type)s %(value)s\n%(traceback)s." #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "Délai d'attente de la réponse RPC dépassée : topic : \"%(topic)s\", Méthode RPC: \"%(method)s infos: \"%(info)s\"" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "Message en double trouvé (%(msg_id)s). Message ignoré." #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "Réutilisation invalide d'une connexion RPC" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "Version d'appel de procédure distante, %(version)s, non prise en charge par ce noeud final." #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "Version spécifiée d'enveloppe d'appel d'une procédure distante, %(version)s, non prise en charge par ce noeud final." #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "Le plafond de version spécifié pour les appel de procédure distante, %(version_cap)s, est trop bas" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "Renvoi de l'exception %s à l'appelant" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "Echec de traitement du message... Message ignoré." #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "Échec de traitement du message... Message remis en file d'attente." #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "Reconnexion au serveur AMQP sur %(hostname)s : %(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "Connecté au serveur AMQP sur %(hostname)s : %(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "Connexion impossible au serveur AMQP sur %(hostname)s:%(port)d après %(max_retries)d tentative(s) : %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "Le serveur AMQP sur %(hostname)s:%(port)d est inaccessible : %(err_str)s. Nouvelle tentative dans %(sleep_time)d secondes." #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "Echec de la déclaration du consommateur pour la rubrique '%(topic)s' : %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "Dépassement du délai d'attente pour la réponse à l'appel de procédure distante : %s" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "Echec de la consommation du message depuis la file d'attente : %s" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "Echec de la publication du message dans la rubrique '%(topic)s' : %(err_str)s" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "Valeur non valide pour qpid_topology_version: %d" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "Echec du traitement du message... Message ignoré." #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "Impossible de se connecter au serveur AMQP : %(e)s. En veille pendant %(delay)s secondes" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "Connecté au serveur AMQP sur %s" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "Files d'attente AMQP rétablies" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "Erreur lors du traitement du message. Message ignoré." #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "Echec de la sérialisation JSON." #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "Désérialisation : %s" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "Connexion à %(addr)s avec %(type)s" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "-> Abonné à %(subscribe)s" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "-> liaison : %(bind)s" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "Impossible d'ouvrir le socket." #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "Abonnement à %s" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "Vous ne pouvez pas recevoir sur ce socket." #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "Vous ne pouvez pas envoyer sur ce socket." #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "Exécution de la fonction avec le contexte : %s" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "Envoi d'une réponse" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "Le message d'appel de procédure distante n'a pas inclus la méthode." #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "Enregistrement de Reactor" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "Reactor entrant enregistré" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "Consommation de socket" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "Création du proxy pour la rubrique : %s" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "Rubrique contenant des caractères dangereux." #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "La création du fichier socket de la rubrique a échoué." #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "Mémoire tampon de commandes en attente par rubrique locale saturée pour la rubrique %(topic)s. Suppression du message." #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "Répertoire IPC requis n'existe pas à %s" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "Permission refusée au répertoire IPC à %s" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "Impossible de créer le démon récepteur ZeroMQ. Le socket est sans doute déjà en cours d'utilisation." #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "DONNEES RECUES PAR LE CONSOMMATEUR : %s" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "Version de l'enveloppe ZMQ non prise en charge ou inconnue." #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "Passez l'enregistrement de la rubrique. Rubrique déjà enregistrée." #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "Le consommateur est un zmq.%s" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "Création de charge utile" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "Création du socket de file d'attente pour l'unité en attente de réponse" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "Envoi de transtypage" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "Transtypage envoyé ; attente de la réponse" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "Message reçu : %s" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "Décompression de la réponse" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "Enveloppe ZMQ non prise en charge ou inconnue renvoyée." #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "Message appel de procédure distante non valide." #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "Envoi de message(s) à : %s" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "Aucun résultat du matchmaker. Pas de transtypage." #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "Aucune correspondance du matchmaker." #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "rpc_zmq_matchmaker = %(orig)s est obsolète; utiliser plutôt %(new)s" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "Aucune correspondance trouvée par MatchMaker." #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "Matchmaker n'implémente pas d'enregistrement ou de pulsation." #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "Matchmaker non enregistré : %(key)s, %(host)s" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "Enregistre avant le début des pulsations." #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "Aucune clé définissant les hôtes pour la rubrique '%s'. Voir le fichier de clés." #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "Création de la connexion Consommateur pour le service %s" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/id/0000775000175300017540000000000012316614636020033 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/id/LC_MESSAGES/0000775000175300017540000000000012316614636021620 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/id/LC_MESSAGES/ironic.po0000664000175300017540000015052012316614116023437 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/openstack/language/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/tl/0000775000175300017540000000000012316614636020056 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/tl/LC_MESSAGES/0000775000175300017540000000000012316614636021643 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/tl/LC_MESSAGES/ironic.po0000664000175300017540000015064112316614116023466 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Tagalog (http://www.transifex.com/projects/p/openstack/language/tl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: tl\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "natanggap %s" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "walang paraan para sa mensahe: %s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "Walang paraan para sa mensahe: %s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/fil/0000775000175300017540000000000012316614636020211 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/fil/LC_MESSAGES/0000775000175300017540000000000012316614636021776 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/fil/LC_MESSAGES/ironic.po0000664000175300017540000015052612316614116023623 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Filipino (http://www.transifex.com/projects/p/openstack/language/fil/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: fil\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/ne/0000775000175300017540000000000012316614636020041 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ne/LC_MESSAGES/0000775000175300017540000000000012316614636021626 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ne/LC_MESSAGES/ironic.po0000664000175300017540000015052312316614116023450 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Nepali (http://www.transifex.com/projects/p/openstack/language/ne/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: ne\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/bn_IN/0000775000175300017540000000000012316614636020424 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/bn_IN/LC_MESSAGES/0000775000175300017540000000000012316614636022211 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/bn_IN/LC_MESSAGES/ironic.po0000664000175300017540000015054212316614116024034 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Bengali (India) (http://www.transifex.com/projects/p/openstack/language/bn_IN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: bn_IN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/sr/0000775000175300017540000000000012316614636020063 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/sr/LC_MESSAGES/0000775000175300017540000000000012316614636021650 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/sr/LC_MESSAGES/ironic.po0000664000175300017540000015070612316614116023475 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/openstack/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "syslog okruženje mora biti jedno od: %s" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/eu/0000775000175300017540000000000012316614636020050 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/eu/LC_MESSAGES/0000775000175300017540000000000012316614636021635 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/eu/LC_MESSAGES/ironic.po0000664000175300017540000015052312316614116023457 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Basque (http://www.transifex.com/projects/p/openstack/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: eu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/hr/0000775000175300017540000000000012316614636020050 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/hr/LC_MESSAGES/0000775000175300017540000000000012316614636021635 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/hr/LC_MESSAGES/ironic.po0000664000175300017540000015063512316614116023463 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Croatian (http://www.transifex.com/projects/p/openstack/language/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/is_IS/0000775000175300017540000000000012316614636020445 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/is_IS/LC_MESSAGES/0000775000175300017540000000000012316614636022232 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/is_IS/LC_MESSAGES/ironic.po0000664000175300017540000015054612316614116024061 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Icelandic (Iceland) (http://www.transifex.com/projects/p/openstack/language/is_IS/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: is_IS\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/en_AU/0000775000175300017540000000000012316614636020426 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/en_AU/LC_MESSAGES/0000775000175300017540000000000012316614636022213 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/en_AU/LC_MESSAGES/ironic.po0000664000175300017540000016371412316614116024043 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: English (Australia) (http://www.transifex.com/projects/p/openstack/language/en_AU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: en_AU\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "An unknown exception occurred." #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "Exception in string format operation" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "Invalid backend: %s" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "Reloading cached file %s" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "disabled" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "Original exception being dropped: %s" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "Unexpected exception occurred %d time(s)... retrying." #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "Could not release the acquired lock `%s`" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "Got semaphore \"%(lock)s\"" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "Attempting to grab file lock \"%(lock)s\"" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "Created lock path: %s" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "Got file lock \"%(lock)s\" at %(path)s" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "Released file lock \"%(lock)s\" at %(path)s" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "Got semaphore / lock \"%(function)s\"" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "Semaphore / lock released \"%(function)s\"" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "Deprecated: %s" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "Error loading logging config %(log_config)s: %(err_msg)s" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "syslog facility must be one of: %s" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "Fatal call to deprecated config: %(msg)s" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "task run outlasted interval by %s sec" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "in fixed duration looping call" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "Dynamic looping call sleeping for %.02f seconds" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "in dynamic looping call" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "No handler for matches of kind %s" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "Got unknown keyword args to utils.execute: %r" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "Running cmd (subprocess): %s" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "Result was %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "%r failed. Retrying." #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "Running cmd (SSH): %s" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "Environment not supported over SSH" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "process_input not supported over SSH" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "Full set of CONF:" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "Caught %s, exiting" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "Exception during rpc cleanup." #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "Parent process has died unexpectedly, exiting" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "Unhandled exception" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "Forking too fast, sleeping" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "Started child %d" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "Starting %d workers" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "Child %(pid)d killed by signal %(sig)d" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "Child %(pid)s exited with status %(code)d" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "pid %d not in child list" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "Caught %s, stopping children" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "Waiting on %d children to exit" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "Unable to find cert_file : %s" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "Unable to find ca_file : %s" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "Unable to find key_file : %s" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "When running server in SSL mode, you must specify both a cert_file and key_file option value in your configuration file" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "Invalid SSL version : %s" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "Unrecognised value '%(val)s', acceptable values are: %(acceptable)s" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "Invalid string format: %s" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "Unknown byte multiplier: %s" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "Invalid Parameter: Unicode is not supported by the current database." #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "version should be an integer" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "Sort key supplied was not valid." #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "Unknown sort direction, must be 'desc' or 'asc'" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "Please specify column %s in col_name_col_instance param. It is required because column has unsupported type by sqlite)." #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "col_name_col_instance param has wrong type of column instance for column %s It should be instance of sqlalchemy.Column." #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "Unsupported id columns type" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "%s not in valid priorities" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "Problem '%(e)s' attempting to send to notification system. Payload=%(payload)s" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "Failed to load notifier %s. These notifications will not be sent." #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "Could not send notification to %(topic)s. Payload=%(message)s" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "Pool creating new connection" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "_call_waiters: %s" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "Number of call waiters is greater than warning threshold: %d. There could be a MulticallProxyWaiter leak." #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "unpacked context: %s" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "UNIQUE_ID is %s." #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "received %s" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "no method for message: %s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "No method for message: %s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "Expected exception during message handling (%s)" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "Exception during message handling" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "Making synchronous call on %s ..." #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "MSG_ID is %s" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "Making asynchronous cast on %s..." #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "Making asynchronous fanout cast..." #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "Sending %(event_type)s on %(topic)s" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "An unknown RPC related exception occurred." #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "Remote error: %(exc_type)s %(value)s\n%(traceback)s." #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: \"%(method)s\" info: \"%(info)s\"" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "Found duplicate message(%(msg_id)s). Skipping it." #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "Invalid reuse of an RPC connection." #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "Specified RPC version, %(version)s, not supported by this endpoint." #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "Specified RPC envelope version, %(version)s, not supported by this endpoint." #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "Specified RPC version cap, %(version_cap)s, is too low" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "Returning exception %s to caller" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "Failed to process message ... skipping it." #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "Failed to process message ... will requeue." #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "Reconnecting to AMQP server on %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "Connected to AMQP server on %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "Unable to connect to AMQP server on %(hostname)s:%(port)d after %(max_retries)d tries: %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying again in %(sleep_time)d seconds." #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "Failed to declare consumer for topic '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "Timed out waiting for RPC response: %s" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "Failed to consume message from queue: %s" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "Failed to publish message to topic '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "Invalid value for qpid_topology_version: %d" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "Failed to process message... skipping it." #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "Connected to AMQP server on %s" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "Re-established AMQP queues" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "Error processing message. Skipping it." #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "JSON serialization failed." #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "Deserialising: %s" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "Connecting to %(addr)s with %(type)s" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "-> Subscribed to %(subscribe)s" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "-> bind: %(bind)s" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "Could not open socket." #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "Subscribing to %s" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "ZeroMQ socket could not be closed." #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "You cannot recv on this socket." #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "You cannot send on this socket." #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "Running func with context: %s" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "Sending reply" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "RPC message did not include method." #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "Registering reactor" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "In reactor registered" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "Consuming socket" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "Creating proxy for topic: %s" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "Topic contained dangerous characters." #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "Topic socket file creation failed." #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "Required IPC directory does not exist at %s" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "Permission denied to IPC directory at %s" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "Could not create ZeroMQ receiver daemon. Socket may already be in use." #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "CONSUMER RECEIVED DATA: %s" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "ZMQ Envelope version unsupported or unknown." #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "Skipping topic registration. Already registered." #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "Consumer is a zmq.%s" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "Creating payload" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "Creating queue socket for reply waiter" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "Sending cast" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "Cast sent; Waiting reply" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "Received message: %s" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "Unpacking response" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "Unsupported or unknown ZMQ envelope returned." #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "RPC Message Invalid." #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "Sending message(s) to: %s" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "No matchmaker results. Not casting." #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "No match from matchmaker." #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "Match not found by MatchMaker." #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "Matchmaker does not implement registration or heartbeat." #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "Matchmaker unregistered: %(key)s, %(host)s" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "Register before starting heartbeat." #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "No key defining hosts for topic '%s', see ringfile" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "Creating Consumer connection for Service %s" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/sl_SI/0000775000175300017540000000000012316614636020450 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/sl_SI/LC_MESSAGES/0000775000175300017540000000000012316614636022235 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/sl_SI/LC_MESSAGES/ironic.po0000664000175300017540000015063312316614116024061 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Slovenian (Slovenia) (http://www.transifex.com/projects/p/openstack/language/sl_SI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: sl_SI\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/kn/0000775000175300017540000000000012316614636020047 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/kn/LC_MESSAGES/0000775000175300017540000000000012316614636021634 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/kn/LC_MESSAGES/ironic.po0000664000175300017540000015051512316614116023457 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Kannada (http://www.transifex.com/projects/p/openstack/language/kn/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: kn\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/fa/0000775000175300017540000000000012316614636020025 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/fa/LC_MESSAGES/0000775000175300017540000000000012316614636021612 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/fa/LC_MESSAGES/ironic.po0000664000175300017540000015051512316614116023435 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Persian (http://www.transifex.com/projects/p/openstack/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/te_IN/0000775000175300017540000000000012316614636020435 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/te_IN/LC_MESSAGES/0000775000175300017540000000000012316614636022222 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/te_IN/LC_MESSAGES/ironic.po0000664000175300017540000015054112316614116024044 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Telugu (India) (http://www.transifex.com/projects/p/openstack/language/te_IN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: te_IN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/nb/0000775000175300017540000000000012316614636020036 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/nb/LC_MESSAGES/0000775000175300017540000000000012316614636021623 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/nb/LC_MESSAGES/ironic.po0000664000175300017540000015070712316614116023451 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Norwegian Bokmål (http://www.transifex.com/projects/p/openstack/language/nb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: nb\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "En ukjent feil oppsto." #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "Ikke autorisert." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "Ressurs ble ikke funnet." #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "Resultat var %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "%r feilet. Prøver på nytt." #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/ar/0000775000175300017540000000000012316614636020041 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ar/LC_MESSAGES/0000775000175300017540000000000012316614636021626 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ar/LC_MESSAGES/ironic.po0000664000175300017540000015064612316614116023456 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/openstack/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/tl_PH/0000775000175300017540000000000012316614636020445 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/tl_PH/LC_MESSAGES/0000775000175300017540000000000012316614636022232 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/tl_PH/LC_MESSAGES/ironic.po0000664000175300017540000014716112316614116024060 0ustar jenkinsjenkins00000000000000# Filipino (Philippines) translations for ironic. # Copyright (C) 2013 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-28 06:06+0000\n" "PO-Revision-Date: 2013-11-12 16:15+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Tagalog (Philippines) " "(http://www.transifex.com/projects/p/openstack/language/tl_PH/)\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state" " %(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains" " nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not " "found in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor " "workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. " "Updating registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new " "state is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node " "state %(actual)s does not match expected state '%(state)s'. Updating DB " "state to '%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. " "Error: %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected " "state '%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted" " by another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with " "maintanence mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested " "state = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while " "aborting. More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following " "error: %(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details:" " %(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following " "error: %(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one " "of %(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:432 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed" " to ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason:" " %(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:129 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:156 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:357 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:387 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:485 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP " "BOOT options." msgstr "" #: ironic/drivers/modules/pxe.py:504 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:508 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node" " %(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:543 ironic/drivers/modules/ssh.py:377 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:554 msgid "" "Couldn't get the URL of the Ironic API service from the configuration " "file or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:664 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:681 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:695 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:716 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in " "maintenance mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:728 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:740 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:742 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:745 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:754 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:756 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:111 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:136 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:159 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:175 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:182 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:187 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:196 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:229 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:260 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:265 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:278 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:382 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after " "%(retries)d retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node " "%(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp " "the current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-" "deleted feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column " "%s It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could" " be a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method:" " \"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this " "endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/pt/0000775000175300017540000000000012316614636020062 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/pt/LC_MESSAGES/0000775000175300017540000000000012316614636021647 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/pt/LC_MESSAGES/ironic.po0000664000175300017540000015615212316614116023475 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Portuguese (http://www.transifex.com/projects/p/openstack/language/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: pt\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "Ocorreu uma exceção desconhecida." #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "Não autorizado." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "Parâmetros inceitáveis." #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "Não foi possível encontrar o recurso." #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "Não autorizado para a imagem %(image_id)s." #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "A recarregar o ficheiro em cache %s" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "Pedido: %s" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "A função registo do sistema deve ser uma de %s" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "Chamada fatal para a config. pedida: %(msg)s" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "na chamada de repetição da duração fixada" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "na chamada de repetição dinâmica" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "Não é possível encontrar cert_file : %s" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "Não é possível encontrar ca_file : %s" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "Não é possível encontrar key_file : %s" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "Quando executar o servidor no modo SSL, deverá especificar o valor da opção de ambos os ficheiros cert_file e key_file no seu ficheiro de configuração" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "Versão SSL inválida: %s" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "Multiplicador de byte desconhecido: %s" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "Parâmetro Inválido: o Unicode não é suportado pela base de dados atual." #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "Id. do tipo de colunas não suportada" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "%s não nas prioridades válidas" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "Problema '%(e)s' ao tentar enviar para a notificação do sistema. Carga=%(payload)s" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "Falha para carregar o notificador %s. Estas notificações não serão enviadas." #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "Não foi possível enviar a notificação para %(topic)s. Carga=%(message)s" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "contexto descompactado: %s" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "A UNIQUE_ID é %s." #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "recebido %s" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "nenhum método para a mensagem: %s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "nenhum método para a mensagem: %s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "A MSG_ID é %s" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "Erro Remoto: %(exc_type)s %(value)s\n%(traceback)s." #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "Tempo expirado enquanto aguardava a resposta RPC - tópico: \"%(topic)s\", método RPC: \"%(method)s\" informação: \"%(info)s\"" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "Encontrada mensagem duplicada (%(msg_id)s). A ignorá-la." #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "Exceção %s devolvida para o chamador" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "Não foi possível processar a mensagem ... a ignorá-la." #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "Não foi possível processar a mensagem ... será recolocada na fila." #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "A religar ao servidor AMQP %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "Ligado ao servidor AMQP em %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "Não é possível ligar ao servidor AMQP em %(hostname)s:%(port)d after %(max_retries)d tentativas: %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "Valor inválido para qpid_topology_version: %d" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "Falha ao processar a mensagem ... a ignorá-la." #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "Ligado ao servidor AMQP em %s" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "Restabelecidas as filas AMQP" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "Erro ao processar a mensagem. A ignorá-la.." #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "A seriação JSON falhou." #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "Anulação da seriação: %s" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "A ligar a %(addr)s com %(type)s" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "-> Subscrito para %(subscribe)s" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "-> limitar: %(bind)s" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "Não foi possível abrir o socket." #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "A subscrever para %s" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "Não pode receber neste socket." #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "Não pode enviar neste socket." #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "A executar a função com contexto: %s" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "A enviar resposta" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "A mensagem RPC não incluiu o método." #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "A registar reator" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "Registado no reator" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "O tópico contém carateres perigosos." #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "A diretoria IPC necessária não existe em %s" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "Permissão negada para a diretoria IPC em %s" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "Versão ENVELOPE ZMQ não suportada ou desconhecida." #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "A ignorar o registo do tópico. Já registado." #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "A criar carga" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "Mensagem recebida: %s" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "A descompactar resposta" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "Envelope ZMQ devolvido não suportado ou desconhecido." #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "Mensagem RPC Inválida." #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "A enviar mensagem(ns) para: %s" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/tr_TR/0000775000175300017540000000000012316614636020471 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/tr_TR/LC_MESSAGES/0000775000175300017540000000000012316614636022256 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/tr_TR/LC_MESSAGES/ironic.po0000664000175300017540000015325012316614116024100 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:25+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/openstack/language/tr_TR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: tr_TR\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "Bilinmeyen bir istisna oluştu." #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "Yetkiniz yok." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "Kabul edilemez parametreler var." #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "%(image_id)s imajı kabul edilemez: %(reason)s" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "Hatalar: %(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "Kaynak bulunamadı." #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "%(image_id)s imaj kaynak dosyası bulunamadı." #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "Geçersiz %(image_href)s imaj kaynak dosyası." #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "%(path)s'deki yapılandırma bulunamadı" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "Geçersiz backend: %s" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "VCPU ayarlanamadı, CPU koleksiyonunun bozulduğu varsayılıyor" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "syslog servisi bunlardan biri olmak zorundadır: %s" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "%(full_task_name)s periyodik görevi çalışıyor" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "%(full_task_name)s sırasında hata: %(e)s" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "utils.execute için bilinmeyen anahtar kelime argümanları: %r" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "Çalışan komut(alt süreç): %s" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "Sonuç %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "%r hatalı. Yeniden deneniyor." #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "Çalışan komut(SSH): %s" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "SSH üzerinde ortam desteklenmemektedir." #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "SSH üzerinde process_input desteklenmemektedir." #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "%s yakalandı, çıkılıyor" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "Yakalanmamış istisna" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "cert_file bulunamadı: %s" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "ca_file bulunamadı: %s" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "key_file bulunamadı: %s" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "Geçersiz SSL sürümü: %s" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "Sürüm tam sayı olmak zorunda" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "Tanınmayan silinmiş okuma değeri '%s'" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "alınan %s" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "%s mesajı için yöntem bulunamadı" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "%s mesajı için yöntem bulunamadı." #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "Geçersi RPC bağlantısı kullanımı." #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "Mesaj işleme başarısız ... atlanıyor." #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "Mesaj işleme başarısız ... yeniden kuyruğa alınacak." #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "AMQP kuyrukları tekrar kuruluyor" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "Cevap gönderiliyor" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "RPC Mesajı Geçersiz." #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "%s servisi için tüketici bağlantısı oluşturuluyor." #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/eu_ES/0000775000175300017540000000000012316614636020437 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/eu_ES/LC_MESSAGES/0000775000175300017540000000000012316614636022224 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/eu_ES/LC_MESSAGES/ironic.po0000664000175300017540000014713612316614116024054 0ustar jenkinsjenkins00000000000000# Basque (Spain) translations for ironic. # Copyright (C) 2013 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-28 06:06+0000\n" "PO-Revision-Date: 2013-11-15 02:27+0000\n" "Last-Translator: daisy.ycguo \n" "Language-Team: Basque (Spain) " "(http://www.transifex.com/projects/p/openstack/language/eu_ES/)\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state" " %(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains" " nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not " "found in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor " "workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. " "Updating registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new " "state is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node " "state %(actual)s does not match expected state '%(state)s'. Updating DB " "state to '%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. " "Error: %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected " "state '%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted" " by another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with " "maintanence mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested " "state = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while " "aborting. More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following " "error: %(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details:" " %(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following " "error: %(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one " "of %(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:432 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed" " to ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason:" " %(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:129 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:156 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:357 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:387 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:485 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP " "BOOT options." msgstr "" #: ironic/drivers/modules/pxe.py:504 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:508 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node" " %(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:543 ironic/drivers/modules/ssh.py:377 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:554 msgid "" "Couldn't get the URL of the Ironic API service from the configuration " "file or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:664 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:681 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:695 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:716 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in " "maintenance mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:728 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:740 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:742 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:745 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:754 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:756 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:111 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:136 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:159 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:175 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:182 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:187 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:196 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:229 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:260 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:265 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:278 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:382 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after " "%(retries)d retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node " "%(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp " "the current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-" "deleted feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column " "%s It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could" " be a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method:" " \"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this " "endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/sw_KE/0000775000175300017540000000000012316614636020447 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/sw_KE/LC_MESSAGES/0000775000175300017540000000000012316614636022234 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/sw_KE/LC_MESSAGES/ironic.po0000664000175300017540000015054212316614116024057 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Swahili (Kenya) (http://www.transifex.com/projects/p/openstack/language/sw_KE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: sw_KE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/he/0000775000175300017540000000000012316614636020033 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/he/LC_MESSAGES/0000775000175300017540000000000012316614636021620 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/he/LC_MESSAGES/ironic.po0000664000175300017540000015052312316614116023442 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/openstack/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: he\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/en_US/0000775000175300017540000000000012316614636020450 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/en_US/LC_MESSAGES/0000775000175300017540000000000012316614636022235 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/en_US/LC_MESSAGES/ironic.po0000664000175300017540000014716512316614116024067 0ustar jenkinsjenkins00000000000000# English (United States) translations for ironic. # Copyright (C) 2013 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-28 06:06+0000\n" "PO-Revision-Date: 2013-11-12 16:15+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: English (United States) " "(http://www.transifex.com/projects/p/openstack/language/en_US/)\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state" " %(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains" " nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not " "found in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor " "workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. " "Updating registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new " "state is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node " "state %(actual)s does not match expected state '%(state)s'. Updating DB " "state to '%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. " "Error: %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected " "state '%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted" " by another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with " "maintanence mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested " "state = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while " "aborting. More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following " "error: %(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details:" " %(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following " "error: %(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one " "of %(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:432 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed" " to ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason:" " %(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:129 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:156 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:357 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:387 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:485 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP " "BOOT options." msgstr "" #: ironic/drivers/modules/pxe.py:504 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:508 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node" " %(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:543 ironic/drivers/modules/ssh.py:377 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:554 msgid "" "Couldn't get the URL of the Ironic API service from the configuration " "file or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:664 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:681 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:695 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:716 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in " "maintenance mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:728 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:740 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:742 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:745 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:754 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:756 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:111 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:136 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:159 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:175 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:182 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:187 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:196 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:229 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:260 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:265 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:278 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:382 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after " "%(retries)d retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node " "%(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp " "the current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-" "deleted feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column " "%s It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could" " be a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method:" " \"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this " "endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/cs/0000775000175300017540000000000012316614636020044 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/cs/LC_MESSAGES/0000775000175300017540000000000012316614636021631 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/cs/LC_MESSAGES/ironic.po0000664000175300017540000015552412316614116023461 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:25+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Czech (http://www.transifex.com/projects/p/openstack/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: cs\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "Vyskytla se neočekávaná výjimka." #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "Výjimka při operaci s formátem řetězce" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "Neschváleno." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "Nepřijatelné parametry." #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "Obraz %(image_id)s je nepřijatelný: %(reason)s" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "Zdroj nemohl být nalezen." #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "Obraz %(image_id)s nemohl být nalezen." #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "Připojení k hostiteli glance %(host)s:%(port)s selhalo: %(reason)s" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "Nemáte oprávnění k použití obrazu %(image_id)s." #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "Neplatný href %(image_href)s obrazu." #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "Nelze najít nastavení v %(path)s" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "zpracování 'qemu-img info' selhalo." #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "fmt=%(fmt)s zálohováno: %(backing_file)s" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "Převedeno na prosté, ale formát je nyní %s" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "Neplatná podpůrná vrstva: %s" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "Znovu načítání souboru mezipaměti %s" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "Nelze odstranit dočasný adresář: %s" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "VCPU nenastaveny; předpokládáno poškození sbírky CPU" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "zařízení záznamu systému musí být jedno z: %s" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "Spuštění pravidelné úlohy %(full_task_name)s" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "Chyba při %(full_task_name)s: %(e)s" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "Získány neznámé argumenty klíčového slova pro utils.execute: %r" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "Spouštění příkazu (podproces): %s" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "Výsledek byl %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "%r selhalo. Opakování." #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "Spouštění příkazu (SSH): %s" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "Prostředí není podporováno přes SSH" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "process_input není podporován přes SSH" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "Neplatný parametr: Unicode není současnou databází podporován." #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "verze by měla být celé číslo" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "Nerozpoznaná hodnota read_deleted '%s'" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "%s není v platných prioritách" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "Problém '%(e)s' se pokouší poslat do systému oznámení. Náklad=%(payload)s" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "Nelze odeslat oznámení na %(topic)s. Obsah=%(message)s" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "rozbalený kontext: %s" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "obdrženo: %s" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "pro zprávu není metoda: %s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "Pro zprávu není metoda: %s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "MSG_ID je %s" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "Provádění asynchronního obsazení na %s ..." #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "Provádění asynchronního obsazení rozvětvení..." #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "Odesílání %(event_type)s na %(topic)s" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "Vzdálená chyba: %(exc_type)s %(value)s\n%(traceback)s." #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "Neplatné znovu použití připojení RPC." #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "Volajícímu je vrácena výjimka: %s" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "Znovu připojování k serveru AMQP na %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "Připojení k serveru AMQP na %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "Nelze se připojit k serveru AMQP na %(hostname)s:%(port)d po %(max_retries)d pokusech: %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "AMQP server na %(hostname)s:%(port)d je nedosažitelný: %(err_str)s. Další pokus za %(sleep_time)d vteřin." #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "Nelze deklarovat spotřebitele pro téma '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "Při čekání na odpověď RPC vypršel čas: %s" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "Nelze spotřebovat zprávu z fronty: %s" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "Nelze vydat zprávu do tématu '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "Nelze zpracovat zprávu... přeskakování." #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "Připojeno k serveru AMQP na %s" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "Znovu obnoveny fronty AMQP" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "Chyba při zpracování zprávy. Přeskakování." #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "Vytváření připojení zákazníka pro službu %s" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/ru/0000775000175300017540000000000012316614636020065 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ru/LC_MESSAGES/0000775000175300017540000000000012316614636021652 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ru/LC_MESSAGES/ironic.po0000664000175300017540000015621112316614116023474 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Russian (http://www.transifex.com/projects/p/openstack/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "Обнаружено неизвестное исключение." #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "Не авторизировано." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "Недопустимые параметры." #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "Образ %(image_id)s недопустим: %(reason)s" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "Ресурс не может быть найден." #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "Образ %(image_id)s не найден." #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "Нет доступа к образу %(image_id)s." #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "Недопустимый образ href %(image_href)s." #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "Невозможно найти конфигурацию по адресу %(path)s" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "Ошибка анализа 'qemu-img info'." #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "Преобразование в необработанный, но текущий формат %s" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "Недопустимый внутренний интерфейс: %s" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "Запуск повторяющегося задания %(full_task_name)s" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "Ошибка во время %(full_task_name)s: %(e)s" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "Приняты неизвестные аргументы ключевого слова для utils.execute: %r" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "Выполнение команды (субпроцесс): %s" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "Результат %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "%r ошибка. Выполняется повтор." #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "Выполнение команды (SSH): %s" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "Среда не поддерживается с использованием SSH" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "process_input не поддерживается с использованием SSH" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "Недопустимый параметр: Unicode не поддерживается используемой базой данных" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "Нераспознанное значение read_deleted '%s'" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "%s не в допустимых приоритетах" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "Неполадка '%(e)s', попытка отправить в систему уведомлений. Нагрузка=%(payload)s" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "неизвлечённый контекст: %s" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "получено %s" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "не определен метод для сообщения: %s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "Не определен метод для сообщения: %s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "MSG_ID is %s" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "Удалённая ошибка: %(exc_type)s %(value)s\n%(traceback)s." #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "Неверное переиспользование соединения RPC" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "Возврат исключения %s вызывающему" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "Повторное подключение к серверу AMQP на %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "Подключение к серверу AMQP на %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "Невозможно подключиться к серверу AMQP на %(hostname)s:%(port)d после %(max_retries)d попыток: %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "AMQP сервер на %(hostname)s:%(port)d недоступен: %(err_str)s. Повторная попытка через %(sleep_time)d секунд." #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "Ошибка объявления потребителю темы '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "Ошибка принятия сообщения из очереди: %s" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "Ошибка публикации сообщения в тему '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/uk/0000775000175300017540000000000012316614636020056 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/uk/LC_MESSAGES/0000775000175300017540000000000012316614636021643 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/uk/LC_MESSAGES/ironic.po0000664000175300017540000015234612316614116023472 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: # romcheg , 2013 # romcheg , 2013 msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/openstack/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "Метод не вказано." #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "Ідентифікатор шасі не вказано." #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "Не авторизовано." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "Операцію не дозволено." #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "Ресурс не знайдено." #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "Не вдалось завантажити драйвер %(driver_name)s." #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "Образ %(image_id)s не знайдено." #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "Порт %(port)s не знайдено." #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "Шасі %(chassis)s не знайдено." #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "Помилка при підключенні" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "Не вдалось видалити тимчасову директорію: %s" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "версія повинна бути цілим числом" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "UNIQUE_ID: %s." #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "отримано %s" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "без порядку для повідомлень: %s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "Без порядку для повідомлень: %s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "MSG_ID %s" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/ka_GE/0000775000175300017540000000000012316614636020405 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ka_GE/LC_MESSAGES/0000775000175300017540000000000012316614636022172 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ka_GE/LC_MESSAGES/ironic.po0000664000175300017540000015062712316614116024021 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Georgian (Georgia) (http://www.transifex.com/projects/p/openstack/language/ka_GE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: ka_GE\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "არ არის ავტორიზებული." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/pt_BR/0000775000175300017540000000000012316614636020445 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/pt_BR/LC_MESSAGES/0000775000175300017540000000000012316614636022232 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/pt_BR/LC_MESSAGES/ironic.po0000664000175300017540000017253012316614116024056 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: # aflalves , 2014 # aflalves , 2014 # Gabriel Wainer, 2013 # Gabriel Wainer, 2013 # lucasagomes , 2014 msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:25+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/openstack/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "Método não especificado" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "ID de chassi não especificado." #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "ID de nodo não especificado" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "Limite deve ser positivo" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "Configuração:" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "Ocorreu uma exceção desconhecida." #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "Exceção na operação de formato de sequência" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "Não autorizado." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "Operação não permitida." #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "Parâmetros inaceitáveis." #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "Esperado um UUID mas recebido %(uuid)s." #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "A imagem %(image_id)s é inaceitável: %(reason)s" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "Recursos não pôde ser encontrado." #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "Falha ao carregar o driver %(driver_name)s." #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "Imagem %(image_id)s não pôde ser encontrada." #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "instância %(instance)s não pôde ser encontrada." #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "Nó %(node)s não pôde ser encontrado." #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "Porta %(port)s não pôde ser encontrada." #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "Chassis %(chassis)s não pode ser encontrado." #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "Conductor %(conductor)s não pode ser encontrado." #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "Conductor %(conductor)s já registrado." #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "Conexão ao host de visão rápida %(host)s:%(port)s com falha: %(reason)s" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "Não autorizado para a imagem %(image_id)s." #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "Imagem inválida href %(image_href)s." #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "Conexão falhou" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "Não foi possível localizar a configuração em %(path)s" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "Lista de capturas instantâneas encontradas, mas nenhum cabeçalho localizado!" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "Falha na análise de 'qemu-img info'." #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "fmt=%(fmt)s retornado por: %(backing_file)s" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "Convertido em bruto, mas o formato é agora %s" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "Conexão SSH falhou: %s" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "Backend inválido: %s" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "Recarregando arquivo em cache %s" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "Não foi possível remover tmpdir: %s" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "Falha ao desvincular %(path)s, erro: %(e)s" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "Falha ao remover dir %(path)s, erro: %(e)s" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "Falha ao criar symlink de %(source)s para %(link)s, erro: %(e)s" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "Erro ao entrar em contato com o servidor de visão rápida '%(host)s:%(port)s' para '%(method)s', %(extra)s." #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "Notificação recebida: %r" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "Desabilitado" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "Comando: %s" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "StdOut: %r" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "StdErr: %r" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "ipmitool stdout: '%(out)s', stderr: '%(err)s'" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "'%s' não é um valor inteiro." #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "Construindo configuração PXE para implementação %s." #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "Endereço Mac encontrado: %s" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "VCPUs não configurado; supondo coleta da CPU quebrada" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "%(host_state)s não possui %(requested_disk)s MB de disco utilizável, ele possui apenas %(usable_disk_mb)s MB de disco utilizável." #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "%(host_state)s não possui %(requested_ram)s MB de ram utilizável, ele possui apenas %(usable_ram)s MB de ram utilizável." #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "Exceção original sendo descartada: %s" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "Exceção não esperada ocorreu %d vez(es)... tentando novamente." #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "Não foi possível liberar o bloqueio adquirido `%s`" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "Recebeu semáforo \"%(lock)s\"" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "Tentando capturar lock de arquivo \"%(lock)s\"" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "Criado caminho de lock: %s" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "Obteve lock do arquivo \"%(lock)s\" em %(path)s" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "Liberado lock de arquivo \"%(lock)s\" em %(path)s" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "Recebeu semáforo / lock \"%(function)s\"" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "Liberado semáforo / lock \"%(function)s\"" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "Deprecado: %s" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "Erro carregando configuração de logging %(log_config)s: %(err_msg)s" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "o recurso syslog deve ser um dos seguintes: %s" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "Chamada fatal para configuração descontinuada: %(msg)s" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "a execução da tarefa durou %s segundos mais que o intervalo" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "em uma chamada de laço de duração fixa" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "Chamada de laço dinâmico dormindo por %.02f segundos" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "em chamada de laço dinâmico" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "Argumento inesperado para criação de tarefa periódica: %(arg)s." #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "Ignorando tarefa periódica %(task)s porque seu intervalo é negativo" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "Ignorando tarefa periódica %(task)s porque ela está desativada" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "Executando tarefa periódica %(full_task_name)s" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "Erro durante %(full_task_name)s: %(e)s" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "Falha ao entender a regra %(rule)s" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "Nenhum manipulador para correspondências do tipo %s" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "Falha ao entender a regra %(rule)r" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "Obteve args de palavra-chave desconhecidos para utils.execute: %r" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "Executando comando (subprocesso): %s" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "Resultado foi %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "%r falhou. Tentando novamente." #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "Executando o comando (SSH): %s" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "Ambiente não suportado sobre SSH" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "process_input não suportado sobre SSH" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "Conjunto completo de CONF:" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "%s capturadas, saindo" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "Exceção durante limpeza de RPC." #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "Processo pai saiu inesperadamente, saindo" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "Exceção não tratada" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "Bifurcação muito rápida, suspendendo" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "Filho %d iniciado" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "Iniciando %d trabalhadores" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "%(pid)d filho eliminado pelo sinal %(sig)d" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "Filho %(pid)s encerrando com status %(code)d" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "pid %d fora da lista de filhos" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "%s capturado, parando filhos" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "Aguardando em %d filhos para sair" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "Não é possível localizar cert_file : %s" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "Não é possível localizar ca_file : %s" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "Não é possível localizar key_file : %s" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "Ao executar o servidor no modo SSL, você deve especificar um valor de opção cert_file e key_file no seu arquivo de configuração" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "versão SSL inválida: %s" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "Valor desconhecido '%(val)s', valores aceitáveis são: %(acceptable)s" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "formato de string inválido: %s" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "Multiplicador de bytes desconhecido: %s" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "Parâmetro Inválido: Unicode não é suportado pelo banco de dados atual." #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "a versão deve ser um número inteiro" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "A chave de classificação fornecida não era válida." #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "Direção de classificação desconhecida; deve ser 'desc' ou 'asc'" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "Valor read_deleted não reconhecido '%s'" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "Especifique a coluna %s no parâmetro 'col_name_col_instance. Isso é necessário porque a coluna possui um tipo não suportado por sqlite)." #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "O parâmetro col_name_col_instance possui um tipo errado de instância da coluna para a coluna %s. Deveria ser uma instância de sqlalchemy.Column." #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "Tipo de colunas ID não suportado" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "%s não em prioridades válidas" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "Problema '%(e)s' ao tentar enviar um sistema de notificação. Carga útil=%(payload)s" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "Falha ao carregar notificador %s. Essas notificações não serão enviadas." #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "Não foi possível enviar notificação para %(topic)s. Carga útil=%(message)s" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "Conjunto criando nova conexão" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "Nenhuma thread chamada esperando por msg_id : %(msg_id)s, mensagem : %(data)s" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "_call_waiters: %s" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "conteúdo descompactado: %s" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "UNIQUE_ID é %s." #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "recebido %s" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "sem método para mensagem: %s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "Sem método para mensagem: %s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "Exceção esperada durante a manipulação de mensagem (%s)" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "Exceção durante a manipulação de mensagem" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "Fazendo chamada síncrona em %s ..." #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "MSG_ID é %s" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "Fazendo conversão assíncrona em %s..." #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "Fazendo conversão de fanout assíncrono..." #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "Enviando %(event_type)s em %(topic)s" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "Um RPC desconhecido relatou exceção ocorrida." #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "Erro remoto: %(exc_type)s %(value)s\n%(traceback)s." #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "Tempo esgotado aguardando resposta RPC - tópico: \"%(topic)s\", método RPC: \"%(method)s\" info: \"%(info)s\"" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "Encontrada mensagem duplicada (%(msg_id)s). Ignorando-a." #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "Reutilização inválida de uma conexão RPC." #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "Versão de RPC especificada, %(version)s, não suportada por este terminal." #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "Versão de envelope de RPC especificada, %(version)s, não suportada por esse terminal." #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "Versão de CAP de RPC, %(version_cap)s, é muito baixa" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "Retornando exceção %s ao método de origem" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "Falha ao processar mensagem...pulando ela." #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "Falha ao processar mensagem... Irá voltar para a fila." #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "Reconectando ao servidor AMQP em %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "Conectado ao servidor AMQP em %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "Não é possível conectar-se ao servidor AMQP no %(hostname)s:%(port)d após %(max_retries)d tentativas: %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "O servidor AMQP em %(hostname)s:%(port)d está inatingível: %(err_str)s. Tentando novamente em %(sleep_time)d segundos." #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "Falha ao declarar consumidor para o tópico '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "Atingido o tempo limite de espera para a resposta de RPC: %s" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "Falha ao consumir mensagem da fila: %s" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "Falha ao publicar mensagem no tópico '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "Valor inválido para qpid_topology_version: %d" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "Falha ao processar mensagem... ignorando-a." #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "Não é possível conectar ao servidor AMQP: %(e)s. Suspendendo em %(delay)s segundos" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "Conectado ao servidor AMQP em %s" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "Filas AMQP restabelecidas" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "Erro ao processar mensagem. Ignorando-o." #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "Falha na serialização de JSON." #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "Desserializando: %s" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "Conectando ao %(addr)s com %(type)s" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "-> Inscrito em %(subscribe)s" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "-> ligação: %(bind)s" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "Não foi possível abrir o soquete." #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "Assinando %s" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "Não é possível receber neste soquete." #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "Não é possível enviar neste soquete." #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "Executando func com o contexto: %s" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "Enviando resposta" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "A mensagem de RPC não incluiu o método." #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "Registrando reator" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "No reator registrado" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "Consumindo soquete" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "Criando proxy para o tópico: %s" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "O tópico continha caracteres perigosos." #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "Falha na criação do arquivo de soquete do tópico." #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "Buffer de lista não processada por tópico local integral para o tópico %(topic)s. Descartando mensagem." #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "Diretório IPC requerido não existe em %s" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "Permissão negada para o doretório IPC em %s" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "Não foi possível criar o daemon receptor ZeroMQ. O soquete já pode estar em uso." #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "CONSUMER RECEIVED DATA: %s" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "Versão de Envelope ZMQ não suportada ou desconhecida." #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "Ignorando registro de tópico. Já registrado." #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "O consumidor é um zmq.%s" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "Criando carga útil" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "Criando soquete de fila para espera de resposta" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "Enviando conversão" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "Conversão enviada; aguardando resposta" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "Mensagem recebida: %s" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "Descompactando resposta" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "Foi retornado um envelope ZMQ não suportado ou desconhecido." #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "Mensagem de RPC Inválida." #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "Enviando mensagem(ns) para: %s" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "Nenhum resultado do matchmaker. Sem conversão." #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "Nenhuma correspondência do matchmaker." #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "rpc_zmq_matchmaker = %(orig)s é deprecado; utilize %(new)s em vez disto" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "Correspondência não localizada pelo MatchMaker." #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "O Matchmaker não implementa registro ou pulsação." #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "Matchmaker não registrado: %(key)s, %(host)s" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "Registre antes de iniciar a pulsação." #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "Nenhuma chave definindo hosts para o tópico '%s'; consulte ringfile" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "Criando conexão do Consumidor para o Serviço %s" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "Falha ao migrar versão %(version)s no mecanismo %(engine)s" ironic-2014.1.rc1/ironic/locale/ml_IN/0000775000175300017540000000000012316614636020435 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ml_IN/LC_MESSAGES/0000775000175300017540000000000012316614636022222 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ml_IN/LC_MESSAGES/ironic.po0000664000175300017540000015054412316614116024047 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Malayalam (India) (http://www.transifex.com/projects/p/openstack/language/ml_IN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: ml_IN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/hi/0000775000175300017540000000000012316614636020037 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/hi/LC_MESSAGES/0000775000175300017540000000000012316614636021624 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/hi/LC_MESSAGES/ironic.po0000664000175300017540000015052212316614116023445 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Hindi (http://www.transifex.com/projects/p/openstack/language/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: hi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/sv/0000775000175300017540000000000012316614636020067 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/sv/LC_MESSAGES/0000775000175300017540000000000012316614636021654 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/sv/LC_MESSAGES/ironic.po0000664000175300017540000015052412316614116023477 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/openstack/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/vi_VN/0000775000175300017540000000000012316614636020460 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/vi_VN/LC_MESSAGES/0000775000175300017540000000000012316614636022245 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/vi_VN/LC_MESSAGES/ironic.po0000664000175300017540000015145112316614116024070 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/openstack/language/vi_VN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: vi_VN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "Xảy ra lỗi chưa xác định thuộc về hệ thống ." #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "Lỗi exception trong tiến trình định dạng chuỗi" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "Chưa được xác nhận." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "Không chấp nhận các tham số." #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "Không chấp nhận hình ảnh %(image_id)s vì: %(reason)s" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "Không tìm thấy nguồn tài nguyên." #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "Không xác nhận cho hình ảnh %(image_id)s." #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "Thông số không hợp lệ: Unicode hiện chưa được hỗ trợ bởi hệ cơ sở dữ liệu hiện tại." #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/el/0000775000175300017540000000000012316614636020037 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/el/LC_MESSAGES/0000775000175300017540000000000012316614636021624 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/el/LC_MESSAGES/ironic.po0000664000175300017540000015053112316614116023445 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Greek (http://www.transifex.com/projects/p/openstack/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/sk/0000775000175300017540000000000012316614636020054 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/sk/LC_MESSAGES/0000775000175300017540000000000012316614636021641 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/sk/LC_MESSAGES/ironic.po0000664000175300017540000015055612316614116023471 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Slovak (http://www.transifex.com/projects/p/openstack/language/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/da/0000775000175300017540000000000012316614636020023 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/da/LC_MESSAGES/0000775000175300017540000000000012316614636021610 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/da/LC_MESSAGES/ironic.po0000664000175300017540000015133112316614116023430 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Danish (http://www.transifex.com/projects/p/openstack/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "Undtagelse i streng-format handlingen" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "syslog faciliteten skal være en af: %s" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "Fatalt kald til forældet konfig: %(msg)s" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "Resultatet var %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "%r mislykkedes. Prøver igen." #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "Ubehandlet undtagelse" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "Ugyldig parameter: Unicode er ikke understøttet af den aktuelle database." #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "modtog %s" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "ingen metode for beskeden: %s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "Ingen metode for beskeden: %s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "MSG_ID er %s" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "Udpakker svar" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "Sender besked(er) til: %s" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/ca/0000775000175300017540000000000012316614636020022 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ca/LC_MESSAGES/0000775000175300017540000000000012316614636021607 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ca/LC_MESSAGES/ironic.po0000664000175300017540000015052412316614116023432 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/openstack/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/sq/0000775000175300017540000000000012316614636020062 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/sq/LC_MESSAGES/0000775000175300017540000000000012316614636021647 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/sq/LC_MESSAGES/ironic.po0000664000175300017540000015052512316614116023473 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Albanian (http://www.transifex.com/projects/p/openstack/language/sq/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: sq\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/it_IT/0000775000175300017540000000000012316614636020447 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/it_IT/LC_MESSAGES/0000775000175300017540000000000012316614636022234 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/it_IT/LC_MESSAGES/ironic.po0000664000175300017540000015054212316614116024057 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Italian (Italy) (http://www.transifex.com/projects/p/openstack/language/it_IT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: it_IT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/ironic.pot0000664000175300017540000014706012316614116021447 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # FIRST AUTHOR , 2014. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: ironic jenkins.ironic.propose.translation.update.140\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-28 06:06+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state" " %(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains" " nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not " "found in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor " "workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. " "Updating registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new " "state is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node " "state %(actual)s does not match expected state '%(state)s'. Updating DB " "state to '%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. " "Error: %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected " "state '%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted" " by another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with " "maintanence mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested " "state = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while " "aborting. More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following " "error: %(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details:" " %(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following " "error: %(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one " "of %(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:432 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed" " to ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason:" " %(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:129 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:156 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:357 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:387 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:485 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP " "BOOT options." msgstr "" #: ironic/drivers/modules/pxe.py:504 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:508 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node" " %(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:543 ironic/drivers/modules/ssh.py:377 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:554 msgid "" "Couldn't get the URL of the Ironic API service from the configuration " "file or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:664 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:681 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:695 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:716 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in " "maintenance mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:728 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:740 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:742 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:745 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:754 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:756 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:111 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:136 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:159 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:175 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:182 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:187 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:196 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:229 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:260 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:265 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:278 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:382 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after " "%(retries)d retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node " "%(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp " "the current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-" "deleted feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column " "%s It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could" " be a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method:" " \"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this " "endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/zh_HK/0000775000175300017540000000000012316614636020442 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/zh_HK/LC_MESSAGES/0000775000175300017540000000000012316614636022227 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/zh_HK/LC_MESSAGES/ironic.po0000664000175300017540000015053712316614116024056 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Chinese (Hong Kong) (http://www.transifex.com/projects/p/openstack/language/zh_HK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: zh_HK\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/zh_TW/0000775000175300017540000000000012316614636020472 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/zh_TW/LC_MESSAGES/0000775000175300017540000000000012316614636022257 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/zh_TW/LC_MESSAGES/ironic.po0000664000175300017540000016474312316614116024112 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:25+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/openstack/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "發生一個未知例外" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "字串格式化作業發生異常狀況" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "未被授權" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "不可接受的參數值" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "需要 UUID,但收到 %(uuid)s。" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "無法接受映像檔 %(image_id)s:%(reason)s" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "找不到資源。" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "找不到映像檔 %(image_id)s。" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "Glance 主機 %(host)s:%(port)s 連線失敗:%(reason)s" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "未獲映像檔 %(image_id)s 的授權。" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "無效的映像檔 href %(image_href)s。" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "在 %(path)s 處找不到配置" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "發現 Snapshot 清單,但找不到標頭!" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "'qemu-img info' 剖析失敗。" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "fmt = %(fmt)s 受 %(backing_file)s 支援" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "已轉換為原始,但格式現在為 %s" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "無效的後端:%s" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "正在重新載入快取檔 %s" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "無法移除 tmpdir:%s" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "無法解除 %(path)s 的鏈結,錯誤:%(e)s" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "無法移除目錄 %(path)s,錯誤:%(e)s" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "無法建立從 %(source)s 到 %(link)s 的符號鏈結,錯誤:%(e)s" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "聯絡 '%(method)s' 的 Glance 伺服器 '%(host)s:%(port)s' 時發生錯誤,%(extra)s" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "已關閉" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "ipmitool 標準輸出:'%(out)s',標準錯誤:'%(err)s'" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "正在給部署 %s 建置 PXE 配置。" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "未設定 VCPU;將假定 CPU 集合已損壞" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "%(host_state)s 沒有 %(requested_disk)s MB 可用磁碟空間,只有 %(usable_disk_mb)s MB 可用磁碟空間。" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "%(host_state)s 沒有 %(requested_ram)s MB 可用 RAM,只有 %(usable_ram)s MB 可用 RAM。" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "正在捨棄原始異常狀況:%s" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "無法釋放獲得的鎖定 `%s`" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "已淘汰:%s" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "Syslog 機能必須是下列其中一項:%s" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "呼叫已淘汰的配置時發生嚴重錯誤:%(msg)s" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "作業執行時間超出間隔 %s 秒鐘" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "在固定持續時間的迴圈呼叫中" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "在動態迴圈呼叫中" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "定期作業建立程序的引數不符合預期:%(arg)s。" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "正在跳過定期作業 %(task)s,因為其間隔為負數" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "正在跳過定期作業 %(task)s,因為它已停用" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "正在執行定期作業 %(full_task_name)s" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "執行 %(full_task_name)s 期間發生錯誤:%(e)s" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "無法理解規則 %(rule)s" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "類型為 %s 的相符項沒有處理程式" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "無法理解規則 %(rule)r" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "已取得 utils.execute 的不明關鍵字引數:%r" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "正在執行 cmd(子程序):%s" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "結果是 %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "%r 失敗。正在重試。" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "正在執行 cmd (SSH):%s" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "無法透過 SSH 來支援環境" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "無法透過 SSH 來支援 process_input" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "一組完整的 CONF:" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "已捕捉到 %s,正在結束" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "母程序已非預期地當掉,正在結束" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "無法處理的異常狀況" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "分岔太快,正在休眠" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "已啟動子項 %d" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "正在啟動 %d 個工作程式" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "信號 %(sig)d 結束了子項 %(pid)d" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "子項 %(pid)s 已結束,狀態為 %(code)d" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "PID %d 不在子項清單中" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "已捕捉到 %s,正在停止子項" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "正在等待 %d 個子項結束" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "找不到 cert_file:%s" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "找不到 ca_file:%s" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "找不到 key_file:%s" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "在 SSL 模式下執行伺服器時,必須在配置檔中指定 cert_file 及 key_file 選項值" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "不明的位元組乘數:%s" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "無效參數:現行資料庫不支援 Unicode。" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "版本應該是整數" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "提供的排序鍵無效。" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "不明的排序方向,必須為 'desc' 或 'asc'" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "無法辨識 read_deleted 值 '%s'" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "請在 col_name_col_instance 參數中指定直欄 %s。它是必要的,因為直欄具有不受 SQLite 支援的類型。" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "col_name_col_instance 參數的直欄 %s 具有錯誤類型的直欄實例。它應該是 sqlalchemy.Column 的實例。" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "%s 的優先順序無效" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "嘗試傳送至通知系統時發生問題 '%(e)s'。有效負載 = %(payload)s" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "無法載入通知者 %s。將不會傳送這些通知。" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "無法將通知傳送給 %(topic)s。有效負載 = %(message)s" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "儲存區正在建立新連線" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "已解壓縮環境定義:%s" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "UNIQUE_ID 為 %s。" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "收到 %s" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "訊息沒有方法:%s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "訊息沒有方法:%s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "處理訊息期間發生預期的異常狀況 (%s)" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "處理訊息期間發生異常狀況" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "正在對 %s 進行同步呼叫..." #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "MSG_ID 為 %s" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "正在對 %s 進行非同步強制轉型..." #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "正在進行非同步展開強制轉型..." #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "正在傳送關於 %(topic)s 的 %(event_type)s" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "發生與 RPC 相關的不明異常狀況。" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "遠端錯誤:%(exc_type)s %(value)s\n%(traceback)s。" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "<未知>" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "發現重複的訊息 (%(msg_id)s)。正在跳過該訊息。" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "重複使用 RPC 連線無效。" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "此端點不支援所指定的 RPC 版本 %(version)s。" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "此端點不支援所指定的 RPC 封套版本 %(version)s。" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "正在將異常狀況 %s 傳回至呼叫程式" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "正在重新連接至 %(hostname)s:%(port)d 上的 AMQP 伺服器" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "已連接至 %(hostname)s:%(port)d 上的 AMQP 伺服器" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "嘗試 %(max_retries)d 次之後,仍無法連接至 %(hostname)s:%(port)d 上的 AMQP 伺服器:%(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "無法抵達 %(hostname)s:%(port)d 上的 AMQP 伺服器:%(err_str)s。將要在 %(sleep_time)d 秒鐘後重試。" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "無法給主題 '%(topic)s' 宣告消費者:%(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "等候 RPC 回應時發生逾時:%s" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "無法耗用來自佇列的訊息:%s" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "無法將訊息發佈至主題 '%(topic)s':%(err_str)s" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "無法處理訊息... 正在跳過。" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "無法連接至 AMQP 伺服器:%(e)s。休眠 %(delay)s 秒鐘" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "已連接至 %s 上的 AMQP 伺服器" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "已重新建立 AMQP 佇列" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "處理訊息時發生錯誤。正在跳過。" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "JSON 序列化失敗。" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "正在解除序列化:%s" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "正在連接至 %(addr)s (%(type)s)" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "-> 已訂閱 %(subscribe)s" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "-> 連結:%(bind)s" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "無法開啟 Socket。" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "正在訂閱 %s" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "無法在此 Socket 上接收。" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "無法在此 Socket 上傳送。" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "正在以環境定義 %s 執行函數" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "正在傳送回覆" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "RPC 訊息沒有包含方法。" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "正在登錄反應程式" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "已登錄輸入反應程式" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "正在耗用 Socket" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "正在給主題 %s 建立 Proxy" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "主題包含危險字元。" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "建立主題 Socket 檔案時失敗。" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "主題 %(topic)s 的本端個別主題待辦事項緩衝區已滿。正在捨棄訊息。" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "無法建立 ZeroMQ 接收端常駐程式。Socket 可能已在使用中。" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "消費者已收到資料:%s" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "ZMQ 封套版本不受支援或不明。" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "正在跳過主題登錄。已登錄。" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "消費者是 zmq.%s" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "正在建立有效負載" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "正在給回覆等待程式建立佇列 Socket" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "正在傳送強制轉型" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "已傳送強制轉型;正在等待回覆" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "接收的訊息:%s" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "正在解壓縮回應" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "傳回了不支援或不明的 ZMQ 封套。" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "RPC 訊息無效。" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "正在將訊息傳送至:%s" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "符合程式找不到結果。不進行強制轉型。" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "沒有來自符合程式的相符項。" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "符合程式找不到相符項。" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "符合程式沒有實作登錄或活動訊號。" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "已取消登錄符合程式:%(key)s, %(host)s" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "在啟動活動訊號之前登錄。" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "沒有索引鍵給主題 '%s' 定義主機,請參閱 ringfile" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "正在為服務 %s 建立消費者連線" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/bs/0000775000175300017540000000000012316614636020043 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/bs/LC_MESSAGES/0000775000175300017540000000000012316614636021630 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/bs/LC_MESSAGES/ironic.po0000664000175300017540000015063612316614116023457 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Bosnian (http://www.transifex.com/projects/p/openstack/language/bs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: bs\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/mr_IN/0000775000175300017540000000000012316614636020443 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/mr_IN/LC_MESSAGES/0000775000175300017540000000000012316614636022230 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/mr_IN/LC_MESSAGES/ironic.po0000664000175300017540000015054212316614116024053 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Marathi (India) (http://www.transifex.com/projects/p/openstack/language/mr_IN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: mr_IN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/pl_PL/0000775000175300017540000000000012316614636020445 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/pl_PL/LC_MESSAGES/0000775000175300017540000000000012316614636022232 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/pl_PL/LC_MESSAGES/ironic.po0000664000175300017540000015264112316614116024057 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: # Łukasz Jernaś , 2014 msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/openstack/language/pl_PL/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: pl_PL\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "Nie podano metody" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "Nie podano ID obudowy" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "Nie podano ID węzła" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "Błędny typ. Spodziewano się „%(type)s”, otrzymano „%(value)s”" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "Ograniczenie musi być liczbą dodatnią" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "Błędny kierunek sortowania: %s. Przyjmowanymi wartościami są „asc” lub „desc”" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "ErrorDocumentMiddleware otrzymało błędny status %s" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "Błąd podczas przetwarzania odpowiedzi HTTP: %s" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "Konfiguracja:" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "Wystąpił nieznany wyjątek." #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "Nie upoważniono." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "Operacja niedozwolona." #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "Nieprawidłowy stan zasobu." #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "Spodziewano się UUID, jednakże otrzymano %(uuid)s." #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "Spodziewano się UUID lub liczby całkowitej, otrzymano %(identity)s." #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "Spodziewano się adres MAC, otrzymano %(mac)s." #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "Nie można utworzyć instancji: %(reason)s" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "Obraz %(image_id)s jest niedozwolony: %(reason)s" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "Nie znaleziono zasobu." #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "Nie można załadować sterownika %(driver_name)s." #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "wyłączone" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "Wynik był %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "Nie można otworzyć gniazda." #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "Subskrybowanie do %s" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "Nie można wysłać do tego gniazda." #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "Otrzymano wiadomość: %s" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "Wysyłanie wiadomości do: %s" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/ur/0000775000175300017540000000000012316614636020065 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ur/LC_MESSAGES/0000775000175300017540000000000012316614636021652 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ur/LC_MESSAGES/ironic.po0000664000175300017540000015052112316614116023472 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Urdu (http://www.transifex.com/projects/p/openstack/language/ur/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: ur\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/bg_BG/0000775000175300017540000000000012316614636020377 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/bg_BG/LC_MESSAGES/0000775000175300017540000000000012316614636022164 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/bg_BG/LC_MESSAGES/ironic.po0000664000175300017540000015054712316614116024014 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/openstack/language/bg_BG/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: bg_BG\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/en_GB/0000775000175300017540000000000012316614636020411 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/en_GB/LC_MESSAGES/0000775000175300017540000000000012316614636022176 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/en_GB/LC_MESSAGES/ironic.po0000664000175300017540000016640212316614116024023 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:25+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/openstack/language/en_GB/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "An unknown exception occurred." #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "Exception in string format operation" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "Not authorised." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "Unacceptable parameters." #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "Expected a uuid but received %(uuid)s." #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "Image %(image_id)s is unacceptable: %(reason)s" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "Resource could not be found." #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "Image %(image_id)s could not be found." #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "Connection to glance host %(host)s:%(port)s failed: %(reason)s" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "Not authorised for image %(image_id)s." #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "Invalid image href %(image_href)s." #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "Could not find config at %(path)s" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "Snapshot list encountered but no header found!" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "'qemu-img info' parsing failed." #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "fmt=%(fmt)s backed by: %(backing_file)s" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "Converted to raw, but format is now %s" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "Invalid backend: %s" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "Reloading cached file %s" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "Could not remove tmpdir: %s" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "Failed to unlink %(path)s, error: %(e)s" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "Failed to remove dir %(path)s, error: %(e)s" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', %(extra)s." #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "disabled" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "ipmitool stdout: '%(out)s', stderr: '%(err)s'" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "Building PXE config for deployment %s." #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "VCPUs not set; assuming CPU collection broken" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has %(usable_disk_mb)s MB usable disk." #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has %(usable_ram)s MB usable ram." #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "Original exception being dropped: %s" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "Unexpected exception occurred %d time(s)... retrying." #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "Could not release the acquired lock `%s`" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "Got semaphore \"%(lock)s\"" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "Attempting to grab file lock \"%(lock)s\"" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "Created lock path: %s" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "Got file lock \"%(lock)s\" at %(path)s" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "Released file lock \"%(lock)s\" at %(path)s" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "Got semaphore / lock \"%(function)s\"" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "Semaphore / lock released \"%(function)s\"" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "Deprecated: %s" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "Error loading logging config %(log_config)s: %(err_msg)s" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "syslog facility must be one of: %s" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "Fatal call to deprecated config: %(msg)s" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "task run outlasted interval by %s sec" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "in fixed duration looping call" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "Dynamic looping call sleeping for %.02f seconds" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "in dynamic looping call" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "Unexpected argument for periodic task creation: %(arg)s." #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "Skipping periodic task %(task)s because its interval is negative" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "Skipping periodic task %(task)s because it is disabled" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "Running periodic task %(full_task_name)s" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "Error during %(full_task_name)s: %(e)s" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "Failed to understand rule %(rule)s" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "No handler for matches of kind %s" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "Failed to understand rule %(rule)r" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "Got unknown keyword args to utils.execute: %r" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "Running cmd (subprocess): %s" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "Result was %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "%r failed. Retrying." #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "Running cmd (SSH): %s" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "Environment not supported over SSH" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "process_input not supported over SSH" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "Full set of CONF:" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "Caught %s, exiting" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "Exception during rpc cleanup." #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "Parent process has died unexpectedly, exiting" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "Unhandled exception" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "Forking too fast, sleeping" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "Started child %d" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "Starting %d workers" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "Child %(pid)d killed by signal %(sig)d" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "Child %(pid)s exited with status %(code)d" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "pid %d not in child list" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "Caught %s, stopping children" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "Waiting on %d children to exit" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "Unable to find cert_file : %s" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "Unable to find ca_file : %s" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "Unable to find key_file : %s" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "When running server in SSL mode, you must specify both a cert_file and key_file option value in your configuration file" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "Invalid SSL version : %s" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "Unrecognised value '%(val)s', acceptable values are: %(acceptable)s" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "Invalid string format: %s" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "Unknown byte multiplier: %s" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "Invalid Parameter: Unicode is not supported by the current database." #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "version should be an integer" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "Sort key supplied was not valid." #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "Unknown sort direction, must be 'desc' or 'asc'" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "Unrecognised read_deleted value '%s'" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "Please specify column %s in col_name_col_instance param. It is required because column has unsupported type by sqlite)." #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "col_name_col_instance param has wrong type of column instance for column %s It should be instance of sqlalchemy.Column." #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "Unsupported id columns type" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "%s not in valid priorities" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "Problem '%(e)s' attempting to send to notification system. Payload=%(payload)s" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "Failed to load notifier %s. These notifications will not be sent." #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "Could not send notification to %(topic)s. Payload=%(message)s" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "Pool creating new connection" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "_call_waiters: %s" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "unpacked context: %s" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "UNIQUE_ID is %s." #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "received %s" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "no method for message: %s" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "No method for message: %s" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "Expected exception during message handling (%s)" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "Exception during message handling" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "Making synchronous call on %s ..." #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "MSG_ID is %s" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "Making asynchronous cast on %s..." #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "Making asynchronous fanout cast..." #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "Sending %(event_type)s on %(topic)s" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "An unknown RPC related exception occurred." #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "Remote error: %(exc_type)s %(value)s\n%(traceback)s." #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: \"%(method)s\" info: \"%(info)s\"" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "Found duplicate message(%(msg_id)s). Skipping it." #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "Invalid reuse of an RPC connection." #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "Specified RPC version, %(version)s, not supported by this endpoint." #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "Specified RPC envelope version, %(version)s, not supported by this endpoint." #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "Specified RPC version cap, %(version_cap)s, is too low" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "Returning exception %s to caller" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "Failed to process message ... skipping it." #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "Failed to process message ... will requeue." #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "Reconnecting to AMQP server on %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "Connected to AMQP server on %(hostname)s:%(port)d" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "Unable to connect to AMQP server on %(hostname)s:%(port)d after %(max_retries)d tries: %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying again in %(sleep_time)d seconds." #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "Failed to declare consumer for topic '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "Timed out waiting for RPC response: %s" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "Failed to consume message from queue: %s" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "Failed to publish message to topic '%(topic)s': %(err_str)s" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "Invalid value for qpid_topology_version: %d" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "Failed to process message... skipping it." #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "Connected to AMQP server on %s" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "Re-established AMQP queues" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "Error processing message. Skipping it." #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "JSON serialization failed." #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "Deserializing: %s" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "Connecting to %(addr)s with %(type)s" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "-> Subscribed to %(subscribe)s" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "-> bind: %(bind)s" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "Could not open socket." #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "Subscribing to %s" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "You cannot recv on this socket." #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "You cannot send on this socket." #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "Running func with context: %s" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "Sending reply" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "RPC message did not include method." #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "Registering reactor" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "In reactor registered" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "Consuming socket" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "Creating proxy for topic: %s" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "Topic contained dangerous characters." #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "Topic socket file creation failed." #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "Required IPC directory does not exist at %s" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "Permission denied to IPC directory at %s" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "Could not create ZeroMQ receiver daemon. Socket may already be in use." #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "CONSUMER RECEIVED DATA: %s" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "ZMQ Envelope version unsupported or unknown." #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "Skipping topic registration. Already registered." #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "Consumer is a zmq.%s" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "Creating payload" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "Creating queue socket for reply waiter" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "Sending cast" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "Cast sent; Waiting reply" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "Received message: %s" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "Unpacking response" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "Unsupported or unknown ZMQ envelope returned." #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "RPC Message Invalid." #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "Sending message(s) to: %s" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "No matchmaker results. Not casting." #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "No match from matchmaker." #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "Match not found by MatchMaker." #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "Matchmaker does not implement registration or heartbeat." #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "Matchmaker unregistered: %(key)s, %(host)s" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "Register before starting heartbeat." #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "No key defining hosts for topic '%s', see ringfile" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "Creating Consumer connection for Service %s" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/es_MX/0000775000175300017540000000000012316614636020452 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/es_MX/LC_MESSAGES/0000775000175300017540000000000012316614636022237 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/es_MX/LC_MESSAGES/ironic.po0000664000175300017540000015062612316614116024065 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/openstack/language/es_MX/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: es_MX\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "Ha ocurrido un error desconocido." #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "Sin autorización." #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/ja/0000775000175300017540000000000012316614636020031 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ja/LC_MESSAGES/0000775000175300017540000000000012316614636021616 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ja/LC_MESSAGES/ironic.po0000664000175300017540000017527112316614116023447 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: # Tomoyuki KATO , 2013 msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:25+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Japanese (http://www.transifex.com/projects/p/openstack/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "不明な例外が発生しました。" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "ストリング・フォーマットの操作で例外が発生しました" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "許可されていません。" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "受け入れられないパラメーター。" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "UUID が必要ですが、%(uuid)s を受け取りました。" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "イメージ %(image_id)s は受け入れられません: %(reason)s" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "%(err)s" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "リソースが見つかりませんでした。" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "イメージ %(image_id)s が見つかりませんでした。" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "Glance ホスト %(host)s:%(port)s との接続に失敗しました: %(reason)s" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "イメージ %(image_id)s では許可されません。" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "無効なイメージ href %(image_href)s。" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "%(path)s で config が見つかりませんでした" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "スナップショット・リストが検出されましたが、ヘッダーが見つかりません。" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "'qemu-img info' の解析に失敗しました。" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "fmt=%(fmt)s の基盤: %(backing_file)s" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "ローに変換されましたが、現在の形式は %s です" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "不正なバックエンドです: %s" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "キャッシュ・ファイル %s を再ロードしています" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "tmpdir を削除できませんでした: %s" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "%(path)s のリンク解除に失敗しました。エラー: %(e)s" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "ディレクトリー %(path)s の削除に失敗しました。エラー: %(e)s" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "%(source)s から %(link)s へのシンボリック・リンクの作成に失敗しました。エラー: %(e)s" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "Glance サーバー '%(host)s:%(port)s' への接続中にエラーが発生しました。'%(method)s'、%(extra)s。" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "disabled" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "コマンド: %s" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "ipmitool stdout: '%(out)s'、stderr: '%(err)s'" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "デプロイメント %s 用に PXE 構成を作成しています。" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "vCPU が設定されていません。CPU コレクションの失敗が想定されます" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "%(host_state)s には %(requested_disk)s MB の使用可能なディスクがありません。使用可能なディスクは %(usable_disk_mb)s MB のみです。" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "%(host_state)s には %(requested_ram)s MB の使用可能な RAM がありません。使用可能な RAM は %(usable_ram)s MB のみです。" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "除去される元の例外: %s" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "予期せぬ例外が、%d回()発生しました。再試行中。" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "取得したロック `%s` を解放できませんでした" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "非推奨: %s" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "ログ設定 %(log_config)s の読み込みエラー: %(err_msg)s" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "syslog 機能は次のいずれかでなければなりません: %s" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "推奨されない構成への致命的な呼び出し: %(msg)s" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "タスクの実行が間隔より %s 秒長くかかりました" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "一定期間の呼び出しループ" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "動的ループ呼び出しが %.02f 秒停止します" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "動的呼び出しループ" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "定期タスク作成時の予期しない引数: %(arg)s。" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "タスクの間隔が負であるため、定期タスク %(task)s をスキップしています" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "タスクが使用不可であるため、定期タスク %(task)s をスキップしています" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "定期タスク %(full_task_name)s の実行中" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "%(full_task_name)s 中のエラー: %(e)s" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "ルール %(rule)s を解釈できませんでした" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "突き合わせの種類 %s に対応するハンドラーがありません" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "ルール %(rule)r を解釈できませんでした" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "utils.execute の不明なキーワード引数を受け取りました: %r" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "コマンド実行(subprocess): %s" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "コマンド実行結果: %s" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "%r が失敗しました。再試行しています。" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "コマンド(SSH)を実行: %s" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "環境は SSH でサポートされていません" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "SSH で process_input は サポートされていません" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "CONF のフルセット:" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "%s が見つかりました。終了しています" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "親プロセスが予期せずに停止しました。終了しています" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "未処理例外" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "fork が早すぎます。スリープ状態にしています" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "子 %d を開始しました" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "%d ワーカーを開始しています" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "子 %(pid)d がシグナル %(sig)d によって強制終了されました" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "子 %(pid)s が状況 %(code)d で終了しました" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "pid %d は子リストにありません" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "%s が見つかりました。子を停止しています" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "%d 個の子で終了を待機しています" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "cert_file が見つかりません: %s" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "ca_file が見つかりません: %s" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "key_file が見つかりません: %s" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "サーバーを SSL モードで実行する場合は、cert_file オプション値と key_file オプション値の両方を構成ファイルに指定する必要があります" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "無効な SSL バージョン : %s" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "不明なバイト乗数: %s" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "無効なパラメーター: ユニコードは現在のデータベースではサポートされていません。" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "バージョンは整数でなければなりません" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "指定されたソート・キーが無効でした。" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "ソート方向が不明です。'desc' または 'asc' でなければなりません" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "認識されない read_deleted 値 '%s'" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "col_name_col_instance パラメーターに列 %s を指定してください。これは、列に、sqlite) によってサポートされないタイプがあるために必要です。" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "col_name_col_instance パラメーターに、列 %s では正しくないタイプの列インスタンスがあります。これは sqlalchemy.Column のインスタンスでなければなりません。" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "%s の優先順位が無効です" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "通知システムへの送信を試行中に問題 '%(e)s' が発生しました。Payload=%(payload)s" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "通知機能 %s のロードに失敗しました。これらの通知は送信されません。" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "%(topic)s に通知を送信できませんでした。Payload=%(message)s" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "プールで新規接続を作成しています" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "呼び出し待ちの数が警告閾値 %d を超えました。 MulticallProxyWaiter のリークの可能性があります。" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "context %s をアンパックしました。" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "UNIQUE_ID は %s です。" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "受信: %s" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "メッセージ %s に対するメソッドが存在しません。" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "メッセージ %s に対するメソッドが存在しません。" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "メッセージ処理中の予期された例外 (%s)" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "メッセージ処理中の例外" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "%s で同期呼び出しを実行中..." #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "MSG_IDは %s です。" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "%s で非同期キャストを実行中..." #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "非同期ファンアウト・キャストを実行中..." #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "%(topic)s で %(event_type)s を送信中" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "RPC 関連の不明な例外が発生しました。" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "リモート・エラー: %(exc_type)s %(value)s\n%(traceback)s。" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "RPC 応答を待っている間にタイムアウトが発生しました - topic: \"%(topic)s\", RPC method: \"%(method)s\" info: \"%(info)s\"" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "重複メッセージ (%(msg_id)s) を検出しました。スキップします。" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "RPC 接続の無効な再利用です。" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "このエンドポイントでサポートされていない RPC バージョン %(version)s が指定されました。" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "このエンドポイントでサポートされていない RPC エンベロープ・バージョン %(version)s が指定されました。" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "指定された RPC バージョンの上限 %(version_cap)s が低すぎます" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "呼び出し元に 例外 %s を返却します。" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "%(hostname)s:%(port)d 上の AMQP サーバーに再接続しています" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "%(hostname)s:%(port)d 上の AMQP サーバーに接続しました" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "%(max_retries)d 回の試行の後、%(hostname)s:%(port)d 上の AMQP サーバーに接続できません: %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "%(hostname)s:%(port)d 上の AMQP サーバーは到達不能です: %(err_str)s。%(sleep_time)d 秒後に再試行します。" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "トピック '%(topic)s' のコンシューマーを宣言できませんでした: %(err_str)s" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "RPC 応答の待機中にタイムアウトになりました: %s" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "キューからのメッセージのコンシュームに失敗しました: %s" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "トピック '%(topic)s' に対してメッセージをパブリッシュできませんでした: %(err_str)s" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "メッセージの処理に失敗しました... スキップしています。" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "AMQP サーバーに接続できません: %(e)s。%(delay)s 秒間スリープ状態になります" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "%s 上の AMQP サーバーに接続しました" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "AMQP キューを再確立しました" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "メッセージの処理中にエラーが発生しました。スキップしています。" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "JSON の直列化が失敗しました。" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "非直列化しています: %s" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "%(type)s の %(addr)s に接続しています" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "-> %(subscribe)s にサブスクライブしました" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "-> バインド: %(bind)s" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "ソケットを開くことができませんでした。" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "%s にサブスクライブしています" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "このソケットでは受信できません。" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "このソケットでは送信できません。" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "コンテキスト %s を含む関数を実行しています" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "応答を送信しています" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "RPC メッセージにメソッドが含まれていませんでした。" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "リアクターの登録中" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "入力リアクターが登録されました" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "ソケットの消費中" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "トピック用プロキシーの作成中: %s" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "トピックに危険な文字が含まれていました。" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "トピック・ソケット・ファイルの作成に失敗しました。" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "トピック %(topic)s のトピック単位のローカル・バックログ・バッファーがフルです。メッセージを除去しています。" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "必要な IPC ディレクトリが %s に存在しません" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "IPC ディレクトリ %s へのアクセス許可がありません" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "ZeroMQ 受信側デーモンを作成できませんでした。ソケットが既に使用中である可能性があります。" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "コンシューマーがデータを受信しました: %s" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "ZMQ エンベロープのバージョンがサポートされていないか、または不明です。" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "トピックの登録をスキップします。既に登録されています。" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "コンシューマーは zmq.%s です" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "ペイロードを作成しています" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "応答ウェイターのキュー・ソケットの作成中" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "キャストの送信中" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "キャストが送信されました。応答を待機中です" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "メッセージを受信しました: %s" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "応答をアンパックしています" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "サポートされていないか、または不明な ZMQ エンベロープが返されました。" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "RPC メッセージが無効です。" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "%(msg)s" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "メッセージを %s に送信中" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "Matchmaker の結果がありません。キャストは行いません。" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "MatchMaker からの一致がありません。" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "rpc_zmq_matchmaker = %(orig)s は非推奨です。代わりに %(new)s を使用してください。" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "MatchMaker による一致が見つかりません。" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "MatchMaker が登録またはハートビートを実施していません。" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "matchmaker が登録されていません: %(key)s, %(host)s" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "ハートビートを開始する前に登録してください。" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "トピック '%s' のホストを定義するキーがありません。リング・ファイルを参照してください" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "サービス %s のコンシューマー接続を作成しています" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/fi_FI/0000775000175300017540000000000012316614636020413 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/fi_FI/LC_MESSAGES/0000775000175300017540000000000012316614636022200 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/fi_FI/LC_MESSAGES/ironic.po0000664000175300017540000015054412316614116024025 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/openstack/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: fi_FI\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/hu/0000775000175300017540000000000012316614636020053 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/hu/LC_MESSAGES/0000775000175300017540000000000012316614636021640 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/hu/LC_MESSAGES/ironic.po0000664000175300017540000015052612316614116023465 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Hungarian (http://www.transifex.com/projects/p/openstack/language/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: hu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/ms/0000775000175300017540000000000012316614636020056 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ms/LC_MESSAGES/0000775000175300017540000000000012316614636021643 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ms/LC_MESSAGES/ironic.po0000664000175300017540000015051312316614116023464 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Malay (http://www.transifex.com/projects/p/openstack/language/ms/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: ms\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/locale/ta/0000775000175300017540000000000012316614636020043 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ta/LC_MESSAGES/0000775000175300017540000000000012316614636021630 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/locale/ta/LC_MESSAGES/ironic.po0000664000175300017540000015052212316614116023451 0ustar jenkinsjenkins00000000000000# Translations template for ironic. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the ironic project. # # Translators: msgid "" msgstr "" "Project-Id-Version: Ironic\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-31 20:53+0000\n" "PO-Revision-Date: 2014-03-31 18:09+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Tamil (http://www.transifex.com/projects/p/openstack/language/ta/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: ta\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ironic/api/controllers/v1/node.py:202 #, python-format msgid "Node %(node)s is already in the '%(state)s' state." msgstr "" #: ironic/api/controllers/v1/node.py:215 #, python-format msgid "Node %s is already being provisioned or decommissioned." msgstr "" #: ironic/api/controllers/v1/node.py:436 msgid "Method not specified" msgstr "" #: ironic/api/controllers/v1/node.py:466 msgid "Chassis id not specified." msgstr "" #: ironic/api/controllers/v1/node.py:641 #, python-format msgid "Node %s can not be updated while a state transition is in progress." msgstr "" #: ironic/api/controllers/v1/port.py:166 msgid "Node id not specified." msgstr "" #: ironic/api/controllers/v1/types.py:128 #, python-format msgid "'%s' is an internal attribute and can not be updated" msgstr "" #: ironic/api/controllers/v1/types.py:132 #, python-format msgid "'%s' is a mandatory attribute and can not be removed" msgstr "" #: ironic/api/controllers/v1/types.py:137 #, python-format msgid "" "Adding a new attribute (%s) to the root of the resource is not allowed" msgstr "" #: ironic/api/controllers/v1/types.py:143 msgid "'add' and 'replace' operations needs value" msgstr "" #: ironic/api/controllers/v1/types.py:174 #, python-format msgid "Wrong type. Expected '%(type)s', got '%(value)s'" msgstr "" #: ironic/api/controllers/v1/utils.py:31 msgid "Limit must be positive" msgstr "" #: ironic/api/controllers/v1/utils.py:38 #, python-format msgid "Invalid sort direction: %s. Acceptable values are 'asc' or 'desc'" msgstr "" #: ironic/api/middleware/auth_token.py:40 #, python-format msgid "Cannot compile public API routes: %s" msgstr "" #: ironic/api/middleware/parsable_error.py:52 #, python-format msgid "ErrorDocumentMiddleware received an invalid status %s" msgstr "" #: ironic/api/middleware/parsable_error.py:80 #, python-format msgid "Error parsing HTTP response: %s" msgstr "" #: ironic/cmd/api.py:53 #, python-format msgid "Serving on http://%(host)s:%(port)s" msgstr "" #: ironic/cmd/api.py:55 msgid "Configuration:" msgstr "" #: ironic/common/exception.py:57 msgid "An unknown exception occurred." msgstr "" #: ironic/common/exception.py:78 ironic/openstack/common/rpc/common.py:88 msgid "Exception in string format operation" msgstr "" #: ironic/common/exception.py:98 msgid "Not authorized." msgstr "" #: ironic/common/exception.py:103 msgid "Operation not permitted." msgstr "" #: ironic/common/exception.py:107 msgid "Unacceptable parameters." msgstr "" #: ironic/common/exception.py:112 msgid "Conflict." msgstr "" #: ironic/common/exception.py:117 msgid "Resource temporarily unavailable, please retry." msgstr "" #: ironic/common/exception.py:122 msgid "Invalid resource state." msgstr "" #: ironic/common/exception.py:126 #, python-format msgid "A Port with MAC address %(mac)s already exists." msgstr "" #: ironic/common/exception.py:130 #, python-format msgid "Expected a uuid but received %(uuid)s." msgstr "" #: ironic/common/exception.py:134 #, python-format msgid "Expected an uuid or int but received %(identity)s." msgstr "" #: ironic/common/exception.py:138 #, python-format msgid "Expected a MAC address but received %(mac)s." msgstr "" #: ironic/common/exception.py:142 #, python-format msgid "Invalid state '%(state)s' requested for node %(node)s." msgstr "" #: ironic/common/exception.py:146 #, python-format msgid "Couldn't apply patch '%(patch)s'. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:150 #, python-format msgid "Failed to deploy instance: %(reason)s" msgstr "" #: ironic/common/exception.py:154 ironic/common/exception.py:158 #, python-format msgid "Image %(image_id)s is unacceptable: %(reason)s" msgstr "" #: ironic/common/exception.py:164 #, python-format msgid "%(err)s" msgstr "" #: ironic/common/exception.py:168 msgid "Resource could not be found." msgstr "" #: ironic/common/exception.py:173 #, python-format msgid "Failed to load driver %(driver_name)s." msgstr "" #: ironic/common/exception.py:177 #, python-format msgid "Image %(image_id)s could not be found." msgstr "" #: ironic/common/exception.py:181 #, python-format msgid "No valid host was found. Reason: %(reason)s" msgstr "" #: ironic/common/exception.py:185 #, python-format msgid "Instance %(instance)s could not be found." msgstr "" #: ironic/common/exception.py:189 #, python-format msgid "Node %(node)s could not be found." msgstr "" #: ironic/common/exception.py:193 #, python-format msgid "Node %(node)s is associated with instance %(instance)s." msgstr "" #: ironic/common/exception.py:197 #, python-format msgid "Port %(port)s could not be found." msgstr "" #: ironic/common/exception.py:201 #, python-format msgid "Update DHCP options on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:205 #, python-format msgid "Update MAC address on port: %(port_id)s failed." msgstr "" #: ironic/common/exception.py:209 #, python-format msgid "Chassis %(chassis)s could not be found." msgstr "" #: ironic/common/exception.py:213 #, python-format msgid "Conductor %(conductor)s could not be found." msgstr "" #: ironic/common/exception.py:217 #, python-format msgid "Conductor %(conductor)s already registered." msgstr "" #: ironic/common/exception.py:221 #, python-format msgid "Failed to set node power state to %(pstate)s." msgstr "" #: ironic/common/exception.py:225 msgid "" "An exclusive lock is required, but the current context has a shared lock." msgstr "" #: ironic/common/exception.py:230 #, python-format msgid "Failed to toggle maintenance-mode flag for node %(node)s: %(reason)s" msgstr "" #: ironic/common/exception.py:235 #, python-format msgid "Console access is not enabled on node %(node)s" msgstr "" #: ironic/common/exception.py:239 #, python-format msgid "" "The %(op)s operation can't be performed on node %(node)s because it's in " "maintenance mode." msgstr "" #: ironic/common/exception.py:244 #, python-format msgid "" "Can not change instance association while node %(node)s is in power state " "%(pstate)s." msgstr "" #: ironic/common/exception.py:249 #, python-format msgid "" "Cannot complete the requested action because chassis %(chassis)s contains " "nodes." msgstr "" #: ironic/common/exception.py:254 #, python-format msgid "IPMI call failed: %(cmd)s." msgstr "" #: ironic/common/exception.py:258 #, python-format msgid "Failed to establish SSH connection to host %(host)s." msgstr "" #: ironic/common/exception.py:262 #, python-format msgid "Failed to execute command via SSH: %(cmd)s." msgstr "" #: ironic/common/exception.py:266 #, python-format msgid "Unsupported object type %(objtype)s" msgstr "" #: ironic/common/exception.py:270 #, python-format msgid "Cannot call %(method)s on orphaned %(objtype)s object" msgstr "" #: ironic/common/exception.py:274 #, python-format msgid "Driver %(driver)s does not support %(extension)s." msgstr "" #: ironic/common/exception.py:278 #, python-format msgid "Version %(objver)s of %(objname)s is not supported" msgstr "" #: ironic/common/exception.py:282 #, python-format msgid "Connection to glance host %(host)s:%(port)s failed: %(reason)s" msgstr "" #: ironic/common/exception.py:287 #, python-format msgid "Not authorized for image %(image_id)s." msgstr "" #: ironic/common/exception.py:291 #, python-format msgid "Invalid image href %(image_href)s." msgstr "" #: ironic/common/exception.py:295 msgid "Unauthorised for keystone service catalog." msgstr "" #: ironic/common/exception.py:303 #, python-format msgid "" "Service type %(service_type)s with endpoint type %(endpoint_type)s not found" " in keystone service catalog." msgstr "" #: ironic/common/exception.py:308 msgid "Connection failed" msgstr "" #: ironic/common/exception.py:312 msgid "Requested OpenStack Images API is forbidden" msgstr "" #: ironic/common/exception.py:320 msgid "The provided endpoint is invalid" msgstr "" #: ironic/common/exception.py:324 msgid "Unable to communicate with the server." msgstr "" #: ironic/common/exception.py:340 #, python-format msgid "Could not find config at %(path)s" msgstr "" #: ironic/common/exception.py:344 #, python-format msgid "" "Node %(node)s is locked by host %(host)s, please retry after the current " "operation is completed." msgstr "" #: ironic/common/exception.py:349 msgid "" "Requested action cannot be performed due to lack of free conductor workers." msgstr "" #: ironic/common/exception.py:359 #, python-format msgid "Invalid configuration file. %(error_msg)s" msgstr "" #: ironic/common/hash_ring.py:65 msgid "Invalid hosts supplied when building HashRing." msgstr "" #: ironic/common/hash_ring.py:78 msgid "Invalid data supplied to HashRing.get_hosts." msgstr "" #: ironic/common/images.py:110 msgid "Snapshot list encountered but no header found!" msgstr "" #: ironic/common/images.py:203 msgid "'qemu-img info' parsing failed." msgstr "" #: ironic/common/images.py:209 #, python-format msgid "fmt=%(fmt)s backed by: %(backing_file)s" msgstr "" #: ironic/common/images.py:215 #, python-format msgid "%(image)s was %(format)s, converting to raw" msgstr "" #: ironic/common/images.py:224 #, python-format msgid "Converted to raw, but format is now %s" msgstr "" #: ironic/common/keystone.py:30 msgid "Keystone API endpoint is missing" msgstr "" #: ironic/common/keystone.py:53 #, python-format msgid "Could not perform authorization process for service catalog: %s" msgstr "" #: ironic/common/keystone.py:58 msgid "No keystone service catalog loaded" msgstr "" #: ironic/common/neutron.py:91 #, python-format msgid "Failed to update Neutron port %s." msgstr "" #: ironic/common/neutron.py:105 #, python-format msgid "Failed to update MAC address on Neutron port %s." msgstr "" #: ironic/common/policy.py:31 msgid "JSON file representing policy." msgstr "" #: ironic/common/policy.py:34 msgid "Rule checked when requested rule is not found." msgstr "" #: ironic/common/utils.py:65 #, python-format msgid "Execution completed, command line is \"%s\"" msgstr "" #: ironic/common/utils.py:66 #, python-format msgid "Command stdout is: \"%s\"" msgstr "" #: ironic/common/utils.py:67 #, python-format msgid "Command stderr is: \"%s\"" msgstr "" #: ironic/common/utils.py:98 msgid "Invalid private key" msgstr "" #: ironic/common/utils.py:112 #, python-format msgid "SSH connect failed: %s" msgstr "" #: ironic/common/utils.py:145 #, python-format msgid "Invalid backend: %s" msgstr "" #: ironic/common/utils.py:323 ironic/openstack/common/fileutils.py:65 #, python-format msgid "Reloading cached file %s" msgstr "" #: ironic/common/utils.py:411 #, python-format msgid "Could not remove tmpdir: %s" msgstr "" #: ironic/common/utils.py:446 #, python-format msgid "Failed to unlink %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:455 #, python-format msgid "Failed to remove dir %(path)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:471 #, python-format msgid "Failed to create symlink from %(source)s to %(link)s, error: %(e)s" msgstr "" #: ironic/common/utils.py:485 #, python-format msgid "" "Failed to remove trailing character. Returning original object. Supplied " "object is not a string: %s," msgstr "" #: ironic/common/glance_service/base_image_service.py:125 #, python-format msgid "" "Error contacting glance server '%(host)s:%(port)s' for '%(method)s', " "%(extra)s." msgstr "" #: ironic/common/glance_service/base_image_service.py:161 msgid "Getting a full list of images metadata from glance." msgstr "" #: ironic/common/glance_service/base_image_service.py:182 #, python-format msgid "Getting image metadata from glance. Image: %s" msgstr "" #: ironic/conductor/manager.py:144 #, python-format msgid "" "A conductor with hostname %(hostname)s was previously registered. Updating " "registration" msgstr "" #: ironic/conductor/manager.py:165 #, python-format msgid "Received notification: %r" msgstr "" #: ironic/conductor/manager.py:188 #, python-format msgid "RPC update_node called for node %s." msgstr "" #: ironic/conductor/manager.py:192 msgid "Invalid method call: update_node can not change node state." msgstr "" #: ironic/conductor/manager.py:233 #, python-format msgid "" "RPC change_node_power_state called for node %(node)s. The desired new state " "is %(state)s." msgstr "" #: ironic/conductor/manager.py:272 #, python-format msgid "RPC vendor_passthru called for node %s." msgstr "" #: ironic/conductor/manager.py:318 #, python-format msgid "RPC do_node_deploy called for node %s." msgstr "" #: ironic/conductor/manager.py:324 #, python-format msgid "" "RPC do_node_deploy called for %(node)s, but provision state is already " "%(state)s." msgstr "" #: ironic/conductor/manager.py:330 msgid "provisioning" msgstr "" #: ironic/conductor/manager.py:336 #, python-format msgid "RPC do_node_deploy failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:363 #, python-format msgid "Failed to deploy. Error: %s" msgstr "" #: ironic/conductor/manager.py:393 #, python-format msgid "RPC do_node_tear_down called for node %s." msgstr "" #: ironic/conductor/manager.py:402 #, python-format msgid "RPC do_node_tear_down not allowed for node %(node)s in state %(state)s" msgstr "" #: ironic/conductor/manager.py:410 #, python-format msgid "RPC do_node_tear_down failed to validate deploy info. Error: %(msg)s" msgstr "" #: ironic/conductor/manager.py:438 #, python-format msgid "Failed to tear down. Error: %s" msgstr "" #: ironic/conductor/manager.py:459 #, python-format msgid "" "During sync_power_state, max retries exceeded for node %(node)s, node state " "%(actual)s does not match expected state '%(state)s'. Updating DB state to " "'%(actual)s' Switching node to maintenance mode." msgstr "" #: ironic/conductor/manager.py:481 #, python-format msgid "" "During sync_power_state, could not get power state for node %(node)s. Error:" " %(err)s." msgstr "" #: ironic/conductor/manager.py:493 #, python-format msgid "" "During sync_power_state, node %(node)s has no previous known state. " "Recording current state '%(state)s'." msgstr "" #: ironic/conductor/manager.py:506 #, python-format msgid "" "During sync_power_state, node %(node)s state does not match expected state " "'%(state)s'. Updating recorded state to '%(actual)s'." msgstr "" #: ironic/conductor/manager.py:522 #, python-format msgid "" "During sync_power_state, node %(node)s state '%(actual)s' does not match " "expected state. Changing hardware state to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:535 #, python-format msgid "Failed to change power state of node %(node)s to '%(state)s'." msgstr "" #: ironic/conductor/manager.py:540 #, python-format msgid "%(left)s attempts remaining to sync_power_state for node %(node)s" msgstr "" #: ironic/conductor/manager.py:572 #, python-format msgid "" "During sync_power_state, node %(node)s was not found and presumed deleted by" " another process." msgstr "" #: ironic/conductor/manager.py:577 #, python-format msgid "" "During sync_power_state, node %(node)s was already locked by another " "process. Skip." msgstr "" #: ironic/conductor/manager.py:610 #, python-format msgid "Timeout reached when waiting callback for node %s" msgstr "" #: ironic/conductor/manager.py:653 #, python-format msgid "RPC validate_driver_interfaces called for node %s." msgstr "" #: ironic/conductor/manager.py:670 msgid "not supported" msgstr "" #: ironic/conductor/manager.py:689 #, python-format msgid "" "RPC change_node_maintenance_mode called for node %(node)s with maintanence " "mode: %(mode)s" msgstr "" #: ironic/conductor/manager.py:699 msgid "The node is already in maintenance mode" msgstr "" #: ironic/conductor/manager.py:700 msgid "The node is not in maintenance mode" msgstr "" #: ironic/conductor/manager.py:743 #, python-format msgid "Node %s can't be deleted because it's not powered off" msgstr "" #: ironic/conductor/manager.py:763 #, python-format msgid "RPC get_console_information called for node %s" msgstr "" #: ironic/conductor/manager.py:798 #, python-format msgid "RPC set_console_mode called for node %(node)s with enabled %(enabled)s" msgstr "" #: ironic/conductor/manager.py:816 msgid "enabled" msgstr "" #: ironic/conductor/manager.py:816 msgid "disabled" msgstr "" #: ironic/conductor/manager.py:817 #, python-format msgid "No console action was triggered because the console is already %s" msgstr "" #: ironic/conductor/manager.py:844 msgid "enabling" msgstr "" #: ironic/conductor/manager.py:844 msgid "disabling" msgstr "" #: ironic/conductor/manager.py:845 #, python-format msgid "Error %(op)s the console on node %(node)s. Reason: %(error)s" msgstr "" #: ironic/conductor/manager.py:867 #, python-format msgid "RPC update_port called for port %s." msgstr "" #: ironic/conductor/manager.py:879 #, python-format msgid "" "No VIF found for instance %(instance)s port %(port)s when attempting to " "update Neutron port MAC address." msgstr "" #: ironic/conductor/rpcapi.py:97 #, python-format msgid "No conductor service registered which supports driver %s." msgstr "" #: ironic/conductor/task_manager.py:199 msgid "Multi-node TaskManager has no attribute 'node'" msgstr "" #: ironic/conductor/task_manager.py:208 msgid "Multi-node TaskManager has no attribute 'ports'" msgstr "" #: ironic/conductor/task_manager.py:217 msgid "Multi-node TaskManager has no attribute 'driver'" msgstr "" #: ironic/conductor/task_manager.py:226 msgid "Multi-node TaskManager can't select single node manager from the list" msgstr "" #: ironic/conductor/utils.py:73 ironic/conductor/utils.py:111 #, python-format msgid "Failed to change power state to '%(target)s'. Error: %(error)s" msgstr "" #: ironic/conductor/utils.py:90 #, python-format msgid "" "Not going to change_node_power_state because current state = requested state" " = '%(state)s'." msgstr "" #: ironic/conductor/utils.py:130 #, python-format msgid "Cleanup failed for node %(node)s after deploy timeout: %(error)s" msgstr "" #: ironic/conductor/utils.py:142 msgid "" "Deploy timed out, but an unhandled exception was encountered while aborting." " More info may be found in the log file." msgstr "" #: ironic/drivers/utils.py:21 ironic/drivers/modules/fake.py:34 #, python-format msgid "Unsupported method (%s) passed through to vendor extension." msgstr "" #: ironic/drivers/utils.py:24 ironic/drivers/modules/fake.py:37 msgid "Method not specified when calling vendor extension." msgstr "" #: ironic/drivers/modules/deploy_utils.py:205 #, python-format msgid "Parent device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:210 #, python-format msgid "Root device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:213 #, python-format msgid "Swap device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:217 #, python-format msgid "Ephemeral device '%s' not found" msgstr "" #: ironic/drivers/modules/deploy_utils.py:229 msgid "Failed to detect root device UUID." msgstr "" #: ironic/drivers/modules/deploy_utils.py:267 #: ironic/drivers/modules/deploy_utils.py:273 #, python-format msgid "Deploy to address %s failed." msgstr "" #: ironic/drivers/modules/deploy_utils.py:268 #, python-format msgid "Command: %s" msgstr "" #: ironic/drivers/modules/deploy_utils.py:269 #, python-format msgid "StdOut: %r" msgstr "" #: ironic/drivers/modules/deploy_utils.py:270 #, python-format msgid "StdErr: %r" msgstr "" #: ironic/drivers/modules/fake.py:52 ironic/drivers/modules/ipminative.py:245 #, python-format msgid "set_power_state called with an invalid power state: %s." msgstr "" #: ironic/drivers/modules/fake.py:92 msgid "Parameter 'bar' not passed to method 'first_method'." msgstr "" #: ironic/drivers/modules/fake.py:116 msgid "Parameter 'bar' not passed to method 'second_method'." msgstr "" #: ironic/drivers/modules/ipminative.py:59 #, python-format msgid "The following IPMI credentials are not supplied to IPMI driver: %s." msgstr "" #: ironic/drivers/modules/ipminative.py:80 #, python-format msgid "" "IPMI power on failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:110 #, python-format msgid "" "IPMI power off failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:142 #, python-format msgid "" "IPMI power reboot failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:177 #, python-format msgid "" "IPMI get power state failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:191 #, python-format msgid "" "IPMI get power state for node %(node_id)s returns the following details: " "%(detail)s" msgstr "" #: ironic/drivers/modules/ipminative.py:284 #: ironic/drivers/modules/ipminative.py:311 #: ironic/drivers/modules/ipmitool.py:359 #: ironic/drivers/modules/ipmitool.py:376 #, python-format msgid "Invalid boot device %s specified." msgstr "" #: ironic/drivers/modules/ipminative.py:293 #, python-format msgid "" "IPMI set boot device failed for node %(node_id)s with the following error: " "%(error)s" msgstr "" #: ironic/drivers/modules/ipminative.py:314 #, python-format msgid "Unsupported method (%s) passed to IPMINative driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:84 msgid "IPMI address not supplied to IPMI driver." msgstr "" #: ironic/drivers/modules/ipmitool.py:89 #, python-format msgid "" "Invalid privilege level value:%(priv_level)s, the valid value can be one of " "%(valid_levels)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:136 #, python-format msgid "ipmitool stdout: '%(out)s', stderr: '%(err)s'" msgstr "" #: ironic/drivers/modules/ipmitool.py:186 #, python-format msgid "IPMI power %(state)s failed for node %(node)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:197 #, python-format msgid "IPMI power %(state)s timed out after %(tries)s retries." msgstr "" #: ironic/drivers/modules/ipmitool.py:249 #, python-format msgid "IPMI power status failed for node %(node_id)s with error: %(error)s." msgstr "" #: ironic/drivers/modules/ipmitool.py:279 #, python-format msgid "BMC inaccessible for node %(node)s: %(error)s" msgstr "" #: ironic/drivers/modules/ipmitool.py:317 ironic/drivers/modules/ssh.py:436 #, python-format msgid "set_power_state called with invalid power state %s." msgstr "" #: ironic/drivers/modules/ipmitool.py:379 #, python-format msgid "Unsupported method (%s) passed to IPMItool driver." msgstr "" #: ironic/drivers/modules/pxe.py:106 #, python-format msgid "" "Can not validate PXE bootloader. The following parameters were not passed to" " ironic: %s" msgstr "" #: ironic/drivers/modules/pxe.py:118 #, python-format msgid "" "Can not validate PXE bootloader. Invalid parameter pxe_%(param)s. Reason: " "%(reason)s" msgstr "" #: ironic/drivers/modules/pxe.py:124 #, python-format msgid "'%s' is not an integer value." msgstr "" #: ironic/drivers/modules/pxe.py:135 msgid "" "The deploy contains an ephemeral partition, but no filesystem type was " "specified by the pxe_ephemeral_format parameter" msgstr "" #: ironic/drivers/modules/pxe.py:162 #, python-format msgid "Building PXE config for deployment %s." msgstr "" #: ironic/drivers/modules/pxe.py:363 #, python-format msgid "Fetching kernel and ramdisk for node %s" msgstr "" #: ironic/drivers/modules/pxe.py:393 #, python-format msgid "Fetching image %(ami)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/pxe.py:491 #, python-format msgid "" "No VIFs found for node %(node)s when attempting to update Neutron DHCP BOOT " "options." msgstr "" #: ironic/drivers/modules/pxe.py:510 #, python-format msgid "Failed to set DHCP BOOT options for any port on node %s." msgstr "" #: ironic/drivers/modules/pxe.py:514 #, python-format msgid "" "Some errors were encountered when updating the DHCP BOOT options for node " "%(node)s on the following ports: %(ports)s." msgstr "" #: ironic/drivers/modules/pxe.py:549 ironic/drivers/modules/ssh.py:381 #, python-format msgid "Node %s does not have any port associated with it." msgstr "" #: ironic/drivers/modules/pxe.py:560 msgid "" "Couldn't get the URL of the Ironic API service from the configuration file " "or keystone catalog." msgstr "" #: ironic/drivers/modules/pxe.py:670 msgid "Deploy key is not match" msgstr "" #: ironic/drivers/modules/pxe.py:687 #, python-format msgid "Parameters %s were not passed to ironic for deploy." msgstr "" #: ironic/drivers/modules/pxe.py:701 #, python-format msgid "Unsupported method (%s) passed to PXE driver." msgstr "" #: ironic/drivers/modules/pxe.py:722 #, python-format msgid "" "Node %s failed to power off while handling deploy failure. This may be a " "serious condition. Node should be removed from Ironic or put in maintenance " "mode until the problem is resolved." msgstr "" #: ironic/drivers/modules/pxe.py:734 #, python-format msgid "Node %s is not waiting to be deployed." msgstr "" #: ironic/drivers/modules/pxe.py:746 #, python-format msgid "Error returned from PXE deploy ramdisk: %s" msgstr "" #: ironic/drivers/modules/pxe.py:748 msgid "Failure in PXE deploy ramdisk." msgstr "" #: ironic/drivers/modules/pxe.py:751 #, python-format msgid "Continuing deployment for node %(node)s, params %(params)s" msgstr "" #: ironic/drivers/modules/pxe.py:757 #, python-format msgid "PXE deploy failed for instance %(instance)s. Error: %(error)s" msgstr "" #: ironic/drivers/modules/pxe.py:760 msgid "PXE driver failed to continue deployment." msgstr "" #: ironic/drivers/modules/pxe.py:762 #, python-format msgid "Deployment to node %s done" msgstr "" #: ironic/drivers/modules/seamicro.py:91 msgid "SeaMicro driver requires api_endpoint be set" msgstr "" #: ironic/drivers/modules/seamicro.py:95 msgid "SeaMicro driver requires both username and password be set" msgstr "" #: ironic/drivers/modules/seamicro.py:99 msgid "SeaMicro driver requires server_id be set" msgstr "" #: ironic/drivers/modules/seamicro.py:149 #, python-format msgid "SeaMicro client exception %(msg)s for node %(uuid)s" msgstr "" #: ironic/drivers/modules/seamicro.py:184 #, python-format msgid "Power-on failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:223 #, python-format msgid "Power-off failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:262 #, python-format msgid "Reboot failed for node %s." msgstr "" #: ironic/drivers/modules/seamicro.py:287 msgid "Invalid volume id specified" msgstr "" #: ironic/drivers/modules/seamicro.py:303 msgid "No storage pools found for ironic" msgstr "" #: ironic/drivers/modules/seamicro.py:363 msgid "set_power_state called with invalid power state." msgstr "" #: ironic/drivers/modules/seamicro.py:394 #, python-format msgid "Unsupported method (%s) passed to SeaMicro driver." msgstr "" #: ironic/drivers/modules/seamicro.py:412 msgid "No vlan id provided" msgstr "" #: ironic/drivers/modules/seamicro.py:424 #: ironic/drivers/modules/seamicro.py:459 #, python-format msgid "SeaMicro client exception: %s" msgstr "" #: ironic/drivers/modules/seamicro.py:449 msgid "No volume size provided for creating volume" msgstr "" #: ironic/drivers/modules/seamicro.py:475 msgid "No boot device provided" msgstr "" #: ironic/drivers/modules/seamicro.py:478 msgid "Boot device is invalid" msgstr "" #: ironic/drivers/modules/seamicro.py:488 #, python-format msgid "set_boot_device error: %s" msgstr "" #: ironic/drivers/modules/ssh.py:115 #, python-format msgid "SSHPowerDriver '%(virt_type)s' is not a valid virt_type, " msgstr "" #: ironic/drivers/modules/ssh.py:140 #, python-format msgid "Cannot execute SSH cmd %(cmd)s. Reason: %(err)s." msgstr "" #: ironic/drivers/modules/ssh.py:163 msgid "SSHPowerDriver requires ssh_port to be integer value" msgstr "" #: ironic/drivers/modules/ssh.py:179 msgid "SSHPowerDriver requires virt_type be set." msgstr "" #: ironic/drivers/modules/ssh.py:186 msgid "SSHPowerDriver requires both address and username be set." msgstr "" #: ironic/drivers/modules/ssh.py:191 msgid "" "SSHPowerDriver requires one and only one of password, key_contents and " "key_filename to be set." msgstr "" #: ironic/drivers/modules/ssh.py:200 #, python-format msgid "SSH key file %s not found." msgstr "" #: ironic/drivers/modules/ssh.py:233 #, python-format msgid "Node \"%(host)s\" with MAC address %(mac)s not found." msgstr "" #: ironic/drivers/modules/ssh.py:264 #, python-format msgid "Retrieved Node List: %s" msgstr "" #: ironic/drivers/modules/ssh.py:269 #, python-format msgid "Checking Node: %s's Mac address." msgstr "" #: ironic/drivers/modules/ssh.py:282 #, python-format msgid "Found Mac address: %s" msgstr "" #: ironic/drivers/modules/ssh.py:386 #, python-format msgid "SSH connection cannot be established: %s" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:35 msgid "VCPUs not set; assuming CPU collection broken" msgstr "" #: ironic/nova/scheduler/filters/exact_core_filter.py:42 #, python-format msgid "" "%(host_state)s does not have %(requested_vcpus)s cores of usable vcpu, it " "only has %(usable_vcpus)s cores of usable vcpu." msgstr "" #: ironic/nova/scheduler/filters/exact_disk_filter.py:34 #, python-format msgid "" "%(host_state)s does not have %(requested_disk)s MB usable disk, it only has " "%(usable_disk_mb)s MB usable disk." msgstr "" #: ironic/nova/scheduler/filters/exact_ram_filter.py:30 #, python-format msgid "" "%(host_state)s does not have %(requested_ram)s MB usable ram, it only has " "%(usable_ram)s MB usable ram." msgstr "" #: ironic/nova/virt/ironic/driver.py:96 msgid "Maximum number of retries reached." msgstr "" #: ironic/nova/virt/ironic/driver.py:103 #, python-format msgid "Power state %s not found." msgstr "" #: ironic/nova/virt/ironic/driver.py:261 #, python-format msgid "" "Adding the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:285 #, python-format msgid "" "Removing the parameter %(param)s on node %(node)s failed after %(retries)d " "retries" msgstr "" #: ironic/nova/virt/ironic/driver.py:314 msgid "Unable to authenticate Ironic client." msgstr "" #: ironic/nova/virt/ironic/driver.py:383 #, python-format msgid "Ironic node uuid not supplied to driver for instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:399 #, python-format msgid "Unable to set instance UUID for node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:414 #, python-format msgid "" "Ironic node: %(id)s failed to validate. (deploy: %(deploy)s, power: " "%(power)s)" msgstr "" #: ironic/nova/virt/ironic/driver.py:427 #, python-format msgid "" "Error preparing deploy for instance %(instance)s on baremetal node %(node)s." msgstr "" #: ironic/nova/virt/ironic/driver.py:438 #, python-format msgid "Error triggering the node %s to start the deployment" msgstr "" #: ironic/nova/virt/ironic/driver.py:465 #, python-format msgid "Failed to provision instance %(inst)s: %(reason)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:481 #, python-format msgid "Destroy called on non-existing instance %s." msgstr "" #: ironic/nova/virt/ironic/driver.py:494 #, python-format msgid "Error triggering the unprovisioning of the node %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:518 #, python-format msgid "" "Error destroying the instance on node %(node)s. Provision state still " "'%(state)s'." msgstr "" #: ironic/nova/virt/ironic/driver.py:536 #, python-format msgid "Failed to unassociate the instance %(instance)s with node %(node)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:619 #, python-format msgid "plug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:628 #, python-format msgid "" "Ironic node: %(id)s virtual to physical interface count missmatch (Vif " "count: %(vif_count)d, Pif count: %(pif_count)d)" msgstr "" #: ironic/nova/virt/ironic/driver.py:648 #, python-format msgid "Failed to set the VIF networking for port %s" msgstr "" #: ironic/nova/virt/ironic/driver.py:653 #, python-format msgid "unplug: instance_uuid=%(uuid)s vif=%(network_info)s" msgstr "" #: ironic/nova/virt/ironic/driver.py:667 #, python-format msgid "Failed to remove the VIF networking for port %s" msgstr "" #: ironic/objects/base.py:54 #, python-format msgid "Error setting %(attr)s" msgstr "" #: ironic/objects/base.py:145 msgid "Invalid version string" msgstr "" #: ironic/objects/base.py:200 #, python-format msgid "Unable to instantiate unregistered object type %(objtype)s" msgstr "" #: ironic/objects/base.py:301 #, python-format msgid "Cannot load '%(attrname)s' in the base class" msgstr "" #: ironic/objects/base.py:310 msgid "Cannot save anything in the base class" msgstr "" #: ironic/objects/conductor.py:54 msgid "Cannot update a conductor record directly." msgstr "" #: ironic/objects/utils.py:39 msgid "A datetime.datetime is required here" msgstr "" #: ironic/objects/utils.py:104 #, python-format msgid "An object of class %s is required here" msgstr "" #: ironic/openstack/common/excutils.py:64 #, python-format msgid "Original exception being dropped: %s" msgstr "" #: ironic/openstack/common/excutils.py:93 #, python-format msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" #: ironic/openstack/common/gettextutils.py:297 msgid "Message objects do not support addition." msgstr "" #: ironic/openstack/common/gettextutils.py:306 msgid "" "Message objects do not support str() because they may contain non-ascii " "characters. Please use unicode() or translate() instead." msgstr "" #: ironic/openstack/common/lockutils.py:105 #, python-format msgid "Could not release the acquired lock `%s`" msgstr "" #: ironic/openstack/common/lockutils.py:170 #, python-format msgid "Got semaphore \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:179 #, python-format msgid "Attempting to grab file lock \"%(lock)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:189 #, python-format msgid "Created lock path: %s" msgstr "" #: ironic/openstack/common/lockutils.py:207 #, python-format msgid "Got file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:211 #, python-format msgid "Released file lock \"%(lock)s\" at %(path)s" msgstr "" #: ironic/openstack/common/lockutils.py:249 #, python-format msgid "Got semaphore / lock \"%(function)s\"" msgstr "" #: ironic/openstack/common/lockutils.py:253 #, python-format msgid "Semaphore / lock released \"%(function)s\"" msgstr "" #: ironic/openstack/common/log.py:303 #, python-format msgid "Deprecated: %s" msgstr "" #: ironic/openstack/common/log.py:402 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" #: ironic/openstack/common/log.py:453 #, python-format msgid "syslog facility must be one of: %s" msgstr "" #: ironic/openstack/common/log.py:623 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" #: ironic/openstack/common/loopingcall.py:84 #, python-format msgid "task run outlasted interval by %s sec" msgstr "" #: ironic/openstack/common/loopingcall.py:91 msgid "in fixed duration looping call" msgstr "" #: ironic/openstack/common/loopingcall.py:131 #, python-format msgid "Dynamic looping call sleeping for %.02f seconds" msgstr "" #: ironic/openstack/common/loopingcall.py:138 msgid "in dynamic looping call" msgstr "" #: ironic/openstack/common/periodic_task.py:43 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." msgstr "" #: ironic/openstack/common/periodic_task.py:134 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" msgstr "" #: ironic/openstack/common/periodic_task.py:139 #, python-format msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" #: ironic/openstack/common/periodic_task.py:177 #, python-format msgid "Running periodic task %(full_task_name)s" msgstr "" #: ironic/openstack/common/periodic_task.py:186 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" #: ironic/openstack/common/policy.py:395 #, python-format msgid "Failed to understand rule %(rule)s" msgstr "" #: ironic/openstack/common/policy.py:405 #, python-format msgid "No handler for matches of kind %s" msgstr "" #: ironic/openstack/common/policy.py:680 #, python-format msgid "Failed to understand rule %(rule)r" msgstr "" #: ironic/openstack/common/processutils.py:127 #, python-format msgid "Got unknown keyword args to utils.execute: %r" msgstr "" #: ironic/openstack/common/processutils.py:142 #, python-format msgid "Running cmd (subprocess): %s" msgstr "" #: ironic/openstack/common/processutils.py:167 #: ironic/openstack/common/processutils.py:240 #, python-format msgid "Result was %s" msgstr "" #: ironic/openstack/common/processutils.py:179 #, python-format msgid "%r failed. Retrying." msgstr "" #: ironic/openstack/common/processutils.py:219 #, python-format msgid "Running cmd (SSH): %s" msgstr "" #: ironic/openstack/common/processutils.py:221 msgid "Environment not supported over SSH" msgstr "" #: ironic/openstack/common/processutils.py:225 msgid "process_input not supported over SSH" msgstr "" #: ironic/openstack/common/service.py:166 #: ironic/openstack/common/service.py:384 msgid "Full set of CONF:" msgstr "" #: ironic/openstack/common/service.py:175 #: ironic/openstack/common/service.py:269 #, python-format msgid "Caught %s, exiting" msgstr "" #: ironic/openstack/common/service.py:187 msgid "Exception during rpc cleanup." msgstr "" #: ironic/openstack/common/service.py:238 msgid "Parent process has died unexpectedly, exiting" msgstr "" #: ironic/openstack/common/service.py:275 msgid "Unhandled exception" msgstr "" #: ironic/openstack/common/service.py:308 msgid "Forking too fast, sleeping" msgstr "" #: ironic/openstack/common/service.py:327 #, python-format msgid "Started child %d" msgstr "" #: ironic/openstack/common/service.py:337 #, python-format msgid "Starting %d workers" msgstr "" #: ironic/openstack/common/service.py:354 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" #: ironic/openstack/common/service.py:358 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" #: ironic/openstack/common/service.py:362 #, python-format msgid "pid %d not in child list" msgstr "" #: ironic/openstack/common/service.py:392 #, python-format msgid "Caught %s, stopping children" msgstr "" #: ironic/openstack/common/service.py:410 #, python-format msgid "Waiting on %d children to exit" msgstr "" #: ironic/openstack/common/sslutils.py:52 #, python-format msgid "Unable to find cert_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:55 #, python-format msgid "Unable to find ca_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:58 #, python-format msgid "Unable to find key_file : %s" msgstr "" #: ironic/openstack/common/sslutils.py:61 msgid "" "When running server in SSL mode, you must specify both a cert_file and " "key_file option value in your configuration file" msgstr "" #: ironic/openstack/common/sslutils.py:100 #, python-format msgid "Invalid SSL version : %s" msgstr "" #: ironic/openstack/common/strutils.py:88 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" msgstr "" #: ironic/openstack/common/strutils.py:184 #, python-format msgid "Invalid string format: %s" msgstr "" #: ironic/openstack/common/strutils.py:191 #, python-format msgid "Unknown byte multiplier: %s" msgstr "" #: ironic/openstack/common/db/exception.py:44 msgid "Invalid Parameter: Unicode is not supported by the current database." msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:188 msgid "version should be an integer" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:216 #, python-format msgid "" "Tables \"%s\" have non utf8 collation, please make sure all tables are " "CHARSET=utf8" msgstr "" #: ironic/openstack/common/db/sqlalchemy/migration.py:240 msgid "" "The database is not under version control, but has tables. Please stamp the " "current version of the schema manually." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:60 msgid "Sort key supplied was not valid." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:121 msgid "Unknown sort direction, must be 'desc' or 'asc'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:164 #, python-format msgid "" "There is no `deleted` column in `%s` table. Project doesn't use soft-deleted" " feature." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:176 #, python-format msgid "Unrecognized read_deleted value '%s'" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:183 #, python-format msgid "There is no `project_id` column in `%s` table." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:241 msgid "model should be a subclass of ModelBase" msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:284 #, python-format msgid "" "Please specify column %s in col_name_col_instance param. It is required " "because column has unsupported type by sqlite)." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:290 #, python-format msgid "" "col_name_col_instance param has wrong type of column instance for column %s " "It should be instance of sqlalchemy.Column." msgstr "" #: ironic/openstack/common/db/sqlalchemy/utils.py:391 msgid "Unsupported id columns type" msgstr "" #: ironic/openstack/common/notifier/api.py:129 #, python-format msgid "%s not in valid priorities" msgstr "" #: ironic/openstack/common/notifier/api.py:145 #, python-format msgid "" "Problem '%(e)s' attempting to send to notification system. " "Payload=%(payload)s" msgstr "" #: ironic/openstack/common/notifier/api.py:164 #, python-format msgid "Failed to load notifier %s. These notifications will not be sent." msgstr "" #: ironic/openstack/common/notifier/rpc_notifier.py:45 #: ironic/openstack/common/notifier/rpc_notifier2.py:51 #, python-format msgid "Could not send notification to %(topic)s. Payload=%(message)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:75 msgid "Pool creating new connection" msgstr "" #: ironic/openstack/common/rpc/amqp.py:202 #, python-format msgid "No calling threads waiting for msg_id : %(msg_id)s, message : %(data)s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:205 #, python-format msgid "_call_waiters: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:212 #, python-format msgid "" "Number of call waiters is greater than warning threshold: %d. There could be" " a MulticallProxyWaiter leak." msgstr "" #: ironic/openstack/common/rpc/amqp.py:290 #, python-format msgid "unpacked context: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:342 #, python-format msgid "UNIQUE_ID is %s." msgstr "" #: ironic/openstack/common/rpc/amqp.py:435 #, python-format msgid "received %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:443 #, python-format msgid "no method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:444 #, python-format msgid "No method for message: %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:472 #: ironic/openstack/common/rpc/impl_zmq.py:280 #, python-format msgid "Expected exception during message handling (%s)" msgstr "" #: ironic/openstack/common/rpc/amqp.py:480 #: ironic/openstack/common/rpc/impl_zmq.py:286 msgid "Exception during message handling" msgstr "" #: ironic/openstack/common/rpc/amqp.py:554 #, python-format msgid "Making synchronous call on %s ..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:557 #, python-format msgid "MSG_ID is %s" msgstr "" #: ironic/openstack/common/rpc/amqp.py:583 #, python-format msgid "Making asynchronous cast on %s..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:592 msgid "Making asynchronous fanout cast..." msgstr "" #: ironic/openstack/common/rpc/amqp.py:620 #, python-format msgid "Sending %(event_type)s on %(topic)s" msgstr "" #: ironic/openstack/common/rpc/common.py:76 msgid "An unknown RPC related exception occurred." msgstr "" #: ironic/openstack/common/rpc/common.py:106 #, python-format msgid "" "Remote error: %(exc_type)s %(value)s\n" "%(traceback)s." msgstr "" #: ironic/openstack/common/rpc/common.py:123 #, python-format msgid "" "Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method: " "\"%(method)s\" info: \"%(info)s\"" msgstr "" #: ironic/openstack/common/rpc/common.py:140 #: ironic/openstack/common/rpc/common.py:141 #: ironic/openstack/common/rpc/common.py:142 msgid "" msgstr "" #: ironic/openstack/common/rpc/common.py:146 #, python-format msgid "Found duplicate message(%(msg_id)s). Skipping it." msgstr "" #: ironic/openstack/common/rpc/common.py:150 msgid "Invalid reuse of an RPC connection." msgstr "" #: ironic/openstack/common/rpc/common.py:154 #, python-format msgid "Specified RPC version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:159 #, python-format msgid "" "Specified RPC envelope version, %(version)s, not supported by this endpoint." msgstr "" #: ironic/openstack/common/rpc/common.py:164 #, python-format msgid "Specified RPC version cap, %(version_cap)s, is too low" msgstr "" #: ironic/openstack/common/rpc/common.py:292 #, python-format msgid "Returning exception %s to caller" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:156 msgid "Failed to process message ... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:160 msgid "Failed to process message ... will requeue." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:495 #, python-format msgid "Reconnecting to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:517 #, python-format msgid "Connected to AMQP server on %(hostname)s:%(port)d" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:554 #, python-format msgid "" "Unable to connect to AMQP server on %(hostname)s:%(port)d after " "%(max_retries)d tries: %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:568 #, python-format msgid "" "AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying " "again in %(sleep_time)d seconds." msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:622 #: ironic/openstack/common/rpc/impl_qpid.py:573 #, python-format msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:640 #: ironic/openstack/common/rpc/impl_qpid.py:588 #, python-format msgid "Timed out waiting for RPC response: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:644 #: ironic/openstack/common/rpc/impl_qpid.py:592 #, python-format msgid "Failed to consume message from queue: %s" msgstr "" #: ironic/openstack/common/rpc/impl_kombu.py:683 #: ironic/openstack/common/rpc/impl_qpid.py:627 #, python-format msgid "Failed to publish message to topic '%(topic)s': %(err_str)s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:87 #, python-format msgid "Invalid value for qpid_topology_version: %d" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:191 msgid "Failed to process message... skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:515 #, python-format msgid "Unable to connect to AMQP server: %(e)s. Sleeping %(delay)s seconds" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:521 #, python-format msgid "Connected to AMQP server on %s" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:534 msgid "Re-established AMQP queues" msgstr "" #: ironic/openstack/common/rpc/impl_qpid.py:600 msgid "Error processing message. Skipping it." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:96 msgid "JSON serialization failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:101 #, python-format msgid "Deserializing: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:136 #, python-format msgid "Connecting to %(addr)s with %(type)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:137 #, python-format msgid "-> Subscribed to %(subscribe)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:138 #, python-format msgid "-> bind: %(bind)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:146 msgid "Could not open socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:158 #, python-format msgid "Subscribing to %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:195 msgid "ZeroMQ socket could not be closed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:200 msgid "You cannot recv on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:205 msgid "You cannot send on this socket." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:267 #, python-format msgid "Running func with context: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:305 msgid "Sending reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:339 msgid "RPC message did not include method." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:371 msgid "Registering reactor" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:383 msgid "In reactor registered" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:388 msgid "Consuming socket" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:438 #, python-format msgid "Creating proxy for topic: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:444 msgid "Topic contained dangerous characters." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:476 msgid "Topic socket file creation failed." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:482 #, python-format msgid "" "Local per-topic backlog buffer full for topic %(topic)s. Dropping message." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:498 #, python-format msgid "Required IPC directory does not exist at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:507 #, python-format msgid "Permission denied to IPC directory at %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:510 msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:544 #, python-format msgid "CONSUMER RECEIVED DATA: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:563 msgid "ZMQ Envelope version unsupported or unknown." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:591 msgid "Skipping topic registration. Already registered." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:598 #, python-format msgid "Consumer is a zmq.%s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:650 msgid "Creating payload" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:663 msgid "Creating queue socket for reply waiter" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:676 msgid "Sending cast" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:679 msgid "Cast sent; Waiting reply" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:682 #, python-format msgid "Received message: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:683 msgid "Unpacking response" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:692 msgid "Unsupported or unknown ZMQ envelope returned." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:699 msgid "RPC Message Invalid." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:722 #, python-format msgid "%(msg)s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:725 #, python-format msgid "Sending message(s) to: %s" msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:729 msgid "No matchmaker results. Not casting." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:732 msgid "No match from matchmaker." msgstr "" #: ironic/openstack/common/rpc/impl_zmq.py:814 #, python-format msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:46 msgid "Match not found by MatchMaker." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:80 msgid "Matchmaker does not implement registration or heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:216 #, python-format msgid "Matchmaker unregistered: %(key)s, %(host)s" msgstr "" #: ironic/openstack/common/rpc/matchmaker.py:228 msgid "Register before starting heartbeat." msgstr "" #: ironic/openstack/common/rpc/matchmaker_ring.py:75 #: ironic/openstack/common/rpc/matchmaker_ring.py:93 #, python-format msgid "No key defining hosts for topic '%s', see ringfile" msgstr "" #: ironic/openstack/common/rpc/service.py:47 #, python-format msgid "Creating Consumer connection for Service %s" msgstr "" #: ironic/tests/db/sqlalchemy/test_migrations.py:312 #, python-format msgid "Failed to migrate to version %(version)s on engine %(engine)s" msgstr "" ironic-2014.1.rc1/ironic/db/0000775000175300017540000000000012316614636016565 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/db/api.py0000664000175300017540000002653712316614116017716 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright 2013 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. """ Base classes for storage engines """ import abc from oslo.config import cfg import six from ironic.openstack.common.db import api as db_api CONF = cfg.CONF CONF.import_opt('backend', 'ironic.openstack.common.db.options', group='database') _BACKEND_MAPPING = {'sqlalchemy': 'ironic.db.sqlalchemy.api'} IMPL = db_api.DBAPI(CONF.database.backend, backend_mapping=_BACKEND_MAPPING, lazy=True) def get_instance(): """Return a DB API instance.""" return IMPL @six.add_metaclass(abc.ABCMeta) class Connection(object): """Base class for storage system connections.""" @abc.abstractmethod def __init__(self): """Constructor.""" @abc.abstractmethod def get_nodeinfo_list(self, columns=None, filters=None, limit=None, marker=None, sort_key=None, sort_dir=None): """Return a list of the specified columns for all nodes that match the specified filters. :param columns: List of column names to return. Defaults to 'id' column when columns == None. :param filters: Filters to apply. Defaults to None. 'associated': True | False 'reserved': True | False 'maintenance': True | False 'chassis_uuid': uuid of chassis 'driver': driver's name :param limit: Maximum number of nodes to return. :param marker: the last item of the previous page; we return the next result set. :param sort_key: Attribute by which results should be sorted. :param sort_dir: direction in which results should be sorted. (asc, desc) :returns: A list of tuples of the specified columns. """ @abc.abstractmethod def get_node_list(self, filters=None, limit=None, marker=None, sort_key=None, sort_dir=None): """Return a list of nodes. :param filters: Filters to apply. Defaults to None. 'associated': True | False 'reserved': True | False 'maintenance': True | False 'chassis_uuid': uuid of chassis 'driver': driver's name :param limit: Maximum number of nodes to return. :param marker: the last item of the previous page; we return the next result set. :param sort_key: Attribute by which results should be sorted. :param sort_dir: direction in which results should be sorted. (asc, desc) """ @abc.abstractmethod def reserve_nodes(self, tag, nodes): """Reserve a set of nodes atomically. To prevent other ManagerServices from manipulating the given Nodes while a Task is performed, mark them all reserved by this host. :param tag: A string uniquely identifying the reservation holder. :param nodes: A list of node id or uuid. :returns: A list of the reserved node refs. :raises: NodeNotFound if any node is not found. :raises: NodeAlreadyReserved if any node is already reserved. """ @abc.abstractmethod def release_nodes(self, tag, nodes): """Release the reservation on a set of nodes atomically. :param tag: A string uniquely identifying the reservation holder. :param nodes: A list of node id or uuid. :raises: NodeNotFound if any node is not found. :raises: NodeAlreadyReserved if any node could not be released because it was not reserved by this host. """ @abc.abstractmethod def create_node(self, values): """Create a new node. :param values: A dict containing several items used to identify and track the node, and several dicts which are passed into the Drivers when managing this node. For example: { 'uuid': utils.generate_uuid(), 'instance_uuid': None, 'power_state': states.NOSTATE, 'provision_state': states.NOSTATE, 'driver': 'pxe_ipmitool', 'driver_info': { ... }, 'properties': { ... }, 'extra': { ... }, } :returns: A node. """ @abc.abstractmethod def get_node(self, node_id): """Return a node. :param node_id: The id or uuid of a node. :returns: A node. """ @abc.abstractmethod def get_node_by_instance(self, instance): """Return a node. :param instance: The instance name or uuid to search for. :returns: A node. """ @abc.abstractmethod def destroy_node(self, node_id): """Destroy a node and all associated interfaces. :param node_id: The id or uuid of a node. """ @abc.abstractmethod def update_node(self, node_id, values): """Update properties of a node. :param node_id: The id or uuid of a node. :param values: Dict of values to update. May be a partial list, eg. when setting the properties for a driver. For example: { 'driver_info': { 'my-field-1': val1, 'my-field-2': val2, } } :returns: A node. :raises: NodeAssociated :raises: NodeNotFound """ @abc.abstractmethod def get_port(self, port_id): """Return a network port representation. :param port_id: The id or MAC of a port. :returns: A port. """ @abc.abstractmethod def get_port_by_vif(self, vif): """Return the port corresponding to this VIF. :param vif: The uuid of the VIF. :returns: A port. """ @abc.abstractmethod def get_port_list(self, limit=None, marker=None, sort_key=None, sort_dir=None): """Return a list of ports. :param limit: Maximum number of ports to return. :param marker: the last item of the previous page; we return the next result set. :param sort_key: Attribute by which results should be sorted. :param sort_dir: direction in which results should be sorted. (asc, desc) """ @abc.abstractmethod def get_ports_by_node(self, node_id, limit=None, marker=None, sort_key=None, sort_dir=None): """List all the ports for a given node. :param node_id: The id or uuid of a node. :param limit: Maximum number of ports to return. :param marker: the last item of the previous page; we return the next result set. :param sort_key: Attribute by which results should be sorted :param sort_dir: direction in which results should be sorted (asc, desc) :returns: A list of ports. """ @abc.abstractmethod def create_port(self, values): """Create a new port. :param values: Dict of values. """ @abc.abstractmethod def update_port(self, port_id, values): """Update properties of an port. :param port_id: The id or MAC of a port. :param values: Dict of values to update. :returns: A port. """ @abc.abstractmethod def destroy_port(self, port_id): """Destroy an port. :param port_id: The id or MAC of a port. """ @abc.abstractmethod def create_chassis(self, values): """Create a new chassis. :param values: Dict of values. """ @abc.abstractmethod def get_chassis(self, chassis_id): """Return a chassis representation. :param chassis_id: The id or the UUID of a chassis. :returns: A chassis. """ @abc.abstractmethod def get_chassis_list(self, limit=None, marker=None, sort_key=None, sort_dir=None): """Return a list of chassis. :param limit: Maximum number of chassis to return. :param marker: the last item of the previous page; we return the next result set. :param sort_key: Attribute by which results should be sorted. :param sort_dir: direction in which results should be sorted. (asc, desc) """ @abc.abstractmethod def update_chassis(self, chassis_id, values): """Update properties of an chassis. :param chassis_id: The id or the uuid of a chassis. :param values: Dict of values to update. :returns: A chassis. """ @abc.abstractmethod def destroy_chassis(self, chassis_id): """Destroy a chassis. :param chassis_id: The id or the uuid of a chassis. """ @abc.abstractmethod def register_conductor(self, values): """Register a new conductor service at the specified hostname. :param values: A dict of values which must contain the following: { 'hostname': the unique hostname which identifies this Conductor service. 'drivers': a list of supported drivers. } :returns: A conductor. :raises: ConductorAlreadyRegistered """ @abc.abstractmethod def get_conductor(self, hostname): """Retrieve a conductor service record from the database. :param hostname: The hostname of the conductor service. :returns: A conductor. :raises: ConductorNotFound """ @abc.abstractmethod def unregister_conductor(self, hostname): """Unregister this conductor with the service registry. :param hostname: The hostname of this conductor service. :raises: ConductorNotFound """ @abc.abstractmethod def touch_conductor(self, hostname): """Mark a conductor as active by updating its 'updated_at' property. :param hostname: The hostname of this conductor service. :raises: ConductorNotFound """ @abc.abstractmethod def get_active_driver_dict(self, interval): """Retrieve drivers for the registered and active conductors. :param interval: Seconds since last check-in of a conductor. :returns: A dict which maps driver names to the set of hosts which support them. For example: {driverA: set([host1, host2]), driverB: set([host2, host3])} """ ironic-2014.1.rc1/ironic/db/__init__.py0000664000175300017540000000000012316614116020655 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/db/migration.py0000664000175300017540000000273412316614116021127 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # 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. """Database setup and migration commands.""" from oslo.config import cfg from ironic.common import utils CONF = cfg.CONF CONF.import_opt('backend', 'ironic.openstack.common.db.options', group='database') IMPL = utils.LazyPluggable( pivot='backend', config_group='database', sqlalchemy='ironic.db.sqlalchemy.migration') INIT_VERSION = 0 def upgrade(version=None): """Migrate the database to `version` or the most recent version.""" return IMPL.upgrade(version) def downgrade(version=None): return IMPL.downgrade(version) def version(): return IMPL.version() def stamp(version): return IMPL.stamp(version) def revision(message, autogenerate): return IMPL.revision(message, autogenerate) ironic-2014.1.rc1/ironic/db/sqlalchemy/0000775000175300017540000000000012316614636020727 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/db/sqlalchemy/alembic/0000775000175300017540000000000012316614636022323 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/db/sqlalchemy/alembic/script.py.mako0000664000175300017540000000063412316614116025123 0ustar jenkinsjenkins00000000000000"""${message} Revision ID: ${up_revision} Revises: ${down_revision} Create Date: ${create_date} """ # revision identifiers, used by Alembic. revision = ${repr(up_revision)} down_revision = ${repr(down_revision)} from alembic import op import sqlalchemy as sa ${imports if imports else ""} def upgrade(): ${upgrades if upgrades else "pass"} def downgrade(): ${downgrades if downgrades else "pass"} ironic-2014.1.rc1/ironic/db/sqlalchemy/alembic/README0000664000175300017540000000100712316614116023172 0ustar jenkinsjenkins00000000000000Please see https://alembic.readthedocs.org/en/latest/index.html for general documentation To create alembic migrations use: $ ironic-dbsync revision --message --autogenerate Stamp db with most recent migration version, without actually running migrations $ ironic-dbsync stamp --revision head Upgrade can be performed by: $ ironic-dbsync - for backward compatibility $ ironic-dbsync upgrade # ironic-dbsync upgrade --revision head Downgrading db: $ ironic-dbsync downgrade $ ironic-dbsync downgrade --revision base ironic-2014.1.rc1/ironic/db/sqlalchemy/alembic/versions/0000775000175300017540000000000012316614636024173 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/db/sqlalchemy/alembic/versions/3cb628139ea4_nodes_add_console_enabled.py0000664000175300017540000000176012316614116033474 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. """Nodes add console enabled Revision ID: 3cb628139ea4 Revises: 21b331f883ef Create Date: 2014-02-26 11:24:11.318023 """ # revision identifiers, used by Alembic. revision = '3cb628139ea4' down_revision = '21b331f883ef' from alembic import op import sqlalchemy as sa def upgrade(): op.add_column('nodes', sa.Column('console_enabled', sa.Boolean) ) def downgrade(): op.drop_column('nodes', 'console_enabled') ironic-2014.1.rc1/ironic/db/sqlalchemy/alembic/versions/2581ebaf0cb2_initial_migration.py0000664000175300017540000001057712316614116032216 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. """initial migration Revision ID: 2581ebaf0cb2 Revises: None Create Date: 2014-01-17 12:14:07.754448 """ # revision identifiers, used by Alembic. revision = '2581ebaf0cb2' down_revision = None from alembic import op import sqlalchemy as sa def upgrade(): ### commands auto generated by Alembic - please adjust! ### op.create_table( 'conductors', sa.Column('created_at', sa.DateTime(), nullable=True), sa.Column('updated_at', sa.DateTime(), nullable=True), sa.Column('id', sa.Integer(), nullable=False), sa.Column('hostname', sa.String(length=255), nullable=False), sa.Column('drivers', sa.Text(), nullable=True), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('hostname', name='uniq_conductors0hostname'), mysql_ENGINE='InnoDB', mysql_DEFAULT_CHARSET='UTF8' ) op.create_table( 'chassis', sa.Column('created_at', sa.DateTime(), nullable=True), sa.Column('updated_at', sa.DateTime(), nullable=True), sa.Column('id', sa.Integer(), nullable=False), sa.Column('uuid', sa.String(length=36), nullable=True), sa.Column('extra', sa.Text(), nullable=True), sa.Column('description', sa.String(length=255), nullable=True), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('uuid', name='uniq_chassis0uuid'), mysql_ENGINE='InnoDB', mysql_DEFAULT_CHARSET='UTF8' ) op.create_table( 'nodes', sa.Column('created_at', sa.DateTime(), nullable=True), sa.Column('updated_at', sa.DateTime(), nullable=True), sa.Column('id', sa.Integer(), nullable=False), sa.Column('uuid', sa.String(length=36), nullable=True), sa.Column('instance_uuid', sa.String(length=36), nullable=True), sa.Column('chassis_id', sa.Integer(), nullable=True), sa.Column('power_state', sa.String(length=15), nullable=True), sa.Column('target_power_state', sa.String(length=15), nullable=True), sa.Column('provision_state', sa.String(length=15), nullable=True), sa.Column('target_provision_state', sa.String(length=15), nullable=True), sa.Column('last_error', sa.Text(), nullable=True), sa.Column('properties', sa.Text(), nullable=True), sa.Column('driver', sa.String(length=15), nullable=True), sa.Column('driver_info', sa.Text(), nullable=True), sa.Column('reservation', sa.String(length=255), nullable=True), sa.Column('maintenance', sa.Boolean(), nullable=True), sa.Column('extra', sa.Text(), nullable=True), sa.ForeignKeyConstraint(['chassis_id'], ['chassis.id'], ), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('uuid', name='uniq_nodes0uuid'), mysql_ENGINE='InnoDB', mysql_DEFAULT_CHARSET='UTF8' ) op.create_index('node_instance_uuid', 'nodes', ['instance_uuid'], unique=False) op.create_table( 'ports', sa.Column('created_at', sa.DateTime(), nullable=True), sa.Column('updated_at', sa.DateTime(), nullable=True), sa.Column('id', sa.Integer(), nullable=False), sa.Column('uuid', sa.String(length=36), nullable=True), sa.Column('address', sa.String(length=18), nullable=True), sa.Column('node_id', sa.Integer(), nullable=True), sa.Column('extra', sa.Text(), nullable=True), sa.ForeignKeyConstraint(['node_id'], ['nodes.id'], ), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('address', name='uniq_ports0address'), sa.UniqueConstraint('uuid', name='uniq_ports0uuid'), mysql_ENGINE='InnoDB', mysql_DEFAULT_CHARSET='UTF8' ) ### end Alembic commands ### def downgrade(): raise NotImplementedError(('Downgrade from initial migration is' ' unsupported.')) ironic-2014.1.rc1/ironic/db/sqlalchemy/alembic/versions/21b331f883ef_add_provision_updated_at.py0000664000175300017540000000202012316614116033401 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. """Add provision_updated_at Revision ID: 21b331f883ef Revises: 2581ebaf0cb2 Create Date: 2014-02-19 13:45:30.150632 """ # revision identifiers, used by Alembic. revision = '21b331f883ef' down_revision = '2581ebaf0cb2' from alembic import op import sqlalchemy as sa def upgrade(): op.add_column('nodes', sa.Column('provision_updated_at', sa.DateTime(), nullable=True)) def downgrade(): op.drop_column('nodes', 'provision_updated_at') ironic-2014.1.rc1/ironic/db/sqlalchemy/alembic/env.py0000664000175300017540000000334712316614116023465 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 logging import config as log_config from alembic import context from ironic.db.sqlalchemy import api as sqla_api from ironic.db.sqlalchemy import models # this is the Alembic Config object, which provides # access to the values within the .ini file in use. config = context.config # Interpret the config file for Python logging. # This line sets up loggers basically. log_config.fileConfig(config.config_file_name) # add your model's MetaData object here # for 'autogenerate' support # from myapp import mymodel target_metadata = models.Base.metadata # other values from the config, defined by the needs of env.py, # can be acquired: # my_important_option = config.get_main_option("my_important_option") # ... etc. def run_migrations_online(): """Run migrations in 'online' mode. In this scenario we need to create an Engine and associate a connection with the context. """ engine = sqla_api.get_engine() with engine.connect() as connection: context.configure(connection=connection, target_metadata=target_metadata) with context.begin_transaction(): context.run_migrations() run_migrations_online() ironic-2014.1.rc1/ironic/db/sqlalchemy/api.py0000664000175300017540000004750512316614116022056 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright 2013 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. """SQLAlchemy storage backend.""" import collections import datetime from oslo.config import cfg from sqlalchemy.orm.exc import NoResultFound from ironic.common import exception from ironic.common import paths from ironic.common import states from ironic.common import utils from ironic.db import api from ironic.db.sqlalchemy import models from ironic import objects from ironic.openstack.common.db import exception as db_exc from ironic.openstack.common.db import options as db_options from ironic.openstack.common.db.sqlalchemy import session as db_session from ironic.openstack.common.db.sqlalchemy import utils as db_utils from ironic.openstack.common import log from ironic.openstack.common import timeutils CONF = cfg.CONF CONF.import_opt('connection', 'ironic.openstack.common.db.options', group='database') CONF.import_opt('heartbeat_timeout', 'ironic.conductor.manager', group='conductor') LOG = log.getLogger(__name__) _DEFAULT_SQL_CONNECTION = 'sqlite:///' + paths.state_path_def('ironic.sqlite') db_options.set_defaults(_DEFAULT_SQL_CONNECTION, 'ironic.sqlite') _FACADE = None def _create_facade_lazily(): global _FACADE if _FACADE is None: _FACADE = db_session.EngineFacade( CONF.database.connection, **dict(CONF.database.iteritems()) ) return _FACADE def get_engine(): facade = _create_facade_lazily() return facade.get_engine() def get_session(**kwargs): facade = _create_facade_lazily() return facade.get_session(**kwargs) def get_backend(): """The backend is this module itself.""" return Connection() def model_query(model, *args, **kwargs): """Query helper for simpler session usage. :param session: if present, the session to use """ session = kwargs.get('session') or get_session() query = session.query(model, *args) return query def add_identity_filter(query, value): """Adds an identity filter to a query. Filters results by ID, if supplied value is a valid integer. Otherwise attempts to filter results by UUID. :param query: Initial query to add filter to. :param value: Value for filtering results by. :return: Modified query. """ if utils.is_int_like(value): return query.filter_by(id=value) elif utils.is_uuid_like(value): return query.filter_by(uuid=value) else: raise exception.InvalidIdentity(identity=value) def add_filter_by_many_identities(query, model, values): """Adds an identity filter to a query for values list. Filters results by ID, if supplied values contain a valid integer. Otherwise attempts to filter results by UUID. :param query: Initial query to add filter to. :param model: Model for filter. :param values: Values for filtering results by. :return: tuple (Modified query, filter field name). """ if not values: raise exception.InvalidIdentity(identity=values) value = values[0] if utils.is_int_like(value): return query.filter(getattr(model, 'id').in_(values)), 'id' elif utils.is_uuid_like(value): return query.filter(getattr(model, 'uuid').in_(values)), 'uuid' else: raise exception.InvalidIdentity(identity=value) def add_port_filter(query, value): """Adds a port-specific filter to a query. Filters results by address, if supplied value is a valid MAC address. Otherwise attempts to filter results by identity. :param query: Initial query to add filter to. :param value: Value for filtering results by. :return: Modified query. """ if utils.is_valid_mac(value): return query.filter_by(address=value) else: return add_identity_filter(query, value) def add_port_filter_by_node(query, value): if utils.is_int_like(value): return query.filter_by(node_id=value) else: query = query.join(models.Node, models.Port.node_id == models.Node.id) return query.filter(models.Node.uuid == value) def add_node_filter_by_chassis(query, value): if utils.is_int_like(value): return query.filter_by(chassis_id=value) else: query = query.join(models.Chassis, models.Node.chassis_id == models.Chassis.id) return query.filter(models.Chassis.uuid == value) def _check_port_change_forbidden(port, session): node_id = port['node_id'] if node_id is not None: query = model_query(models.Node, session=session) query = query.filter_by(id=node_id) node_ref = query.one() if node_ref['reservation'] is not None: raise exception.NodeLocked(node=node_id, host=node_ref['reservation']) def _paginate_query(model, limit=None, marker=None, sort_key=None, sort_dir=None, query=None): if not query: query = model_query(model) sort_keys = ['id'] if sort_key and sort_key not in sort_keys: sort_keys.insert(0, sort_key) query = db_utils.paginate_query(query, model, limit, sort_keys, marker=marker, sort_dir=sort_dir) return query.all() def _check_node_already_locked(query, query_by): no_reserv = None locked_ref = query.filter(models.Node.reservation != no_reserv).first() if locked_ref: raise exception.NodeLocked(node=locked_ref[query_by], host=locked_ref['reservation']) def _handle_node_lock_not_found(nodes, query, query_by): refs = query.all() existing = [ref[query_by] for ref in refs] missing = set(nodes) - set(existing) raise exception.NodeNotFound(node=missing.pop()) class Connection(api.Connection): """SqlAlchemy connection.""" def __init__(self): pass def _add_nodes_filters(self, query, filters): if filters is None: filters = [] if 'chassis_uuid' in filters: # get_chassis() to raise an exception if the chassis is not found chassis_obj = self.get_chassis(filters['chassis_uuid']) query = query.filter_by(chassis_id=chassis_obj.id) if 'associated' in filters: if filters['associated']: query = query.filter(models.Node.instance_uuid != None) else: query = query.filter(models.Node.instance_uuid == None) if 'reserved' in filters: if filters['reserved']: query = query.filter(models.Node.reservation != None) else: query = query.filter(models.Node.reservation == None) if 'maintenance' in filters: query = query.filter_by(maintenance=filters['maintenance']) if 'driver' in filters: query = query.filter_by(driver=filters['driver']) return query def get_nodeinfo_list(self, columns=None, filters=None, limit=None, marker=None, sort_key=None, sort_dir=None): # list-ify columns default values because it is bad form # to include a mutable list in function definitions. if columns is None: columns = [models.Node.id] else: columns = [getattr(models.Node, c) for c in columns] query = model_query(*columns, base_model=models.Node) query = self._add_nodes_filters(query, filters) return _paginate_query(models.Node, limit, marker, sort_key, sort_dir, query) @objects.objectify(objects.Node) def get_node_list(self, filters=None, limit=None, marker=None, sort_key=None, sort_dir=None): query = model_query(models.Node) query = self._add_nodes_filters(query, filters) return _paginate_query(models.Node, limit, marker, sort_key, sort_dir, query) @objects.objectify(objects.Node) def reserve_nodes(self, tag, nodes): # assume nodes does not contain duplicates # Ensure consistent sort order so we don't run into deadlocks. nodes.sort() session = get_session() with session.begin(): query = model_query(models.Node, session=session) query, query_by = add_filter_by_many_identities(query, models.Node, nodes) # Be optimistic and assume we usually get a reservation. _check_node_already_locked(query, query_by) count = query.update({'reservation': tag}, synchronize_session=False) if count != len(nodes): # one or more node id not found _handle_node_lock_not_found(nodes, query, query_by) return query.all() def release_nodes(self, tag, nodes): # assume nodes does not contain duplicates session = get_session() with session.begin(): query = model_query(models.Node, session=session) query, query_by = add_filter_by_many_identities(query, models.Node, nodes) # be optimistic and assume we usually release a reservation count = query.filter_by(reservation=tag).\ update({'reservation': None}, synchronize_session=False) if count != len(nodes): # we updated not all nodes if len(nodes) != query.count(): # one or more node id not found _handle_node_lock_not_found(nodes, query, query_by) else: # one or more node had reservation != tag _check_node_already_locked(query, query_by) @objects.objectify(objects.Node) def create_node(self, values): # ensure defaults are present for new nodes if not values.get('uuid'): values['uuid'] = utils.generate_uuid() if not values.get('power_state'): values['power_state'] = states.NOSTATE if not values.get('provision_state'): values['provision_state'] = states.NOSTATE node = models.Node() node.update(values) node.save() return node @objects.objectify(objects.Node) def get_node(self, node_id): query = model_query(models.Node) query = add_identity_filter(query, node_id) try: result = query.one() except NoResultFound: raise exception.NodeNotFound(node=node_id) return result @objects.objectify(objects.Node) def get_node_by_instance(self, instance): if not utils.is_uuid_like(instance): raise exception.InvalidUUID(uuid=instance) query = model_query(models.Node).\ filter_by(instance_uuid=instance) try: result = query.one() except NoResultFound: raise exception.InstanceNotFound(instance=instance) return result def destroy_node(self, node_id): session = get_session() with session.begin(): query = model_query(models.Node, session=session) query = add_identity_filter(query, node_id) try: node_ref = query.one() except NoResultFound: raise exception.NodeNotFound(node=node_id) # Get node ID, if an UUID was supplied. The ID is # required for deleting all ports, attached to the node. if utils.is_uuid_like(node_id): node_id = node_ref['id'] port_query = model_query(models.Port, session=session) port_query = add_port_filter_by_node(port_query, node_id) port_query.delete() query.delete() @objects.objectify(objects.Node) def update_node(self, node_id, values): session = get_session() with session.begin(): query = model_query(models.Node, session=session) query = add_identity_filter(query, node_id) try: ref = query.with_lockmode('update').one() except NoResultFound: raise exception.NodeNotFound(node=node_id) # Prevent instance_uuid overwriting if values.get("instance_uuid") and ref.instance_uuid: raise exception.NodeAssociated(node=node_id, instance=values['instance_uuid']) if 'provision_state' in values: values['provision_updated_at'] = timeutils.utcnow() ref.update(values) return ref @objects.objectify(objects.Port) def get_port(self, port_id): query = model_query(models.Port) query = add_port_filter(query, port_id) try: result = query.one() except NoResultFound: raise exception.PortNotFound(port=port_id) return result @objects.objectify(objects.Port) def get_port_by_vif(self, vif): pass @objects.objectify(objects.Port) def get_port_list(self, limit=None, marker=None, sort_key=None, sort_dir=None): return _paginate_query(models.Port, limit, marker, sort_key, sort_dir) @objects.objectify(objects.Port) def get_ports_by_node(self, node_id, limit=None, marker=None, sort_key=None, sort_dir=None): # get_node() to raise an exception if the node is not found node_obj = self.get_node(node_id) query = model_query(models.Port) query = query.filter_by(node_id=node_obj.id) return _paginate_query(models.Port, limit, marker, sort_key, sort_dir, query) @objects.objectify(objects.Port) def create_port(self, values): if not values.get('uuid'): values['uuid'] = utils.generate_uuid() port = models.Port() port.update(values) try: port.save() except db_exc.DBDuplicateEntry: raise exception.MACAlreadyExists(mac=values['address']) return port @objects.objectify(objects.Port) def update_port(self, port_id, values): session = get_session() try: with session.begin(): query = model_query(models.Port, session=session) query = add_port_filter(query, port_id) ref = query.one() ref.update(values) except NoResultFound: raise exception.PortNotFound(port=port_id) except db_exc.DBDuplicateEntry: raise exception.MACAlreadyExists(mac=values['address']) return ref def destroy_port(self, port_id): session = get_session() with session.begin(): query = model_query(models.Port, session=session) query = add_port_filter(query, port_id) try: ref = query.one() except NoResultFound: raise exception.PortNotFound(port=port_id) _check_port_change_forbidden(ref, session) query.delete() @objects.objectify(objects.Chassis) def get_chassis(self, chassis_id): query = model_query(models.Chassis) query = add_identity_filter(query, chassis_id) try: return query.one() except NoResultFound: raise exception.ChassisNotFound(chassis=chassis_id) @objects.objectify(objects.Chassis) def get_chassis_list(self, limit=None, marker=None, sort_key=None, sort_dir=None): return _paginate_query(models.Chassis, limit, marker, sort_key, sort_dir) @objects.objectify(objects.Chassis) def create_chassis(self, values): if not values.get('uuid'): values['uuid'] = utils.generate_uuid() chassis = models.Chassis() chassis.update(values) chassis.save() return chassis @objects.objectify(objects.Chassis) def update_chassis(self, chassis_id, values): session = get_session() with session.begin(): query = model_query(models.Chassis, session=session) query = add_identity_filter(query, chassis_id) count = query.update(values) if count != 1: raise exception.ChassisNotFound(chassis=chassis_id) ref = query.one() return ref def destroy_chassis(self, chassis_id): def chassis_not_empty(session): """Checks whether the chassis does not have nodes.""" query = model_query(models.Node, session=session) query = add_node_filter_by_chassis(query, chassis_id) return query.count() != 0 session = get_session() with session.begin(): if chassis_not_empty(session): raise exception.ChassisNotEmpty(chassis=chassis_id) query = model_query(models.Chassis, session=session) query = add_identity_filter(query, chassis_id) count = query.delete() if count != 1: raise exception.ChassisNotFound(chassis=chassis_id) @objects.objectify(objects.Conductor) def register_conductor(self, values): try: conductor = models.Conductor() conductor.update(values) # NOTE(deva): ensure updated_at field has a non-null initial value if not conductor.get('updated_at'): conductor.update({'updated_at': timeutils.utcnow()}) conductor.save() return conductor except db_exc.DBDuplicateEntry: raise exception.ConductorAlreadyRegistered( conductor=values['hostname']) @objects.objectify(objects.Conductor) def get_conductor(self, hostname): try: return model_query(models.Conductor).\ filter_by(hostname=hostname).\ one() except NoResultFound: raise exception.ConductorNotFound(conductor=hostname) def unregister_conductor(self, hostname): session = get_session() with session.begin(): query = model_query(models.Conductor, session=session).\ filter_by(hostname=hostname) count = query.delete() if count == 0: raise exception.ConductorNotFound(conductor=hostname) def touch_conductor(self, hostname): session = get_session() with session.begin(): query = model_query(models.Conductor, session=session).\ filter_by(hostname=hostname) # since we're not changing any other field, manually set updated_at count = query.update({'updated_at': timeutils.utcnow()}) if count == 0: raise exception.ConductorNotFound(conductor=hostname) def get_active_driver_dict(self, interval=None): if interval is None: interval = CONF.conductor.heartbeat_timeout limit = timeutils.utcnow() - datetime.timedelta(seconds=interval) result = model_query(models.Conductor).\ filter(models.Conductor.updated_at >= limit).\ all() # build mapping of drivers to the set of hosts which support them d2c = collections.defaultdict(set) for row in result: for driver in row['drivers']: d2c[driver].add(row['hostname']) return d2c ironic-2014.1.rc1/ironic/db/sqlalchemy/__init__.py0000664000175300017540000000000012316614116023017 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/db/sqlalchemy/alembic.ini0000664000175300017540000000171712316614116023023 0ustar jenkinsjenkins00000000000000# A generic, single database configuration. [alembic] # path to migration scripts script_location = %(here)s/alembic # template used to generate migration files # file_template = %%(rev)s_%%(slug)s # max length of characters to apply to the # "slug" field #truncate_slug_length = 40 # set to 'true' to run the environment during # the 'revision' command, regardless of autogenerate # revision_environment = false #sqlalchemy.url = driver://user:pass@localhost/dbname # Logging configuration [loggers] keys = root,sqlalchemy,alembic [handlers] keys = console [formatters] keys = generic [logger_root] level = WARN handlers = console qualname = [logger_sqlalchemy] level = WARN handlers = qualname = sqlalchemy.engine [logger_alembic] level = INFO handlers = qualname = alembic [handler_console] class = StreamHandler args = (sys.stderr,) level = NOTSET formatter = generic [formatter_generic] format = %(levelname)-5.5s [%(name)s] %(message)s datefmt = %H:%M:%S ironic-2014.1.rc1/ironic/db/sqlalchemy/migration.py0000664000175300017540000000536712316614116023276 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # 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 import alembic from alembic import config as alembic_config import alembic.migration as alembic_migration from ironic.db.sqlalchemy import api as sqla_api def _alembic_config(): path = os.path.join(os.path.dirname(__file__), 'alembic.ini') config = alembic_config.Config(path) return config def version(config=None): """Current database version. :returns: Database version :rtype: string """ engine = sqla_api.get_engine() with engine.connect() as conn: context = alembic_migration.MigrationContext.configure(conn) return context.get_current_revision() def upgrade(revision, config=None): """Used for upgrading database. :param version: Desired database version :type version: string """ revision = revision or 'head' config = config or _alembic_config() alembic.command.upgrade(config, revision or 'head') def downgrade(revision, config=None): """Used for downgrading database. :param version: Desired database version :type version: string """ revision = revision or 'base' config = config or _alembic_config() return alembic.command.downgrade(config, revision) def stamp(revision, config=None): """Stamps database with provided revision. Dont run any migrations. :param revision: Should match one from repository or head - to stamp database with most recent revision :type revision: string """ config = config or _alembic_config() return alembic.command.stamp(config, revision=revision) def revision(message=None, autogenerate=False, config=None): """Creates template for migration. :param message: Text that will be used for migration title :type message: string :param autogenerate: If True - generates diff based on current database state :type autogenerate: bool """ config = config or _alembic_config() return alembic.command.revision(config, message=message, autogenerate=autogenerate) ironic-2014.1.rc1/ironic/db/sqlalchemy/models.py0000664000175300017540000001270612316614116022563 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright 2013 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. """ SQLAlchemy models for baremetal data. """ import json from oslo.config import cfg import six.moves.urllib.parse as urlparse from sqlalchemy import Boolean, Column, DateTime from sqlalchemy import ForeignKey, Integer, Index from sqlalchemy import schema, String, Text from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.types import TypeDecorator, TEXT from ironic.openstack.common.db.sqlalchemy import models sql_opts = [ cfg.StrOpt('mysql_engine', default='InnoDB', help='MySQL engine to use.') ] cfg.CONF.register_opts(sql_opts, 'database') def table_args(): engine_name = urlparse.urlparse(cfg.CONF.database_connection).scheme if engine_name == 'mysql': return {'mysql_engine': cfg.CONF.mysql_engine, 'mysql_charset': "utf8"} return None class JsonEncodedType(TypeDecorator): """Abstract base type serialized as json-encoded string in db.""" type = None impl = TEXT def process_bind_param(self, value, dialect): if value is None: # Save default value according to current type to keep the # interface the consistent. value = self.type() elif not isinstance(value, self.type): raise TypeError("%s supposes to store %s objects, but %s given" % (self.__class__.__name__, self.type.__name__, type(value).__name__)) serialized_value = json.dumps(value) return serialized_value def process_result_value(self, value, dialect): if value is not None: value = json.loads(value) return value class JSONEncodedDict(JsonEncodedType): """Represents dict serialized as json-encoded string in db.""" type = dict class JSONEncodedList(JsonEncodedType): """Represents list serialized as json-encoded string in db.""" type = list class IronicBase(models.TimestampMixin, models.ModelBase): metadata = None def as_dict(self): d = {} for c in self.__table__.columns: d[c.name] = self[c.name] return d def save(self, session=None): import ironic.db.sqlalchemy.api as db_api if session is None: session = db_api.get_session() super(IronicBase, self).save(session) Base = declarative_base(cls=IronicBase) class Chassis(Base): """Represents a hardware chassis.""" __tablename__ = 'chassis' __table_args__ = ( schema.UniqueConstraint('uuid', name='uniq_chassis0uuid'), ) id = Column(Integer, primary_key=True) uuid = Column(String(36)) extra = Column(JSONEncodedDict) description = Column(String(255), nullable=True) class Conductor(Base): """Represents a conductor service entry.""" __tablename__ = 'conductors' __table_args__ = ( schema.UniqueConstraint('hostname', name='uniq_conductors0hostname'), ) id = Column(Integer, primary_key=True) hostname = Column(String(255), nullable=False) drivers = Column(JSONEncodedList) class Node(Base): """Represents a bare metal node.""" __tablename__ = 'nodes' __table_args__ = ( schema.UniqueConstraint('uuid', name='uniq_nodes0uuid'), Index('node_instance_uuid', 'instance_uuid')) id = Column(Integer, primary_key=True) uuid = Column(String(36)) # NOTE(deva): we store instance_uuid directly on the node so that we can # filter on it more efficiently, even though it is # user-settable, and would otherwise be in node.properties. instance_uuid = Column(String(36), nullable=True) chassis_id = Column(Integer, ForeignKey('chassis.id'), nullable=True) power_state = Column(String(15), nullable=True) target_power_state = Column(String(15), nullable=True) provision_state = Column(String(15), nullable=True) target_provision_state = Column(String(15), nullable=True) provision_updated_at = Column(DateTime, nullable=True) last_error = Column(Text, nullable=True) properties = Column(JSONEncodedDict) driver = Column(String(15)) driver_info = Column(JSONEncodedDict) reservation = Column(String(255), nullable=True) maintenance = Column(Boolean, default=False) console_enabled = Column(Boolean, default=False) extra = Column(JSONEncodedDict) class Port(Base): """Represents a network port of a bare metal node.""" __tablename__ = 'ports' __table_args__ = ( schema.UniqueConstraint('address', name='uniq_ports0address'), schema.UniqueConstraint('uuid', name='uniq_ports0uuid')) id = Column(Integer, primary_key=True) uuid = Column(String(36)) address = Column(String(18)) node_id = Column(Integer, ForeignKey('nodes.id'), nullable=True) extra = Column(JSONEncodedDict) ironic-2014.1.rc1/ironic/cmd/0000775000175300017540000000000012316614636016743 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/cmd/api.py0000664000175300017540000000344412316614116020064 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """The Ironic Service API.""" import logging import sys from oslo.config import cfg from six.moves import socketserver from wsgiref import simple_server from ironic.api import app from ironic.common import service as ironic_service from ironic.openstack.common import log CONF = cfg.CONF class ThreadedSimpleServer(socketserver.ThreadingMixIn, simple_server.WSGIServer): """A Mixin class to make the API service greenthread-able.""" pass def main(): # Pase config file and command line options, then start logging ironic_service.prepare_service(sys.argv) # Build and start the WSGI app host = CONF.api.host_ip port = CONF.api.port wsgi = simple_server.make_server( host, port, app.VersionSelectorApplication(), server_class=ThreadedSimpleServer) LOG = log.getLogger(__name__) LOG.info(_("Serving on http://%(host)s:%(port)s") % {'host': host, 'port': port}) LOG.info(_("Configuration:")) CONF.log_opt_values(LOG, logging.INFO) try: wsgi.serve_forever() except KeyboardInterrupt: pass ironic-2014.1.rc1/ironic/cmd/__init__.py0000664000175300017540000000131212316614116021042 0ustar jenkinsjenkins00000000000000# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. # 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 ironic.openstack.common import gettextutils gettextutils.install('ironic') ironic-2014.1.rc1/ironic/cmd/dbsync.py0000664000175300017540000000521712316614116020575 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """ Run storage database migration. """ import sys from oslo.config import cfg from ironic.common import service from ironic.db import migration CONF = cfg.CONF class DBCommand(object): def upgrade(self): migration.upgrade(CONF.command.revision) def downgrade(self): migration.downgrade(CONF.command.revision) def revision(self): migration.revision(CONF.command.message, CONF.command.autogenerate) def stamp(self): migration.stamp(CONF.command.revision) def version(self): print(migration.version()) def add_command_parsers(subparsers): command_object = DBCommand() parser = subparsers.add_parser('upgrade') parser.set_defaults(func=command_object.upgrade) parser.add_argument('--revision', nargs='?') parser = subparsers.add_parser('downgrade') parser.set_defaults(func=command_object.downgrade) parser.add_argument('--revision', nargs='?') parser = subparsers.add_parser('stamp') parser.add_argument('--revision', nargs='?') parser.set_defaults(func=command_object.stamp) parser = subparsers.add_parser('revision') parser.add_argument('-m', '--message') parser.add_argument('--autogenerate', action='store_true') parser.set_defaults(func=command_object.revision) parser = subparsers.add_parser('version') parser.set_defaults(func=command_object.version) command_opt = cfg.SubCommandOpt('command', title='Command', help='Available commands', handler=add_command_parsers) CONF.register_cli_opt(command_opt) def main(): # this is hack to work with previous usage of ironic-dbsync # pls change it to ironic-dbsync upgrade valid_commands = set([ 'upgrade', 'downgrade', 'revision', 'version', 'stamp' ]) if not set(sys.argv) & valid_commands: sys.argv.append('upgrade') service.prepare_service(sys.argv) CONF.command.func() ironic-2014.1.rc1/ironic/cmd/conductor.py0000664000175300017540000000232412316614116021307 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """ The Ironic Management Service """ import sys from oslo.config import cfg from ironic.openstack.common import service from ironic.common import service as ironic_service CONF = cfg.CONF def main(): # Pase config file and command line options, then start logging ironic_service.prepare_service(sys.argv) mgr = ironic_service.load_manager('ironic.conductor.manager', 'ConductorManager', CONF.host) launcher = service.launch(mgr) launcher.wait() ironic-2014.1.rc1/ironic/api/0000775000175300017540000000000012316614636016751 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/api/middleware/0000775000175300017540000000000012316614636021066 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/api/middleware/auth_token.py0000664000175300017540000000410412316614116023571 0ustar jenkinsjenkins00000000000000# -*- encoding: 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 re from keystoneclient.middleware import auth_token from ironic.common import exception from ironic.common import utils from ironic.openstack.common import log LOG = log.getLogger(__name__) class AuthTokenMiddleware(auth_token.AuthProtocol): """A wrapper on Keystone auth_token middleware. Does not perform verification of authentication tokens for public routes in the API. """ def __init__(self, app, conf, public_api_routes=[]): route_pattern_tpl = '%s(\.json|\.xml)?$' try: self.public_api_routes = [re.compile(route_pattern_tpl % route_tpl) for route_tpl in public_api_routes] except re.error as e: msg = _('Cannot compile public API routes: %s') % e LOG.error(msg) raise exception.ConfigInvalid(error_msg=msg) super(AuthTokenMiddleware, self).__init__(app, conf) def __call__(self, env, start_response): path = utils.safe_rstrip(env.get('PATH_INFO'), '/') # The information whether the API call is being performed against the # public API is required for some other components. Saving it to the # WSGI environment is reasonable thereby. env['is_public_api'] = any(map(lambda pattern: re.match(pattern, path), self.public_api_routes)) if env['is_public_api']: return self.app(env, start_response) return super(AuthTokenMiddleware, self).__call__(env, start_response) ironic-2014.1.rc1/ironic/api/middleware/__init__.py0000664000175300017540000000153112316614116023170 0ustar jenkinsjenkins00000000000000# -*- encoding: 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. from ironic.api.middleware import auth_token from ironic.api.middleware import parsable_error ParsableErrorMiddleware = parsable_error.ParsableErrorMiddleware AuthTokenMiddleware = auth_token.AuthTokenMiddleware __all__ = (ParsableErrorMiddleware, AuthTokenMiddleware) ironic-2014.1.rc1/ironic/api/middleware/parsable_error.py0000664000175300017540000000721712316614116024442 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright © 2012 New Dream Network, LLC (DreamHost) # # Author: Doug Hellmann # # 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. """ Middleware to replace the plain text message body of an error response with one formatted so the client can parse it. Based on pecan.middleware.errordocument """ import json import webob from xml import etree as et from ironic.openstack.common import log LOG = log.getLogger(__name__) class ParsableErrorMiddleware(object): """Replace error body with something the client can parse. """ def __init__(self, app): self.app = app def __call__(self, environ, start_response): # Request for this state, modified by replace_start_response() # and used when an error is being reported. state = {} def replacement_start_response(status, headers, exc_info=None): """Overrides the default response to make errors parsable. """ try: status_code = int(status.split(' ')[0]) state['status_code'] = status_code except (ValueError, TypeError): # pragma: nocover raise Exception(_( 'ErrorDocumentMiddleware received an invalid ' 'status %s') % status) else: if (state['status_code'] // 100) not in (2, 3): # Remove some headers so we can replace them later # when we have the full error message and can # compute the length. headers = [(h, v) for (h, v) in headers if h not in ('Content-Length', 'Content-Type') ] # Save the headers in case we need to modify them. state['headers'] = headers return start_response(status, headers, exc_info) app_iter = self.app(environ, replacement_start_response) if (state['status_code'] // 100) not in (2, 3): req = webob.Request(environ) if (req.accept.best_match(['application/json', 'application/xml']) == 'application/xml'): try: # simple check xml is valid body = [et.ElementTree.tostring( et.ElementTree.fromstring('' + '\n'.join(app_iter) + ''))] except et.ElementTree.ParseError as err: LOG.error(_('Error parsing HTTP response: %s') % err) body = ['%s' % state['status_code'] + ''] state['headers'].append(('Content-Type', 'application/xml')) else: body = [json.dumps({'error_message': '\n'.join(app_iter)})] state['headers'].append(('Content-Type', 'application/json')) state['headers'].append(('Content-Length', len(body[0]))) else: body = app_iter return body ironic-2014.1.rc1/ironic/api/hooks.py0000664000175300017540000001224512316614116020443 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright © 2012 New Dream Network, LLC (DreamHost) # # Author: Doug Hellmann # # 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 pecan import hooks from webob import exc from ironic.common import context from ironic.conductor import rpcapi from ironic.db import api as dbapi from ironic.openstack.common import policy class ConfigHook(hooks.PecanHook): """Attach the config object to the request so controllers can get to it.""" def before(self, state): state.request.cfg = cfg.CONF class DBHook(hooks.PecanHook): """Attach the dbapi object to the request so controllers can get to it.""" def before(self, state): state.request.dbapi = dbapi.get_instance() class ContextHook(hooks.PecanHook): """Configures a request context and attaches it to the request. The following HTTP request headers are used: X-User-Id or X-User: Used for context.user_id. X-Tenant-Id or X-Tenant: Used for context.tenant. X-Auth-Token: Used for context.auth_token. X-Roles: Used for setting context.is_admin flag to either True or False. The flag is set to True, if X-Roles contains either an administrator or admin substring. Otherwise it is set to False. """ def __init__(self, public_api_routes): self.public_api_routes = public_api_routes super(ContextHook, self).__init__() def before(self, state): user_id = state.request.headers.get('X-User-Id') user_id = state.request.headers.get('X-User', user_id) tenant = state.request.headers.get('X-Tenant-Id') tenant = state.request.headers.get('X-Tenant', tenant) domain_id = state.request.headers.get('X-User-Domain-Id') domain_name = state.request.headers.get('X-User-Domain-Name') auth_token = state.request.headers.get('X-Auth-Token') creds = {'roles': state.request.headers.get('X-Roles', '').split(',')} is_public_api = state.request.environ.get('is_public_api', False) is_admin = policy.check('admin', state.request.headers, creds) state.request.context = context.RequestContext( auth_token=auth_token, user=user_id, tenant=tenant, domain_id=domain_id, domain_name=domain_name, is_admin=is_admin, is_public_api=is_public_api) class RPCHook(hooks.PecanHook): """Attach the rpcapi object to the request so controllers can get to it.""" def before(self, state): state.request.rpcapi = rpcapi.ConductorAPI() class AdminAuthHook(hooks.PecanHook): """Verify that the user has admin rights. Checks whether the request context is an admin context and rejects the request otherwise. """ def before(self, state): ctx = state.request.context is_admin_api = policy.check('admin_api', {}, ctx.to_dict()) if not is_admin_api and not ctx.is_public_api: raise exc.HTTPForbidden() class NoExceptionTracebackHook(hooks.PecanHook): """Workaround rpc.common: deserialize_remote_exception. deserialize_remote_exception builds rpc exception traceback into error message which is then sent to the client. Such behavior is a security concern so this hook is aimed to cut-off traceback from the error message. """ # NOTE(max_lobur): 'after' hook used instead of 'on_error' because # 'on_error' never fired for wsme+pecan pair. wsme @wsexpose decorator # catches and handles all the errors, so 'on_error' dedicated for unhandled # exceptions never fired. def after(self, state): # Omit empty body. Some errors may not have body at this level yet. if not state.response.body: return # Do nothing if there is no error. if 200 <= state.response.status_int < 400: return json_body = state.response.json # Do not remove traceback when server in debug mode (except 'Server' # errors when 'debuginfo' will be used for traces). if cfg.CONF.debug and json_body.get('faultcode') != 'Server': return faultsting = json_body.get('faultstring') traceback_marker = 'Traceback (most recent call last):' if faultsting and (traceback_marker in faultsting): # Cut-off traceback. faultsting = faultsting.split(traceback_marker, 1)[0] # Remove trailing newlines and spaces if any. json_body['faultstring'] = faultsting.rstrip() # Replace the whole json. Cannot change original one beacause it's # generated on the fly. state.response.json = json_body ironic-2014.1.rc1/ironic/api/acl.py0000664000175300017540000000342712316614116020061 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright © 2012 New Dream Network, LLC (DreamHost) # # Author: Doug Hellmann # # 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. """Access Control Lists (ACL's) control access the API server.""" from keystoneclient.middleware import auth_token as keystone_auth_token from oslo.config import cfg from ironic.api.middleware import auth_token OPT_GROUP_NAME = 'keystone_authtoken' def register_opts(conf): """Register keystoneclient middleware options :param conf: Ironic settings. """ conf.register_opts(keystone_auth_token.opts, group=OPT_GROUP_NAME) keystone_auth_token.CONF = conf def install(app, conf, public_routes): """Install ACL check on application. :param app: A WSGI applicatin. :param conf: Settings. Must include OPT_GROUP_NAME section. :param public_routes: The list of the routes which will be allowed to access without authentication. :return: The same WSGI application with ACL installed. """ register_opts(cfg.CONF) keystone_config = dict(conf.get(OPT_GROUP_NAME)) return auth_token.AuthTokenMiddleware(app, conf=keystone_config, public_api_routes=public_routes) ironic-2014.1.rc1/ironic/api/controllers/0000775000175300017540000000000012316614636021317 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/api/controllers/root.py0000664000175300017540000000560512316614116022653 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright © 2012 New Dream Network, LLC (DreamHost) # # Author: Doug Hellmann # # 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 pecan from pecan import rest from wsme import types as wtypes import wsmeext.pecan as wsme_pecan from ironic.api.controllers import base from ironic.api.controllers import link from ironic.api.controllers import v1 class Version(base.APIBase): """An API version representation.""" id = wtypes.text "The ID of the version, also acts as the release number" links = [link.Link] "A Link that point to a specific version of the API" @classmethod def convert(self, id): version = Version() version.id = id version.links = [link.Link.make_link('self', pecan.request.host_url, id, '', bookmark=True)] return version class Root(base.APIBase): name = wtypes.text "The name of the API" description = wtypes.text "Some information about this API" versions = [Version] "Links to all the versions available in this API" default_version = Version "A link to the default version of the API" @classmethod def convert(self): root = Root() root.name = "OpenStack Ironic API" root.description = ("Ironic is an OpenStack project which aims to " "provision baremetal machines.") root.versions = [Version.convert('v1')] root.default_version = Version.convert('v1') return root class RootController(rest.RestController): _versions = ['v1'] "All supported API versions" _default_version = 'v1' "The default API version" v1 = v1.Controller() @wsme_pecan.wsexpose(Root) def get(self): # NOTE: The reason why convert() it's being called for every # request is because we need to get the host url from # the request object to make the links. return Root.convert() @pecan.expose() def _route(self, args): """Overrides the default routing behavior. It redirects the request to the default version of the ironic API if the version number is not specified in the url. """ if args[0] and args[0] not in self._versions: args = [self._default_version] + args return super(RootController, self)._route(args) ironic-2014.1.rc1/ironic/api/controllers/base.py0000664000175300017540000000303412316614116022574 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 datetime import wsme from wsme import types as wtypes class APIBase(wtypes.Base): created_at = wsme.wsattr(datetime.datetime, readonly=True) "The time in UTC at which the object is created" updated_at = wsme.wsattr(datetime.datetime, readonly=True) "The time in UTC at which the object is updated" def as_dict(self): """Render this object as a dict of its fields.""" return dict((k, getattr(self, k)) for k in self.fields if hasattr(self, k) and getattr(self, k) != wsme.Unset) def unset_fields_except(self, except_list=None): """Unset fields so they don't appear in the message body. :param except_list: A list of fields that won't be touched. """ if except_list is None: except_list = [] for k in self.as_dict(): if k not in except_list: setattr(self, k, wsme.Unset) ironic-2014.1.rc1/ironic/api/controllers/link.py0000664000175300017540000000273712316614116022630 0ustar jenkinsjenkins00000000000000# Copyright 2013 Red Hat, Inc. # 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 wsme import types as wtypes from ironic.api.controllers import base class Link(base.APIBase): """A link representation.""" href = wtypes.text "The url of a link." rel = wtypes.text "The name of a link." type = wtypes.text "Indicates the type of document/link." @classmethod def make_link(cls, rel_name, url, resource, resource_args, bookmark=False, type=wtypes.Unset): template = '%s/%s' if bookmark else '%s/v1/%s' # FIXME(lucasagomes): I'm getting a 404 when doing a GET on # a nested resource that the URL ends with a '/'. # https://groups.google.com/forum/#!topic/pecan-dev/QfSeviLg5qs template += '%s' if resource_args.startswith('?') else '/%s' return Link(href=(template) % (url, resource, resource_args), rel=rel_name, type=type) ironic-2014.1.rc1/ironic/api/controllers/__init__.py0000664000175300017540000000000012316614116023407 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/api/controllers/v1/0000775000175300017540000000000012316614636021645 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/api/controllers/v1/types.py0000664000175300017540000001244512316614116023362 0ustar jenkinsjenkins00000000000000# coding: utf-8 # # Copyright 2013 Red Hat, Inc. # 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 wsme from wsme import types as wtypes from ironic.common import exception from ironic.common import utils from ironic.openstack.common import strutils class MacAddressType(wtypes.UserType): """A simple MAC address type.""" basetype = wtypes.text name = 'macaddress' @staticmethod def validate(value): return utils.validate_and_normalize_mac(value) @staticmethod def frombasetype(value): return MacAddressType.validate(value) class UuidType(wtypes.UserType): """A simple UUID type.""" basetype = wtypes.text name = 'uuid' # FIXME(lucasagomes): When used with wsexpose decorator WSME will try # to get the name of the type by accessing it's __name__ attribute. # Remove this __name__ attribute once it's fixed in WSME. # https://bugs.launchpad.net/wsme/+bug/1265590 __name__ = name @staticmethod def validate(value): if not utils.is_uuid_like(value): raise exception.InvalidUUID(uuid=value) return value @staticmethod def frombasetype(value): if value is None: return None return UuidType.validate(value) class BooleanType(wtypes.UserType): """A simple boolean type.""" basetype = wtypes.text name = 'boolean' # FIXME(lucasagomes): When used with wsexpose decorator WSME will try # to get the name of the type by accessing it's __name__ attribute. # Remove this __name__ attribute once it's fixed in WSME. # https://bugs.launchpad.net/wsme/+bug/1265590 __name__ = name @staticmethod def validate(value): try: return strutils.bool_from_string(value, strict=True) except ValueError as e: # raise Invalid to return 400 (BadRequest) in the API raise exception.Invalid(e) @staticmethod def frombasetype(value): if value is None: return None return BooleanType.validate(value) macaddress = MacAddressType() uuid = UuidType() boolean = BooleanType() class JsonPatchType(wtypes.Base): """A complex type that represents a single json-patch operation.""" path = wtypes.wsattr(wtypes.StringType(pattern='^(/[\w-]+)+$'), mandatory=True) op = wtypes.wsattr(wtypes.Enum(str, 'add', 'replace', 'remove'), mandatory=True) value = wtypes.text @staticmethod def internal_attrs(): """Returns a list of internal attributes. Internal attributes can't be added, replaced or removed. This method may be overwritten by derived class. """ return ['/created_at', '/id', '/links', '/updated_at', '/uuid'] @staticmethod def mandatory_attrs(): """Retruns a list of mandatory attributes. Mandatory attributes can't be removed from the document. This method should be overwritten by derived class. """ return [] @staticmethod def validate(patch): if patch.path in patch.internal_attrs(): msg = _("'%s' is an internal attribute and can not be updated") raise wsme.exc.ClientSideError(msg % patch.path) if patch.path in patch.mandatory_attrs() and patch.op == 'remove': msg = _("'%s' is a mandatory attribute and can not be removed") raise wsme.exc.ClientSideError(msg % patch.path) if patch.op == 'add': if patch.path.count('/') == 1: msg = _('Adding a new attribute (%s) to the root of ' ' the resource is not allowed') raise wsme.exc.ClientSideError(msg % patch.path) if patch.op != 'remove': if not patch.value: msg = _("'add' and 'replace' operations needs value") raise wsme.exc.ClientSideError(msg) ret = {'path': patch.path, 'op': patch.op} if patch.value: ret['value'] = patch.value return ret class MultiType(wtypes.UserType): """A complex type that represents one or more types. Used for validating that a value is an instance of one of the types. :param *types: Variable-length list of types. """ def __init__(self, *types): self.types = types def __str__(self): return ' | '.join(map(str, self.types)) def validate(self, value): for t in self.types: if t is wsme.types.text and isinstance(value, wsme.types.bytes): value = value.decode() if isinstance(value, t): return value else: raise ValueError( _("Wrong type. Expected '%(type)s', got '%(value)s'") % {'type': self.types, 'value': type(value)}) ironic-2014.1.rc1/ironic/api/controllers/v1/driver.py0000664000175300017540000000715412316614116023512 0ustar jenkinsjenkins00000000000000# Copyright 2013 Red Hat, Inc. # 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 pecan from pecan import rest import wsme from wsme import types as wtypes import wsmeext.pecan as wsme_pecan from ironic.api.controllers import base from ironic.api.controllers import link from ironic.common import exception class Driver(base.APIBase): """API representation of a driver.""" name = wtypes.text "The name of the driver" hosts = [wtypes.text] "A list of active conductors that support this driver" links = wsme.wsattr([link.Link], readonly=True) "A list containing self and bookmark links" @classmethod def convert_with_links(cls, name, hosts): driver = Driver() driver.name = name driver.hosts = hosts driver.links = [ link.Link.make_link('self', pecan.request.host_url, 'drivers', name), link.Link.make_link('bookmark', pecan.request.host_url, 'drivers', name, bookmark=True) ] return driver @classmethod def sample(cls): sample = cls(name="sample-driver", hosts=["fake-host"]) return sample class DriverList(base.APIBase): """API representation of a list of drivers.""" drivers = [Driver] "A list containing drivers objects" @classmethod def convert_with_links(cls, drivers): collection = DriverList() collection.drivers = [ Driver.convert_with_links(dname, list(drivers[dname])) for dname in drivers] return collection @classmethod def sample(cls): sample = cls() sample.drivers = [Driver.sample()] return sample class DriversController(rest.RestController): """REST controller for Drivers.""" @wsme_pecan.wsexpose(DriverList) def get_all(self): """Retrieve a list of drivers. """ # FIXME(deva): formatting of the auto-generated REST API docs # will break from a single-line doc string. # This is a result of a bug in sphinxcontrib-pecanwsme # https://github.com/dreamhost/sphinxcontrib-pecanwsme/issues/8 driver_list = pecan.request.dbapi.get_active_driver_dict() return DriverList.convert_with_links(driver_list) @wsme_pecan.wsexpose(Driver, wtypes.text) def get_one(self, driver_name): """Retrieve a single driver. """ # NOTE(russell_h): There is no way to make this more efficient than # retrieving a list of drivers using the current sqlalchemy schema, but # this path must be exposed for Pecan to route any paths we might # choose to expose below it. driver_dict = pecan.request.dbapi.get_active_driver_dict() for name, hosts in driver_dict.iteritems(): if name == driver_name: return Driver.convert_with_links(name, list(hosts)) raise exception.DriverNotFound(driver_name=driver_name) ironic-2014.1.rc1/ironic/api/controllers/v1/utils.py0000664000175300017540000000250112316614116023346 0ustar jenkinsjenkins00000000000000# Copyright 2013 Red Hat, Inc. # 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 jsonpatch import wsme from oslo.config import cfg CONF = cfg.CONF JSONPATCH_EXCEPTIONS = (jsonpatch.JsonPatchException, jsonpatch.JsonPointerException, KeyError) def validate_limit(limit): if limit and limit < 0: raise wsme.exc.ClientSideError(_("Limit must be positive")) return min(CONF.api.max_limit, limit) or CONF.api.max_limit def validate_sort_dir(sort_dir): if sort_dir not in ['asc', 'desc']: raise wsme.exc.ClientSideError(_("Invalid sort direction: %s. " "Acceptable values are " "'asc' or 'desc'") % sort_dir) return sort_dir ironic-2014.1.rc1/ironic/api/controllers/v1/state.py0000664000175300017540000000205312316614116023330 0ustar jenkinsjenkins00000000000000# Copyright 2013 Red Hat, Inc. # 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 wsme import types as wtypes from ironic.api.controllers import base from ironic.api.controllers import link class State(base.APIBase): current = wtypes.text "The current state" target = wtypes.text "The user modified desired state" available = [wtypes.text] "A list of available states it is able to transition to" links = [link.Link] "A list containing a self link and associated state links" ironic-2014.1.rc1/ironic/api/controllers/v1/node.py0000664000175300017540000006721412316614116023147 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 datetime import jsonpatch from oslo.config import cfg import pecan from pecan import rest import six import wsme from wsme import types as wtypes import wsmeext.pecan as wsme_pecan from ironic.api.controllers import base from ironic.api.controllers import link from ironic.api.controllers.v1 import collection from ironic.api.controllers.v1 import port from ironic.api.controllers.v1 import types from ironic.api.controllers.v1 import utils as api_utils from ironic.common import exception from ironic.common import states as ir_states from ironic.common import utils from ironic import objects CONF = cfg.CONF CONF.import_opt('heartbeat_timeout', 'ironic.conductor.manager', group='conductor') class NodePatchType(types.JsonPatchType): @staticmethod def internal_attrs(): defaults = types.JsonPatchType.internal_attrs() return defaults + ['/console_enabled', '/last_error', '/power_state', '/provision_state', '/reservation', '/target_power_state', '/target_provision_state', '/provision_updated_at'] @staticmethod def mandatory_attrs(): return ['/chassis_uuid', '/driver'] class NodeConsoleController(rest.RestController): @wsme_pecan.wsexpose(wtypes.text, types.uuid) def get(self, node_uuid): """Get connection information about the console. :param node_uuid: UUID of a node. """ rpc_node = objects.Node.get_by_uuid(pecan.request.context, node_uuid) topic = pecan.request.rpcapi.get_topic_for(rpc_node) return pecan.request.rpcapi.get_console_information( pecan.request.context, node_uuid, topic) @wsme_pecan.wsexpose(None, types.uuid, types.boolean, status_code=202) def put(self, node_uuid, enabled): """Start and stop the node console. :param node_uuid: UUID of a node. :param enabled: Boolean value; whether the console is enabled or disabled. """ rpc_node = objects.Node.get_by_uuid(pecan.request.context, node_uuid) topic = pecan.request.rpcapi.get_topic_for(rpc_node) pecan.request.rpcapi.set_console_mode(pecan.request.context, node_uuid, enabled, topic) class NodeStates(base.APIBase): """API representation of the states of a node.""" console_enabled = types.boolean power_state = wtypes.text provision_state = wtypes.text provision_updated_at = datetime.datetime target_power_state = wtypes.text target_provision_state = wtypes.text last_error = wtypes.text @classmethod def convert(cls, rpc_node): attr_list = ['console_enabled', 'last_error', 'power_state', 'provision_state', 'target_power_state', 'target_provision_state', 'provision_updated_at'] states = NodeStates() for attr in attr_list: setattr(states, attr, getattr(rpc_node, attr)) return states @classmethod def sample(cls): sample = cls(target_power_state=ir_states.POWER_ON, target_provision_state=ir_states.ACTIVE, last_error=None, console_enabled=False, provision_updated_at=None, power_state=ir_states.POWER_ON, provision_state=None) return sample class NodeStatesController(rest.RestController): _custom_actions = { 'power': ['PUT'], 'provision': ['PUT'], } console = NodeConsoleController() "Expose console as a sub-element of states" @wsme_pecan.wsexpose(NodeStates, types.uuid) def get(self, node_uuid): """List the states of the node. :param node_uuid: UUID of a node. """ # NOTE(lucasagomes): All these state values come from the # DB. Ironic counts with a periodic task that verify the current # power states of the nodes and update the DB accordingly. rpc_node = objects.Node.get_by_uuid(pecan.request.context, node_uuid) return NodeStates.convert(rpc_node) @wsme_pecan.wsexpose(None, types.uuid, wtypes.text, status_code=202) def power(self, node_uuid, target): """Set the power state of the node. :param node_uuid: UUID of a node. :param target: The desired power state of the node. :raises: ClientSideError (HTTP 409) if a power operation is already in progress. :raises: InvalidStateRequested (HTTP 400) if the requested target state is not valid. """ # TODO(lucasagomes): Test if it's able to transition to the # target state from the current one rpc_node = objects.Node.get_by_uuid(pecan.request.context, node_uuid) topic = pecan.request.rpcapi.get_topic_for(rpc_node) if target not in [ir_states.POWER_ON, ir_states.POWER_OFF, ir_states.REBOOT]: raise exception.InvalidStateRequested(state=target, node=node_uuid) pecan.request.rpcapi.change_node_power_state(pecan.request.context, node_uuid, target, topic) # FIXME(lucasagomes): Currently WSME doesn't support returning # the Location header. Once it's implemented we should use the # Location to point to the /states subresource of the node so # that clients will know how to track the status of the request # https://bugs.launchpad.net/wsme/+bug/1233687 @wsme_pecan.wsexpose(None, types.uuid, wtypes.text, status_code=202) def provision(self, node_uuid, target): """Asynchronous trigger the provisioning of the node. This will set the target provision state of the node, and a background task will begin which actually applies the state change. This call will return a 202 (Accepted) indicating the request was accepted and is in progress; the client should continue to GET the status of this node to observe the status of the requested action. :param node_uuid: UUID of a node. :param target: The desired provision state of the node. :raises: ClientSideError (HTTP 409) if the node is already being provisioned. :raises: ClientSideError (HTTP 400) if the node is already in the requested state. :raises: InvalidStateRequested (HTTP 400) if the requested target state is not valid. """ rpc_node = objects.Node.get_by_uuid(pecan.request.context, node_uuid) topic = pecan.request.rpcapi.get_topic_for(rpc_node) if target == rpc_node.provision_state: msg = (_("Node %(node)s is already in the '%(state)s' state.") % {'node': rpc_node['uuid'], 'state': target}) raise wsme.exc.ClientSideError(msg, status_code=400) if target == ir_states.ACTIVE: processing = rpc_node.target_provision_state is not None elif target == ir_states.DELETED: processing = (rpc_node.target_provision_state is not None and rpc_node.provision_state != ir_states.DEPLOYWAIT) else: raise exception.InvalidStateRequested(state=target, node=node_uuid) if processing: msg = (_('Node %s is already being provisioned or decommissioned.') % rpc_node.uuid) raise wsme.exc.ClientSideError(msg, status_code=409) # Conflict # Note that there is a race condition. The node state(s) could change # by the time the RPC call is made and the TaskManager manager gets a # lock. if target == ir_states.ACTIVE: pecan.request.rpcapi.do_node_deploy( pecan.request.context, node_uuid, topic) elif target == ir_states.DELETED: pecan.request.rpcapi.do_node_tear_down( pecan.request.context, node_uuid, topic) # FIXME(lucasagomes): Currently WSME doesn't support returning # the Location header. Once it's implemented we should use the # Location to point to the /states subresource of this node so # that clients will know how to track the status of the request # https://bugs.launchpad.net/wsme/+bug/1233687 class Node(base.APIBase): """API representation of a bare metal node. This class enforces type checking and value constraints, and converts between the internal object model and the API representation of a node. """ _chassis_uuid = None def _get_chassis_uuid(self): return self._chassis_uuid def _set_chassis_uuid(self, value): if value and self._chassis_uuid != value: try: chassis = objects.Chassis.get_by_uuid(pecan.request.context, value) self._chassis_uuid = chassis.uuid # NOTE(lucasagomes): Create the chassis_id attribute on-the-fly # to satisfy the api -> rpc object # conversion. self.chassis_id = chassis.id except exception.ChassisNotFound as e: # Change error code because 404 (NotFound) is inappropriate # response for a POST request to create a Port e.code = 400 # BadRequest raise e elif value == wtypes.Unset: self._chassis_uuid = wtypes.Unset uuid = types.uuid "Unique UUID for this node" instance_uuid = types.uuid "The UUID of the instance in nova-compute" power_state = wsme.wsattr(wtypes.text, readonly=True) "Represent the current (not transition) power state of the node" target_power_state = wsme.wsattr(wtypes.text, readonly=True) "The user modified desired power state of the node." last_error = wsme.wsattr(wtypes.text, readonly=True) "Any error from the most recent (last) asynchronous transaction that" "started but failed to finish." provision_state = wsme.wsattr(wtypes.text, readonly=True) "Represent the current (not transition) provision state of the node" reservation = wsme.wsattr(wtypes.text, readonly=True) "The hostname of the conductor that holds an exclusive lock on the node." provision_updated_at = datetime.datetime "The UTC date and time of the last provision state change" maintenance = types.boolean "Indicates whether the node is in maintenance mode." target_provision_state = wsme.wsattr(wtypes.text, readonly=True) "The user modified desired provision state of the node." console_enabled = types.boolean "Indicates whether the console access is enabled or disabled on the node." driver = wsme.wsattr(wtypes.text, mandatory=True) "The driver responsible for controlling the node" driver_info = {wtypes.text: types.MultiType(wtypes.text, six.integer_types)} "This node's driver configuration" extra = {wtypes.text: types.MultiType(wtypes.text, six.integer_types)} "This node's meta data" # NOTE: properties should use a class to enforce required properties # current list: arch, cpus, disk, ram, image properties = {wtypes.text: types.MultiType(wtypes.text, six.integer_types)} "The physical characteristics of this node" chassis_uuid = wsme.wsproperty(types.uuid, _get_chassis_uuid, _set_chassis_uuid) "The UUID of the chassis this node belongs" links = wsme.wsattr([link.Link], readonly=True) "A list containing a self link and associated node links" ports = wsme.wsattr([link.Link], readonly=True) "Links to the collection of ports on this node" def __init__(self, **kwargs): self.fields = objects.Node.fields.keys() for k in self.fields: setattr(self, k, kwargs.get(k)) # NOTE(lucasagomes): chassis_uuid is not part of objects.Node.fields # because it's an API-only attribute self.fields.append('chassis_uuid') setattr(self, 'chassis_uuid', kwargs.get('chassis_id')) @classmethod def _convert_with_links(cls, node, url, expand=True): if not expand: except_list = ['instance_uuid', 'power_state', 'provision_state', 'uuid'] node.unset_fields_except(except_list) else: node.ports = [link.Link.make_link('self', url, 'nodes', node.uuid + "/ports"), link.Link.make_link('bookmark', url, 'nodes', node.uuid + "/ports", bookmark=True) ] # NOTE(lucasagomes): The numeric ID should not be exposed to # the user, it's internal only. node.chassis_id = wtypes.Unset node.links = [link.Link.make_link('self', url, 'nodes', node.uuid), link.Link.make_link('bookmark', url, 'nodes', node.uuid, bookmark=True) ] return node @classmethod def convert_with_links(cls, rpc_node, expand=True): node = Node(**rpc_node.as_dict()) return cls._convert_with_links(node, pecan.request.host_url, expand) @classmethod def sample(cls, expand=True): time = datetime.datetime(2000, 1, 1, 12, 0, 0) node_uuid = '1be26c0b-03f2-4d2e-ae87-c02d7f33c123' instance_uuid = 'dcf1fbc5-93fc-4596-9395-b80572f6267b' sample = cls(uuid=node_uuid, instance_uuid=instance_uuid, power_state=ir_states.POWER_ON, target_power_state=ir_states.NOSTATE, last_error=None, provision_state=ir_states.ACTIVE, target_provision_state=ir_states.NOSTATE, reservation=None, driver='fake', driver_info={}, extra={}, properties={'memory_mb': '1024', 'local_gb': '10', 'cpus': '1'}, updated_at=time, created_at=time, provision_updated_at=time) # NOTE(matty_dubs): The chassis_uuid getter() is based on the # _chassis_uuid variable: sample._chassis_uuid = 'edcad704-b2da-41d5-96d9-afd580ecfa12' return cls._convert_with_links(sample, 'http://localhost:6385', expand) class NodeCollection(collection.Collection): """API representation of a collection of nodes.""" nodes = [Node] "A list containing nodes objects" def __init__(self, **kwargs): self._type = 'nodes' @classmethod def convert_with_links(cls, nodes, limit, url=None, expand=False, **kwargs): collection = NodeCollection() collection.nodes = [Node.convert_with_links(n, expand) for n in nodes] collection.next = collection.get_next(limit, url=url, **kwargs) return collection @classmethod def sample(cls): sample = cls() node = Node.sample(expand=False) sample.nodes = [node] return sample class NodeVendorPassthruController(rest.RestController): """REST controller for VendorPassthru. This controller allow vendors to expose a custom functionality in the Ironic API. Ironic will merely relay the message from here to the appropriate driver, no introspection will be made in the message body. """ @wsme_pecan.wsexpose(wtypes.text, types.uuid, wtypes.text, body=wtypes.text, status_code=202) def post(self, node_uuid, method, data): """Call a vendor extension. :param node_uuid: UUID of a node. :param method: name of the method in vendor driver. :param data: body of data to supply to the specified method. """ # Raise an exception if node is not found rpc_node = objects.Node.get_by_uuid(pecan.request.context, node_uuid) topic = pecan.request.rpcapi.get_topic_for(rpc_node) # Raise an exception if method is not specified if not method: raise wsme.exc.ClientSideError(_("Method not specified")) return pecan.request.rpcapi.vendor_passthru( pecan.request.context, node_uuid, method, data, topic) class NodesController(rest.RestController): """REST controller for Nodes.""" states = NodeStatesController() "Expose the state controller action as a sub-element of nodes" vendor_passthru = NodeVendorPassthruController() "A resource used for vendors to expose a custom functionality in the API" ports = port.PortsController(from_nodes=True) "Expose ports as a sub-element of nodes" _custom_actions = { 'detail': ['GET'], 'validate': ['GET'], } def __init__(self, from_chassis=False): self._from_chassis = from_chassis def _get_nodes_collection(self, chassis_uuid, instance_uuid, associated, maintenance, marker, limit, sort_key, sort_dir, expand=False, resource_url=None): if self._from_chassis and not chassis_uuid: raise exception.InvalidParameterValue(_( "Chassis id not specified.")) limit = api_utils.validate_limit(limit) sort_dir = api_utils.validate_sort_dir(sort_dir) marker_obj = None if marker: marker_obj = objects.Node.get_by_uuid(pecan.request.context, marker) if instance_uuid: nodes = self._get_nodes_by_instance(instance_uuid) else: filters = {} if chassis_uuid: filters['chassis_uuid'] = chassis_uuid if associated is not None: filters['associated'] = associated if maintenance is not None: filters['maintenance'] = maintenance nodes = pecan.request.dbapi.get_node_list(filters, limit, marker_obj, sort_key=sort_key, sort_dir=sort_dir) parameters = {'sort_key': sort_key, 'sort_dir': sort_dir} if associated: parameters['associated'] = associated if maintenance: parameters['maintenance'] = maintenance return NodeCollection.convert_with_links(nodes, limit, url=resource_url, expand=expand, **parameters) def _get_nodes_by_instance(self, instance_uuid): """Retrieve a node by its instance uuid. It returns a list with the node, or an empty list if no node is found. """ try: node = pecan.request.dbapi.get_node_by_instance(instance_uuid) return [node] except exception.InstanceNotFound: return [] @wsme_pecan.wsexpose(NodeCollection, types.uuid, types.uuid, types.boolean, types.boolean, types.uuid, int, wtypes.text, wtypes.text) def get_all(self, chassis_uuid=None, instance_uuid=None, associated=None, maintenance=None, marker=None, limit=None, sort_key='id', sort_dir='asc'): """Retrieve a list of nodes. :param chassis_uuid: Optional UUID of a chassis, to get only nodes for that chassis. :param instance_uuid: Optional UUID of an instance, to find the node associated with that instance. :param associated: Optional boolean whether to return a list of associated or unassociated nodes. May be combined with other parameters. :param maintenance: Optional boolean value that indicates whether to get nodes in maintenance mode ("True"), or not in maintenance mode ("False"). :param marker: pagination marker for large data sets. :param limit: maximum number of resources to return in a single result. :param sort_key: column to sort results by. Default: id. :param sort_dir: direction to sort. "asc" or "desc". Default: asc. """ return self._get_nodes_collection(chassis_uuid, instance_uuid, associated, maintenance, marker, limit, sort_key, sort_dir) @wsme_pecan.wsexpose(NodeCollection, types.uuid, types.uuid, types.boolean, types.boolean, types.uuid, int, wtypes.text, wtypes.text) def detail(self, chassis_uuid=None, instance_uuid=None, associated=None, maintenance=None, marker=None, limit=None, sort_key='id', sort_dir='asc'): """Retrieve a list of nodes with detail. :param chassis_uuid: Optional UUID of a chassis, to get only nodes for that chassis. :param instance_uuid: Optional UUID of an instance, to find the node associated with that instance. :param associated: Optional boolean whether to return a list of associated or unassociated nodes. May be combined with other parameters. :param maintenance: Optional boolean value that indicates whether to get nodes in maintenance mode ("True"), or not in maintenance mode ("False"). :param marker: pagination marker for large data sets. :param limit: maximum number of resources to return in a single result. :param sort_key: column to sort results by. Default: id. :param sort_dir: direction to sort. "asc" or "desc". Default: asc. """ # /detail should only work agaist collections parent = pecan.request.path.split('/')[:-1][-1] if parent != "nodes": raise exception.HTTPNotFound expand = True resource_url = '/'.join(['nodes', 'detail']) return self._get_nodes_collection(chassis_uuid, instance_uuid, associated, maintenance, marker, limit, sort_key, sort_dir, expand, resource_url) @wsme_pecan.wsexpose(wtypes.text, types.uuid) def validate(self, node_uuid): """Validate the driver interfaces.""" # check if node exists rpc_node = objects.Node.get_by_uuid(pecan.request.context, node_uuid) topic = pecan.request.rpcapi.get_topic_for(rpc_node) return pecan.request.rpcapi.validate_driver_interfaces( pecan.request.context, rpc_node.uuid, topic) @wsme_pecan.wsexpose(Node, types.uuid) def get_one(self, node_uuid): """Retrieve information about the given node. :param node_uuid: UUID of a node. """ if self._from_chassis: raise exception.OperationNotPermitted rpc_node = objects.Node.get_by_uuid(pecan.request.context, node_uuid) return Node.convert_with_links(rpc_node) @wsme_pecan.wsexpose(Node, body=Node, status_code=201) def post(self, node): """Create a new node. :param node: a node within the request body. """ if self._from_chassis: raise exception.OperationNotPermitted # NOTE(deva): get_topic_for checks if node.driver is in the hash ring # and raises NoValidHost if it is not. # We need to ensure that node has a UUID before it can # be mapped onto the hash ring. if not node.uuid: node.uuid = utils.generate_uuid() try: pecan.request.rpcapi.get_topic_for(node) except exception.NoValidHost as e: # NOTE(deva): convert from 404 to 400 because client can see # list of available drivers and shouldn't request # one that doesn't exist. e.code = 400 raise e new_node = pecan.request.dbapi.create_node(node.as_dict()) return Node.convert_with_links(new_node) @wsme.validate(types.uuid, [NodePatchType]) @wsme_pecan.wsexpose(Node, types.uuid, body=[NodePatchType]) def patch(self, node_uuid, patch): """Update an existing node. :param node_uuid: UUID of a node. :param patch: a json PATCH document to apply to this node. """ if self._from_chassis: raise exception.OperationNotPermitted rpc_node = objects.Node.get_by_uuid(pecan.request.context, node_uuid) # Check if node is transitioning state if rpc_node['target_power_state'] or \ rpc_node['target_provision_state']: msg = _("Node %s can not be updated while a state transition " "is in progress.") raise wsme.exc.ClientSideError(msg % node_uuid, status_code=409) try: node = Node(**jsonpatch.apply_patch(rpc_node.as_dict(), jsonpatch.JsonPatch(patch))) except api_utils.JSONPATCH_EXCEPTIONS as e: raise exception.PatchError(patch=patch, reason=e) # Update only the fields that have changed for field in objects.Node.fields: if rpc_node[field] != getattr(node, field): rpc_node[field] = getattr(node, field) # NOTE(deva): we calculate the rpc topic here in case node.driver # has changed, so that update is sent to the # new conductor, not the old one which may fail to # load the new driver. try: topic = pecan.request.rpcapi.get_topic_for(rpc_node) except exception.NoValidHost as e: # NOTE(deva): convert from 404 to 400 because client can see # list of available drivers and shouldn't request # one that doesn't exist. e.code = 400 raise e new_node = pecan.request.rpcapi.update_node( pecan.request.context, rpc_node, topic) return Node.convert_with_links(new_node) @wsme_pecan.wsexpose(None, types.uuid, status_code=204) def delete(self, node_uuid): """Delete a node. :param node_uuid: UUID of a node. """ if self._from_chassis: raise exception.OperationNotPermitted rpc_node = objects.Node.get_by_uuid(pecan.request.context, node_uuid) try: topic = pecan.request.rpcapi.get_topic_for(rpc_node) except exception.NoValidHost as e: e.code = 400 raise e pecan.request.rpcapi.destroy_node(pecan.request.context, node_uuid, topic) ironic-2014.1.rc1/ironic/api/controllers/v1/chassis.py0000664000175300017540000002236112316614116023651 0ustar jenkinsjenkins00000000000000# Copyright 2013 Red Hat, Inc. # 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 datetime import jsonpatch import six import pecan from pecan import rest import wsme from wsme import types as wtypes import wsmeext.pecan as wsme_pecan from ironic.api.controllers import base from ironic.api.controllers import link from ironic.api.controllers.v1 import collection from ironic.api.controllers.v1 import node from ironic.api.controllers.v1 import types from ironic.api.controllers.v1 import utils as api_utils from ironic.common import exception from ironic import objects class ChassisPatchType(types.JsonPatchType): pass class Chassis(base.APIBase): """API representation of a chassis. This class enforces type checking and value constraints, and converts between the internal object model and the API representation of a chassis. """ uuid = types.uuid "The UUID of the chassis" description = wtypes.text "The description of the chassis" extra = {wtypes.text: types.MultiType(wtypes.text, six.integer_types)} "The metadata of the chassis" links = wsme.wsattr([link.Link], readonly=True) "A list containing a self link and associated chassis links" nodes = wsme.wsattr([link.Link], readonly=True) "Links to the collection of nodes contained in this chassis" def __init__(self, **kwargs): self.fields = objects.Chassis.fields.keys() for k in self.fields: setattr(self, k, kwargs.get(k)) @classmethod def _convert_with_links(cls, chassis, url, expand=True): if not expand: chassis.unset_fields_except(['uuid', 'description']) else: chassis.nodes = [link.Link.make_link('self', url, 'chassis', chassis.uuid + "/nodes"), link.Link.make_link('bookmark', url, 'chassis', chassis.uuid + "/nodes", bookmark=True) ] chassis.links = [link.Link.make_link('self', url, 'chassis', chassis.uuid), link.Link.make_link('bookmark', url, 'chassis', chassis.uuid) ] return chassis @classmethod def convert_with_links(cls, rpc_chassis, expand=True): chassis = Chassis(**rpc_chassis.as_dict()) return cls._convert_with_links(chassis, pecan.request.host_url, expand) @classmethod def sample(cls, expand=True): time = datetime.datetime(2000, 1, 1, 12, 0, 0) sample = cls(uuid='eaaca217-e7d8-47b4-bb41-3f99f20eed89', extra={}, description='Sample chassis', created_at=time) return cls._convert_with_links(sample, 'http://localhost:6385', expand) class ChassisCollection(collection.Collection): """API representation of a collection of chassis.""" chassis = [Chassis] "A list containing chassis objects" def __init__(self, **kwargs): self._type = 'chassis' @classmethod def convert_with_links(cls, chassis, limit, url=None, expand=False, **kwargs): collection = ChassisCollection() collection.chassis = [Chassis.convert_with_links(ch, expand) for ch in chassis] url = url or None collection.next = collection.get_next(limit, url=url, **kwargs) return collection @classmethod def sample(cls, expand=True): sample = cls() sample.chassis = [Chassis.sample(expand=False)] return sample class ChassisController(rest.RestController): """REST controller for Chassis.""" nodes = node.NodesController(from_chassis=True) "Expose nodes as a sub-element of chassis" _custom_actions = { 'detail': ['GET'], } def _get_chassis_collection(self, marker, limit, sort_key, sort_dir, expand=False, resource_url=None): limit = api_utils.validate_limit(limit) sort_dir = api_utils.validate_sort_dir(sort_dir) marker_obj = None if marker: marker_obj = objects.Chassis.get_by_uuid(pecan.request.context, marker) chassis = pecan.request.dbapi.get_chassis_list(limit, marker_obj, sort_key=sort_key, sort_dir=sort_dir) return ChassisCollection.convert_with_links(chassis, limit, url=resource_url, expand=expand, sort_key=sort_key, sort_dir=sort_dir) @wsme_pecan.wsexpose(ChassisCollection, types.uuid, int, wtypes.text, wtypes.text) def get_all(self, marker=None, limit=None, sort_key='id', sort_dir='asc'): """Retrieve a list of chassis. :param marker: pagination marker for large data sets. :param limit: maximum number of resources to return in a single result. :param sort_key: column to sort results by. Default: id. :param sort_dir: direction to sort. "asc" or "desc". Default: asc. """ return self._get_chassis_collection(marker, limit, sort_key, sort_dir) @wsme_pecan.wsexpose(ChassisCollection, types.uuid, int, wtypes.text, wtypes.text) def detail(self, marker=None, limit=None, sort_key='id', sort_dir='asc'): """Retrieve a list of chassis with detail. :param marker: pagination marker for large data sets. :param limit: maximum number of resources to return in a single result. :param sort_key: column to sort results by. Default: id. :param sort_dir: direction to sort. "asc" or "desc". Default: asc. """ # /detail should only work agaist collections parent = pecan.request.path.split('/')[:-1][-1] if parent != "chassis": raise exception.HTTPNotFound expand = True resource_url = '/'.join(['chassis', 'detail']) return self._get_chassis_collection(marker, limit, sort_key, sort_dir, expand, resource_url) @wsme_pecan.wsexpose(Chassis, types.uuid) def get_one(self, chassis_uuid): """Retrieve information about the given chassis. :param chassis_uuid: UUID of a chassis. """ rpc_chassis = objects.Chassis.get_by_uuid(pecan.request.context, chassis_uuid) return Chassis.convert_with_links(rpc_chassis) @wsme_pecan.wsexpose(Chassis, body=Chassis, status_code=201) def post(self, chassis): """Create a new chassis. :param chassis: a chassis within the request body. """ new_chassis = pecan.request.dbapi.create_chassis(chassis.as_dict()) return Chassis.convert_with_links(new_chassis) @wsme.validate(types.uuid, [ChassisPatchType]) @wsme_pecan.wsexpose(Chassis, types.uuid, body=[ChassisPatchType]) def patch(self, chassis_uuid, patch): """Update an existing chassis. :param chassis_uuid: UUID of a chassis. :param patch: a json PATCH document to apply to this chassis. """ rpc_chassis = objects.Chassis.get_by_uuid(pecan.request.context, chassis_uuid) try: chassis = Chassis(**jsonpatch.apply_patch(rpc_chassis.as_dict(), jsonpatch.JsonPatch(patch))) except api_utils.JSONPATCH_EXCEPTIONS as e: raise exception.PatchError(patch=patch, reason=e) # Update only the fields that have changed for field in objects.Chassis.fields: if rpc_chassis[field] != getattr(chassis, field): rpc_chassis[field] = getattr(chassis, field) rpc_chassis.save() return Chassis.convert_with_links(rpc_chassis) @wsme_pecan.wsexpose(None, types.uuid, status_code=204) def delete(self, chassis_uuid): """Delete a chassis. :param chassis_uuid: UUID of a chassis. """ pecan.request.dbapi.destroy_chassis(chassis_uuid) ironic-2014.1.rc1/ironic/api/controllers/v1/port.py0000664000175300017540000002555412316614116023207 0ustar jenkinsjenkins00000000000000# Copyright 2013 UnitedStack Inc. # 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 datetime import jsonpatch import pecan from pecan import rest import six import wsme from wsme import types as wtypes import wsmeext.pecan as wsme_pecan from ironic.api.controllers import base from ironic.api.controllers import link from ironic.api.controllers.v1 import collection from ironic.api.controllers.v1 import types from ironic.api.controllers.v1 import utils as api_utils from ironic.common import exception from ironic import objects class PortPatchType(types.JsonPatchType): @staticmethod def mandatory_attrs(): return ['/address', '/node_uuid'] class Port(base.APIBase): """API representation of a port. This class enforces type checking and value constraints, and converts between the internal object model and the API representation of a port. """ _node_uuid = None def _get_node_uuid(self): return self._node_uuid def _set_node_uuid(self, value): if value and self._node_uuid != value: try: node = objects.Node.get_by_uuid(pecan.request.context, value) self._node_uuid = node.uuid # NOTE(lucasagomes): Create the node_id attribute on-the-fly # to satisfy the api -> rpc object # conversion. self.node_id = node.id except exception.NodeNotFound as e: # Change error code because 404 (NotFound) is inappropriate # response for a POST request to create a Port e.code = 400 # BadRequest raise e elif value == wtypes.Unset: self._node_uuid = wtypes.Unset uuid = types.uuid "Unique UUID for this port" address = wsme.wsattr(types.macaddress, mandatory=True) "MAC Address for this port" extra = {wtypes.text: types.MultiType(wtypes.text, six.integer_types)} "This port's meta data" node_uuid = wsme.wsproperty(types.uuid, _get_node_uuid, _set_node_uuid, mandatory=True) "The UUID of the node this port belongs to" links = wsme.wsattr([link.Link], readonly=True) "A list containing a self link and associated port links" def __init__(self, **kwargs): self.fields = objects.Port.fields.keys() for k in self.fields: setattr(self, k, kwargs.get(k)) # NOTE(lucasagomes): node_uuid is not part of objects.Port.fields # because it's an API-only attribute self.fields.append('node_uuid') setattr(self, 'node_uuid', kwargs.get('node_id')) @classmethod def convert_with_links(cls, rpc_port, expand=True): port = Port(**rpc_port.as_dict()) if not expand: port.unset_fields_except(['uuid', 'address']) # never expose the node_id attribute port.node_id = wtypes.Unset port.links = [link.Link.make_link('self', pecan.request.host_url, 'ports', port.uuid), link.Link.make_link('bookmark', pecan.request.host_url, 'ports', port.uuid, bookmark=True) ] return port @classmethod def sample(cls): sample = cls(uuid='27e3153e-d5bf-4b7e-b517-fb518e17f34c', address='fe:54:00:77:07:d9', extra={'foo': 'bar'}, created_at=datetime.datetime.utcnow(), updated_at=datetime.datetime.utcnow()) # NOTE(lucasagomes): node_uuid getter() method look at the # _node_uuid variable sample._node_uuid = '7ae81bb3-dec3-4289-8d6c-da80bd8001ae' return sample class PortCollection(collection.Collection): """API representation of a collection of ports.""" ports = [Port] "A list containing ports objects" def __init__(self, **kwargs): self._type = 'ports' @classmethod def convert_with_links(cls, rpc_ports, limit, url=None, expand=False, **kwargs): collection = PortCollection() collection.ports = [Port.convert_with_links(p, expand) for p in rpc_ports] collection.next = collection.get_next(limit, url=url, **kwargs) return collection @classmethod def sample(cls): sample = cls() sample.ports = [Port.sample()] return sample class PortsController(rest.RestController): """REST controller for Ports.""" _custom_actions = { 'detail': ['GET'], } def __init__(self, from_nodes=False): self._from_nodes = from_nodes def _get_ports_collection(self, node_uuid, marker, limit, sort_key, sort_dir, expand=False, resource_url=None): if self._from_nodes and not node_uuid: raise exception.InvalidParameterValue(_( "Node id not specified.")) limit = api_utils.validate_limit(limit) sort_dir = api_utils.validate_sort_dir(sort_dir) marker_obj = None if marker: marker_obj = objects.Port.get_by_uuid(pecan.request.context, marker) if node_uuid: ports = pecan.request.dbapi.get_ports_by_node(node_uuid, limit, marker_obj, sort_key=sort_key, sort_dir=sort_dir) else: ports = pecan.request.dbapi.get_port_list(limit, marker_obj, sort_key=sort_key, sort_dir=sort_dir) return PortCollection.convert_with_links(ports, limit, url=resource_url, expand=expand, sort_key=sort_key, sort_dir=sort_dir) @wsme_pecan.wsexpose(PortCollection, types.uuid, types.uuid, int, wtypes.text, wtypes.text) def get_all(self, node_uuid=None, marker=None, limit=None, sort_key='id', sort_dir='asc'): """Retrieve a list of ports. :param node_uuid: UUID of a node, to get only ports for that node. :param marker: pagination marker for large data sets. :param limit: maximum number of resources to return in a single result. :param sort_key: column to sort results by. Default: id. :param sort_dir: direction to sort. "asc" or "desc". Default: asc. """ return self._get_ports_collection(node_uuid, marker, limit, sort_key, sort_dir) @wsme_pecan.wsexpose(PortCollection, types.uuid, types.uuid, int, wtypes.text, wtypes.text) def detail(self, node_uuid=None, marker=None, limit=None, sort_key='id', sort_dir='asc'): """Retrieve a list of ports with detail. :param node_uuid: UUID of a node, to get only ports for that node. :param marker: pagination marker for large data sets. :param limit: maximum number of resources to return in a single result. :param sort_key: column to sort results by. Default: id. :param sort_dir: direction to sort. "asc" or "desc". Default: asc. """ # NOTE(lucasagomes): /detail should only work agaist collections parent = pecan.request.path.split('/')[:-1][-1] if parent != "ports": raise exception.HTTPNotFound expand = True resource_url = '/'.join(['ports', 'detail']) return self._get_ports_collection(node_uuid, marker, limit, sort_key, sort_dir, expand, resource_url) @wsme_pecan.wsexpose(Port, types.uuid) def get_one(self, port_uuid): """Retrieve information about the given port. :param port_uuid: UUID of a port. """ if self._from_nodes: raise exception.OperationNotPermitted rpc_port = objects.Port.get_by_uuid(pecan.request.context, port_uuid) return Port.convert_with_links(rpc_port) @wsme_pecan.wsexpose(Port, body=Port, status_code=201) def post(self, port): """Create a new port. :param port: a port within the request body. """ if self._from_nodes: raise exception.OperationNotPermitted new_port = pecan.request.dbapi.create_port(port.as_dict()) return Port.convert_with_links(new_port) @wsme.validate(types.uuid, [PortPatchType]) @wsme_pecan.wsexpose(Port, types.uuid, body=[PortPatchType]) def patch(self, port_uuid, patch): """Update an existing port. :param port_uuid: UUID of a port. :param patch: a json PATCH document to apply to this port. """ if self._from_nodes: raise exception.OperationNotPermitted rpc_port = objects.Port.get_by_uuid(pecan.request.context, port_uuid) try: port = Port(**jsonpatch.apply_patch(rpc_port.as_dict(), jsonpatch.JsonPatch(patch))) except api_utils.JSONPATCH_EXCEPTIONS as e: raise exception.PatchError(patch=patch, reason=e) # Update only the fields that have changed for field in objects.Port.fields: if rpc_port[field] != getattr(port, field): rpc_port[field] = getattr(port, field) rpc_node = objects.Node.get_by_uuid(pecan.request.context, rpc_port.node_id) topic = pecan.request.rpcapi.get_topic_for(rpc_node) new_port = pecan.request.rpcapi.update_port( pecan.request.context, rpc_port, topic) return Port.convert_with_links(new_port) @wsme_pecan.wsexpose(None, types.uuid, status_code=204) def delete(self, port_uuid): """Delete a port. :param port_uuid: UUID of a port. """ if self._from_nodes: raise exception.OperationNotPermitted pecan.request.dbapi.destroy_port(port_uuid) ironic-2014.1.rc1/ironic/api/controllers/v1/__init__.py0000664000175300017540000001116212316614116023750 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. """ Version 1 of the Ironic API NOTE: IN PROGRESS AND NOT FULLY IMPLEMENTED. Should maintain feature parity with Nova Baremetal Extension. Specification can be found at ironic/doc/api/v1.rst """ import pecan from pecan import rest from wsme import types as wtypes import wsmeext.pecan as wsme_pecan from ironic.api.controllers import base from ironic.api.controllers import link from ironic.api.controllers.v1 import chassis from ironic.api.controllers.v1 import driver from ironic.api.controllers.v1 import node from ironic.api.controllers.v1 import port class MediaType(base.APIBase): """A media type representation.""" base = wtypes.text type = wtypes.text def __init__(self, base, type): self.base = base self.type = type class V1(base.APIBase): """The representation of the version 1 of the API.""" id = wtypes.text "The ID of the version, also acts as the release number" media_types = [MediaType] "An array of supported media types for this version" links = [link.Link] "Links that point to a specific URL for this version and documentation" chassis = [link.Link] "Links to the chassis resource" nodes = [link.Link] "Links to the nodes resource" ports = [link.Link] "Links to the ports resource" drivers = [link.Link] "Links to the drivers resource" @classmethod def convert(self): v1 = V1() v1.id = "v1" v1.links = [link.Link.make_link('self', pecan.request.host_url, 'v1', '', bookmark=True), link.Link.make_link('describedby', 'http://docs.openstack.org', 'developer/ironic/dev', 'api-spec-v1.html', bookmark=True, type='text/html') ] v1.media_types = [MediaType('application/json', 'application/vnd.openstack.ironic.v1+json')] v1.chassis = [link.Link.make_link('self', pecan.request.host_url, 'chassis', ''), link.Link.make_link('bookmark', pecan.request.host_url, 'chassis', '', bookmark=True) ] v1.nodes = [link.Link.make_link('self', pecan.request.host_url, 'nodes', ''), link.Link.make_link('bookmark', pecan.request.host_url, 'nodes', '', bookmark=True) ] v1.ports = [link.Link.make_link('self', pecan.request.host_url, 'ports', ''), link.Link.make_link('bookmark', pecan.request.host_url, 'ports', '', bookmark=True) ] v1.drivers = [link.Link.make_link('self', pecan.request.host_url, 'drivers', ''), link.Link.make_link('bookmark', pecan.request.host_url, 'drivers', '', bookmark=True) ] return v1 class Controller(rest.RestController): """Version 1 API controller root.""" nodes = node.NodesController() ports = port.PortsController() chassis = chassis.ChassisController() drivers = driver.DriversController() @wsme_pecan.wsexpose(V1) def get(self): # NOTE: The reason why convert() it's being called for every # request is because we need to get the host url from # the request object to make the links. return V1.convert() __all__ = (Controller) ironic-2014.1.rc1/ironic/api/controllers/v1/collection.py0000664000175300017540000000336012316614116024345 0ustar jenkinsjenkins00000000000000# Copyright 2013 Red Hat, Inc. # 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 pecan from wsme import types as wtypes from ironic.api.controllers import base from ironic.api.controllers import link class Collection(base.APIBase): next = wtypes.text "A link to retrieve the next subset of the collection" @property def collection(self): return getattr(self, self._type) def has_next(self, limit): """Return whether collection has more items.""" return len(self.collection) and len(self.collection) == limit def get_next(self, limit, url=None, **kwargs): """Return a link to the next subset of the collection.""" if not self.has_next(limit): return wtypes.Unset resource_url = url or self._type q_args = ''.join(['%s=%s&' % (key, kwargs[key]) for key in kwargs]) next_args = '?%(args)slimit=%(limit)d&marker=%(marker)s' % { 'args': q_args, 'limit': limit, 'marker': self.collection[-1].uuid} return link.Link.make_link('next', pecan.request.host_url, resource_url, next_args).href ironic-2014.1.rc1/ironic/api/__init__.py0000664000175300017540000000247712316614116021065 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 API_SERVICE_OPTS = [ cfg.StrOpt('host_ip', default='0.0.0.0', help='The listen IP for the Ironic API server.'), cfg.IntOpt('port', default=6385, help='The port for the Ironic API server.'), cfg.IntOpt('max_limit', default=1000, help='The maximum number of items returned in a single ' 'response from a collection resource.'), ] CONF = cfg.CONF opt_group = cfg.OptGroup(name='api', title='Options for the ironic-api service') CONF.register_group(opt_group) CONF.register_opts(API_SERVICE_OPTS, opt_group) ironic-2014.1.rc1/ironic/api/config.py0000664000175300017540000000242612316614116020565 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 oslo.config import cfg # Server Specific Configurations # See https://pecan.readthedocs.org/en/latest/configuration.html#server-configuration # noqa server = { 'port': '6385', 'host': '0.0.0.0' } # Pecan Application Configurations # See https://pecan.readthedocs.org/en/latest/configuration.html#application-configuration # noqa app = { 'root': 'ironic.api.controllers.root.RootController', 'modules': ['ironic.api'], 'static_root': '%(confdir)s/public', 'debug': False, 'enable_acl': True, 'acl_public_routes': ['/', '/v1'], } # WSME Configurations # See https://wsme.readthedocs.org/en/latest/integrate.html#configuration wsme = { 'debug': cfg.CONF.debug, } ironic-2014.1.rc1/ironic/api/app.wsgi0000664000175300017540000000157412316614116020424 0ustar jenkinsjenkins00000000000000# -*- mode: python -*- # -*- encoding: 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. """ Use this file for deploying the API service under Apache2 mod_wsgi. """ from ironic.api import app from ironic.common import service from ironic.openstack.common import gettextutils gettextutils.install('ironic') service.prepare_service([]) application = app.VersionSelectorApplication() ironic-2014.1.rc1/ironic/api/app.py0000664000175300017540000000500112316614116020070 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # Copyright © 2012 New Dream Network, LLC (DreamHost) # 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 import pecan from ironic.api import acl from ironic.api import config from ironic.api import hooks from ironic.api import middleware from ironic.common import policy auth_opts = [ cfg.StrOpt('auth_strategy', default='keystone', help='Method to use for authentication: noauth or keystone.'), ] CONF = cfg.CONF CONF.register_opts(auth_opts) def get_pecan_config(): # Set up the pecan configuration filename = config.__file__.replace('.pyc', '.py') return pecan.configuration.conf_from_file(filename) def setup_app(pecan_config=None, extra_hooks=None): policy.init() app_hooks = [hooks.ConfigHook(), hooks.DBHook(), hooks.ContextHook(pecan_config.app.acl_public_routes), hooks.RPCHook(), hooks.NoExceptionTracebackHook()] if extra_hooks: app_hooks.extend(extra_hooks) if not pecan_config: pecan_config = get_pecan_config() if pecan_config.app.enable_acl: app_hooks.append(hooks.AdminAuthHook()) pecan.configuration.set_config(dict(pecan_config), overwrite=True) app = pecan.make_app( pecan_config.app.root, static_root=pecan_config.app.static_root, debug=CONF.debug, force_canonical=getattr(pecan_config.app, 'force_canonical', True), hooks=app_hooks, wrap_app=middleware.ParsableErrorMiddleware, ) if pecan_config.app.enable_acl: return acl.install(app, cfg.CONF, pecan_config.app.acl_public_routes) return app class VersionSelectorApplication(object): def __init__(self): pc = get_pecan_config() pc.app.enable_acl = (CONF.auth_strategy == 'keystone') self.v1 = setup_app(pecan_config=pc) def __call__(self, environ, start_response): return self.v1(environ, start_response) ironic-2014.1.rc1/ironic/nova/0000775000175300017540000000000012316614636017143 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/nova/compute/0000775000175300017540000000000012316614636020617 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/nova/compute/manager.py0000664000175300017540000000622612316614116022602 0ustar jenkinsjenkins00000000000000# coding=utf-8 # # Copyright 2014 Red Hat, Inc. # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """Short term workaround for friction in the Nova compute manager with Ironic. https://etherpad.openstack.org/p/ironic-nova-friction contains current design work. The goal here is to generalise the areas where n-c talking to a clustered hypervisor has issues, and long term fold them into the main ComputeManager. """ from nova.compute import manager import nova.context class ClusteredComputeManager(manager.ComputeManager): def init_host(self): """Initialization for a clustered compute service.""" self.driver.init_host(host=self.host) # Not used currently. # context = nova.context.get_admin_context() # instances = instance_obj.InstanceList.get_by_host( # context, self.host, expected_attrs=['info_cache']) # defer_iptables_apply is moot for clusters - no local iptables # if CONF.defer_iptables_apply: # self.driver.filter_defer_apply_on() self.init_virt_events() # try: # evacuation is moot for a clustered hypervisor # # checking that instance was not already evacuated to other host # self._destroy_evacuated_instances(context) # Don't run _init_instance until we solve the partitioning problem # - with N n-cpu's all claiming the same hostname, running # _init_instance here would lead to race conditions where each runs # _init_instance concurrently. # for instance in instances: # self._init_instance(context, instance) # finally: # defer_iptables_apply is moot for clusters - no local iptables # if CONF.defer_iptables_apply: # self.driver.filter_defer_apply_off() def pre_start_hook(self): """After the service is initialized, but before we fully bring the service up by listening on RPC queues, make sure to update our available resources (and indirectly our available nodes). """ # This is an optimisation to immediately advertise resources but # the periodic task will update them eventually anyway, so ignore # errors as they may be transient (e.g. the scheduler isn't # available...). XXX(lifeless) this applies to all ComputeManagers # and once I feature freeze is over we should push that to nova # directly. try: self.update_available_resource(nova.context.get_admin_context()) except Exception: pass ironic-2014.1.rc1/ironic/nova/compute/__init__.py0000664000175300017540000000000012316614116022707 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/nova/__init__.py0000664000175300017540000000000012316614116021233 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/nova/virt/0000775000175300017540000000000012316614636020127 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/nova/virt/__init__.py0000664000175300017540000000000012316614116022217 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/nova/virt/ironic/0000775000175300017540000000000012316614636021412 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/nova/virt/ironic/ironic_states.py0000664000175300017540000000451212316614116024625 0ustar jenkinsjenkins00000000000000# coding=utf-8 # # Copyright (c) 2012 NTT DOCOMO, INC. # Copyright 2010 OpenStack Foundation # 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. """ Mapping of bare metal node states. A node may have empty {} `properties` and `driver_info` in which case, it is said to be "initialized" but "not available", and the state is NOSTATE. When updating `properties`, any data will be rejected if the data fails to be validated by the driver. Any node with non-empty `properties` is said to be "initialized", and the state is INIT. When the driver has received both `properties` and `driver_info`, it will check the power status of the node and update the `power_state` accordingly. If the driver fails to read the power state from the node, it will reject the `driver_info` change, and the state will remain as INIT. If the power status check succeeds, `power_state` will change to one of POWER_ON or POWER_OFF, accordingly. At this point, the power state may be changed via the API, a console may be started, and a tenant may be associated. The `power_state` for a node always represents the current power state. Any power operation sets this to the actual state when done (whether successful or not). It is set to ERROR only when unable to get the power state from a node. When `instance_uuid` is set to a non-empty / non-None value, the node is said to be "associated" with a tenant. An associated node can not be deleted. The `instance_uuid` field may be unset only if the node is in POWER_OFF or ERROR states. """ NOSTATE = None INIT = 'initializing' ACTIVE = 'active' BUILDING = 'building' DEPLOYING = 'deploying' DEPLOYFAIL = 'deploy failed' DEPLOYDONE = 'deploy complete' DELETING = 'deleting' DELETED = 'deleted' ERROR = 'error' POWER_ON = 'power on' POWER_OFF = 'power off' REBOOT = 'rebooting' SUSPEND = 'suspended' ironic-2014.1.rc1/ironic/nova/virt/ironic/driver.py0000664000175300017540000006615512316614116023265 0ustar jenkinsjenkins00000000000000# coding=utf-8 # # Copyright 2014 Red Hat, Inc. # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """ A driver wrapping the Ironic API, such that Nova may provision bare metal resources. """ from ironicclient import client as ironic_client from ironicclient import exc as ironic_exception from oslo.config import cfg from ironic.nova.virt.ironic import ironic_states from nova.compute import power_state from nova import exception from nova.objects import flavor as flavor_obj from nova.openstack.common import excutils from nova.openstack.common.gettextutils import _ from nova.openstack.common import importutils from nova.openstack.common import jsonutils from nova.openstack.common import log as logging from nova.openstack.common import loopingcall from nova.virt import driver as virt_driver from nova.virt import firewall LOG = logging.getLogger(__name__) opts = [ cfg.IntOpt('api_version', default=1, help='Version of Ironic API service endpoint.'), cfg.StrOpt('api_endpoint', help='URL for Ironic API endpoint.'), cfg.StrOpt('admin_username', help='Ironic keystone admin name'), cfg.StrOpt('admin_password', help='Ironic keystone admin password.'), cfg.StrOpt('admin_auth_token', help='Ironic keystone auth token.'), cfg.StrOpt('admin_url', help='Ironic public api endpoint.'), cfg.StrOpt('pxe_bootfile_name', help='This gets passed to Neutron as the bootfile dhcp ' 'parameter when the dhcp_options_enabled is set.', default='pxelinux.0'), cfg.StrOpt('admin_tenant_name', help='Ironic keystone tenant name.'), cfg.ListOpt('instance_type_extra_specs', default=[], help='A list of additional capabilities corresponding to ' 'instance_type_extra_specs for this compute ' 'host to advertise. Valid entries are name=value, pairs ' 'For example, "key1:val1, key2:val2"'), cfg.IntOpt('api_max_retries', default=5, help=('How many retries when a request does conflict.')), cfg.IntOpt('api_retry_interval', default=2, help=('How often to retry in seconds when a request ' 'does conflict')), ] ironic_group = cfg.OptGroup(name='ironic', title='Ironic Options') CONF = cfg.CONF CONF.register_group(ironic_group) CONF.register_opts(opts, ironic_group) _FIREWALL_DRIVER = "%s.%s" % (firewall.__name__, firewall.NoopFirewallDriver.__name__) _POWER_STATE_MAP = { ironic_states.POWER_ON: power_state.RUNNING, ironic_states.NOSTATE: power_state.NOSTATE, ironic_states.POWER_OFF: power_state.SHUTDOWN, } class MaximumRetriesReached(exception.NovaException): msg_fmt = _("Maximum number of retries reached.") def map_power_state(state): try: return _POWER_STATE_MAP[state] except KeyError: LOG.warning(_("Power state %s not found.") % state) return power_state.NOSTATE def validate_instance_and_node(icli, instance): """Get and validate a node's uuid out of a manager instance dict. The compute manager is meant to know the node uuid, so missing uuid a significant issue - it may mean we've been passed someone elses data. Check with the Ironic service that this node is still associated with this instance. This catches situations where Nova's instance dict contains stale data (eg, a delete on an instance that's already gone). """ try: return icli.node.get_by_instance_uuid(instance['uuid']) except ironic_exception.HTTPNotFound: raise exception.InstanceNotFound(instance_id=instance['uuid']) def _get_required_value(key, value): """Return the requested value.""" if '/' in value: # we need to split the value split_value = value.split('/') eval_string = 'key' for value in split_value: eval_string = "%s['%s']" % (eval_string, value) return eval(eval_string) else: return key[value] def _get_nodes_supported_instances(cpu_arch=''): """Return supported instances for a node.""" return [(cpu_arch, 'baremetal', 'baremetal')] class IronicDriver(virt_driver.ComputeDriver): """Hypervisor driver for Ironic - bare metal provisioning.""" capabilities = {"has_imagecache": False} def __init__(self, virtapi, read_only=False): super(IronicDriver, self).__init__(virtapi) self.firewall_driver = firewall.load_driver(default=_FIREWALL_DRIVER) # TODO(deva): sort out extra_specs and nova-scheduler interaction extra_specs = {} extra_specs["ironic_driver"] = \ "ironic.nova.virt.ironic.driver.IronicDriver" # cpu_arch set per node. extra_specs['cpu_arch'] = '' for pair in CONF.ironic.instance_type_extra_specs: keyval = pair.split(':', 1) keyval[0] = keyval[0].strip() keyval[1] = keyval[1].strip() extra_specs[keyval[0]] = keyval[1] self.extra_specs = extra_specs def _retry_if_service_is_unavailable(self, func, *args): """Rety the request if the API returns 409 (Conflict).""" def _request_api(): try: func(*args) raise loopingcall.LoopingCallDone() except ironic_exception.HTTPServiceUnavailable: pass if self.tries >= CONF.ironic.api_max_retries: raise MaximumRetriesReached() else: self.tries += 1 self.tries = 0 timer = loopingcall.FixedIntervalLoopingCall(_request_api) timer.start(interval=CONF.ironic.api_retry_interval).wait() def _get_client(self): # TODO(deva): save and reuse existing client & auth token # until it expires or is no longer valid auth_token = CONF.ironic.admin_auth_token if auth_token is None: kwargs = {'os_username': CONF.ironic.admin_username, 'os_password': CONF.ironic.admin_password, 'os_auth_url': CONF.ironic.admin_url, 'os_tenant_name': CONF.ironic.admin_tenant_name, 'os_service_type': 'baremetal', 'os_endpoint_type': 'public'} else: kwargs = {'os_auth_token': auth_token, 'ironic_url': CONF.ironic.api_endpoint} return ironic_client.get_client(CONF.ironic.api_version, **kwargs) def _node_resource(self, node): # TODO(deva): refactor this to match ironic node datastruct vcpus_used = 0 memory_mb_used = 0 local_gb_used = 0 vcpus = int(node.properties.get('cpus', 0)) memory_mb = int(node.properties.get('memory_mb', 0)) local_gb = int(node.properties.get('local_gb', 0)) cpu_arch = str(node.properties.get('cpu_arch', 'NotFound')) nodes_extra_specs = self.extra_specs nodes_extra_specs['cpu_arch'] = cpu_arch if node.instance_uuid: vcpus_used = vcpus memory_mb_used = memory_mb local_gb_used = local_gb dic = {'vcpus': vcpus, 'memory_mb': memory_mb, 'local_gb': local_gb, 'vcpus_used': vcpus_used, 'memory_mb_used': memory_mb_used, 'local_gb_used': local_gb_used, 'hypervisor_type': self.get_hypervisor_type(), 'hypervisor_version': self.get_hypervisor_version(), 'hypervisor_hostname': str(node.uuid), 'cpu_info': 'baremetal cpu', 'supported_instances': jsonutils.dumps( _get_nodes_supported_instances(cpu_arch)), 'stats': jsonutils.dumps(nodes_extra_specs) } return dic def _start_firewall(self, instance, network_info): self.firewall_driver.setup_basic_filtering(instance, network_info) self.firewall_driver.prepare_instance_filter(instance, network_info) self.firewall_driver.apply_instance_filter(instance, network_info) def _stop_firewall(self, instance, network_info): self.firewall_driver.unfilter_instance(instance, network_info) def _add_driver_fields(self, node, instance, image_meta, flavor=None): icli = self._get_client() if 'pxe' in node.driver: # add required fields pxe_fields = importutils.import_class( 'ironic.nova.virt.ironic.ironic_driver_fields.PXE') patch = [] for field in pxe_fields.required: path_to_add = "%s/%s" % (field['ironic_path'], field['ironic_variable']) patch = [{'op': 'add', 'path': path_to_add, 'value': unicode(_get_required_value( eval(field['nova_object']), field['object_field']))}] try: self._retry_if_service_is_unavailable(icli.node.update, node.uuid, patch) except MaximumRetriesReached: msg = (_("Adding the parameter %(param)s on node %(node)s " "failed after %(retries)d retries") % {'param': path_to_add, 'node': node.uuid, 'retries': CONF.ironic.api_max_retries}) LOG.error(msg) raise exception.NovaException(msg) def _cleanup_deploy(self, node, instance, network_info): icli = self._get_client() if 'pxe' in node.driver: # add required fields pxe_fields = importutils.import_class( 'ironic.nova.virt.ironic.ironic_driver_fields.PXE') patch = [] for field in pxe_fields.required: path_to_remove = "%s/%s" % (field['ironic_path'], field['ironic_variable']) patch = [{'op': 'remove', 'path': path_to_remove}] try: self._retry_if_service_is_unavailable(icli.node.update, node.uuid, patch) except MaximumRetriesReached: LOG.warning(_("Removing the parameter %(param)s on node " "%(node)s failed after %(retries)d retries") % {'param': path_to_remove, 'node': node.uuid, 'retries': CONF.ironic.api_max_retries}) except ironic_exception.HTTPBadRequest: pass self._unplug_vifs(node, instance, network_info) self._stop_firewall(instance, network_info) @classmethod def instance(cls): if not hasattr(cls, '_instance'): cls._instance = cls() return cls._instance def init_host(self, host): return def get_hypervisor_type(self): return 'ironic' def get_hypervisor_version(self): return CONF.ironic.api_version def list_instances(self): try: icli = self._get_client() except ironic_exception.Unauthorized: LOG.error(_("Unable to authenticate Ironic client.")) return [] instances = [i for i in icli.node.list() if i.instance_uuid] return instances def get_available_nodes(self, refresh=False): nodes = [] icli = self._get_client() node_list = icli.node.list() for n in node_list: # for now we'll use the nodes power state. if power_state is None # we'll assume it is not ready to be presented to Nova. if n.power_state: nodes.append(n.uuid) LOG.debug("Returning Nodes: %s" % nodes) return nodes def get_available_resource(self, node): """Retrieve resource information. This method is called when nova-compute launches, and as part of a periodic task that records the results in the DB. :param node: the uuid of the node :returns: dictionary describing resources """ icli = self._get_client() node = icli.node.get(node) return self._node_resource(node) def get_info(self, instance): icli = self._get_client() try: node = icli.node.get_by_instance_uuid(instance['uuid']) except ironic_exception.HTTPNotFound: return {'state': map_power_state(ironic_states.NOSTATE), 'max_mem': 0, 'mem': 0, 'num_cpu': 0, 'cpu_time': 0 } return {'state': map_power_state(node.power_state), 'max_mem': node.properties.get('memory_mb'), 'mem': node.properties.get('memory_mb'), 'num_cpu': node.properties.get('cpus'), 'cpu_time': 0 } def macs_for_instance(self, instance): icli = self._get_client() try: node = icli.node.get(instance['node']) except ironic_exception.HTTPNotFound: return [] ports = icli.node.list_ports(node.uuid) return [p.address for p in ports] def spawn(self, context, instance, image_meta, injected_files, admin_password, network_info=None, block_device_info=None): # The compute manager is meant to know the node uuid, so missing uuid # is a significant issue. It may mean we've been passed the wrong data. node_uuid = instance.get('node') if not node_uuid: raise exception.NovaException(_("Ironic node uuid not supplied to " "driver for instance %s.") % instance['uuid']) icli = self._get_client() node = icli.node.get(node_uuid) # Associate the node to this instance try: # NOTE(deva): this may raise a NodeAlreadyAssociated exception # which we allow to propagate up to the scheduler, # so it retries on another node. patch = [{'op': 'replace', 'path': '/instance_uuid', 'value': instance['uuid']}] self._retry_if_service_is_unavailable(icli.node.update, node_uuid, patch) except (ironic_exception.HTTPBadRequest, MaximumRetriesReached): msg = _("Unable to set instance UUID for node %s") % node_uuid LOG.error(msg) raise exception.NovaException(msg) # Set image id, and other driver info so we can pass it down to Ironic # use the ironic_driver_fields file to import flavor = flavor_obj.Flavor.get_by_id(context, instance['instance_type_id']) self._add_driver_fields(node, instance, image_meta, flavor) #validate we ready to do the deploy validate_chk = icli.node.validate(node_uuid) if not validate_chk.deploy or not validate_chk.power: # something is wrong. undo we we have done self._cleanup_deploy(node, instance, network_info) raise exception.ValidationError(_( "Ironic node: %(id)s failed to validate." " (deploy: %(deploy)s, power: %(power)s)") % {'id': node.uuid, 'deploy': validate_chk.deploy, 'power': validate_chk.power}) # prepare for the deploy try: self._plug_vifs(node, instance, network_info) self._start_firewall(instance, network_info) except Exception: with excutils.save_and_reraise_exception(): LOG.error(_("Error preparing deploy for instance %(instance)s " "on baremetal node %(node)s.") % {'instance': instance['uuid'], 'node': node_uuid}) self._cleanup_deploy(node, instance, network_info) # trigger the node deploy try: self._retry_if_service_is_unavailable( icli.node.set_provision_state, node_uuid, 'active') except MaximumRetriesReached: msg = (_("Error triggering the node %s to start the deployment") % node_uuid) LOG.error(msg) self._cleanup_deploy(node, instance, network_info) raise exception.NovaException(msg) # wait for the node to be marked as ACTIVE in Ironic def _wait_for_active(): try: node = icli.node.get_by_instance_uuid(instance['uuid']) except ironic_exception.HTTPNotFound: raise exception.InstanceNotFound(instance_id=instance['uuid']) if node.provision_state == ironic_states.ACTIVE: # job is done raise loopingcall.LoopingCallDone() if node.target_provision_state == ironic_states.DELETED: # ironic is trying to delete it now raise exception.InstanceNotFound(instance_id=instance['uuid']) if node.provision_state == ironic_states.NOSTATE: # ironic already deleted it raise exception.InstanceNotFound(instance_id=instance['uuid']) if node.provision_state == ironic_states.DEPLOYFAIL: # ironic failed to deploy msg = (_("Failed to provision instance %(inst)s: %(reason)s") % {'inst': instance['uuid'], 'reason': node.last_error}) LOG.error(msg) raise exception.InstanceDeployFailure(msg) timer = loopingcall.FixedIntervalLoopingCall(_wait_for_active) # TODO(lucasagomes): Make the time configurable timer.start(interval=10).wait() def destroy(self, context, instance, network_info, block_device_info=None): icli = self._get_client() try: node = validate_instance_and_node(icli, instance) node_uuid = node.uuid except exception.InstanceNotFound: LOG.debug(_("Destroy called on non-existing instance %s.") % instance['uuid']) # NOTE(deva): if nova.compute.ComputeManager._delete_instance() # is called on a non-existing instance, the only way # to delete it is to return from this method # without raising any exceptions. return # do node tear down and wait for the state change try: self._retry_if_service_is_unavailable( icli.node.set_provision_state, node_uuid, 'deleted') except MaximumRetriesReached: msg = (_("Error triggering the unprovisioning of the node %s") % node_uuid) LOG.error(msg) raise exception.NovaException(msg) except Exception as e: # if the node is already in a deprovisioned state, continue # This should be fixed in Ironic. # TODO(deva): This exception should be added to python-ironicclient # and matched directly, rather than via __name__. if getattr(e, '__name__', None) == 'InstanceDeployFailure': pass else: raise def _wait_for_provision_state(): try: node = icli.node.get_by_instance_uuid(instance['uuid']) except ironic_exception.HTTPNotFound: raise exception.InstanceNotFound(instance_id=instance['uuid']) if not node.provision_state: raise loopingcall.LoopingCallDone() if self.tries >= CONF.ironic.api_max_retries: msg = (_("Error destroying the instance on node %(node)s. " "Provision state still '%(state)s'.") % {'state': node.provision_state, 'node': node.uuid}) LOG.error(msg) raise exception.NovaException(msg) else: self.tries += 1 self.tries = 0 timer = loopingcall.FixedIntervalLoopingCall(_wait_for_provision_state) timer.start(interval=CONF.ironic.api_retry_interval).wait() # remove the instance uuid try: patch = [{'op': 'remove', 'path': '/instance_uuid'}] self._retry_if_service_is_unavailable(icli.node.update, node_uuid, patch) except MaximumRetriesReached: msg = (_("Failed to unassociate the instance %(instance)s " "with node %(node)s") % {'instance': instance['uuid'], 'node': node_uuid}) LOG.error(msg) raise exception.NovaException(msg) except ironic_exception.HTTPBadRequest: pass self._cleanup_deploy(node, instance, network_info) def reboot(self, context, instance, network_info, reboot_type, block_device_info=None, bad_volumes_callback=None): pass def power_off(self, instance, node=None): # TODO(nobodycam): check the current power state first. icli = self._get_client() node = validate_instance_and_node(icli, instance) icli.node.set_power_state(node.uuid, 'off') def power_on(self, context, instance, network_info, block_device_info=None, node=None): # TODO(nobodycam): check the current power state first. icli = self._get_client() node = validate_instance_and_node(icli, instance) icli.node.set_power_state(node.uuid, 'on') def get_host_stats(self, refresh=False): caps = [] icli = self._get_client() for node in icli.node.list(): res = self._node_resource(node) nodename = str(node.uuid) cpu_arch = str(node.properties.get('cpu_arch', 'NotFound')) nodes_extra_specs = self.extra_specs nodes_extra_specs['cpu_arch'] = cpu_arch data = {} data['vcpus'] = res['vcpus'] data['vcpus_used'] = res['vcpus_used'] data['cpu_info'] = res['cpu_info'] data['disk_total'] = res['local_gb'] data['disk_used'] = res['local_gb_used'] data['disk_available'] = res['local_gb'] - res['local_gb_used'] data['host_memory_total'] = res['memory_mb'] data['host_memory_free'] = res['memory_mb'] - res['memory_mb_used'] data['hypervisor_type'] = res['hypervisor_type'] data['hypervisor_version'] = res['hypervisor_version'] data['supported_instances'] = _get_nodes_supported_instances( cpu_arch) data.update(nodes_extra_specs) data['host'] = CONF.host data['hypervisor_hostname'] = nodename data['node'] = nodename caps.append(data) return caps def manage_image_cache(self, context, all_instances): pass def get_console_output(self, instance): raise NotImplementedError() def refresh_security_group_rules(self, security_group_id): pass def refresh_security_group_members(self, security_group_id): pass def refresh_provider_fw_rules(self): pass def refresh_instance_security_rules(self, instance): pass def ensure_filtering_rules_for_instance(self, instance_ref, network_info): pass def unfilter_instance(self, instance_ref, network_info): pass def _plug_vifs(self, node, instance, network_info): LOG.debug(_("plug: instance_uuid=%(uuid)s vif=%(network_info)s") % {'uuid': instance['uuid'], 'network_info': network_info}) # start by ensuring the ports are clear self._unplug_vifs(node, instance, network_info) icli = self._get_client() ports = icli.node.list_ports(node.uuid) if len(network_info) > len(ports): raise exception.NovaException(_( "Ironic node: %(id)s virtual to physical interface count" " missmatch" " (Vif count: %(vif_count)d, Pif count: %(pif_count)d)") % {'id': node.uuid, 'vif_count': len(network_info), 'pif_count': len(ports)}) if len(network_info) > 0: # not needed if no vif are defined for vif, pif in zip(network_info, ports): # attach what neutron needs directly to the port port_id = unicode(vif['id']) patch = [{'op': 'add', 'path': '/extra/vif_port_id', 'value': port_id}] try: self._retry_if_service_is_unavailable(icli.port.update, pif.uuid, patch) except MaximumRetriesReached: msg = (_("Failed to set the VIF networking for port %s") % pif.uuid) raise exception.NovaException(msg) def _unplug_vifs(self, node, instance, network_info): LOG.debug(_("unplug: instance_uuid=%(uuid)s vif=%(network_info)s") % {'uuid': instance['uuid'], 'network_info': network_info}) if network_info and len(network_info) > 0: icli = self._get_client() ports = icli.node.list_ports(node.uuid) # not needed if no vif are defined for vif, pif in zip(network_info, ports): # we can not attach a dict directly patch = [{'op': 'remove', 'path': '/extra/vif_port_id'}] try: self._retry_if_service_is_unavailable(icli.port.update, pif.uuid, patch) except MaximumRetriesReached: msg = (_("Failed to remove the VIF networking for port %s") % pif.uuid) LOG.warning(msg) except ironic_exception.HTTPBadRequest: pass def plug_vifs(self, instance, network_info): icli = self._get_client() node = icli.node.get(instance['node']) self._plug_vifs(node, instance, network_info) def unplug_vifs(self, instance, network_info): icli = self._get_client() node = icli.node.get(instance['node']) self._unplug_vifs(node, instance, network_info) ironic-2014.1.rc1/ironic/nova/virt/ironic/ironic_driver_fields.py0000664000175300017540000000433012316614116026141 0ustar jenkinsjenkins00000000000000# coding=utf-8 # # Copyright 2014 Hewlett-Packard Development Company, L.P. # 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. # # Values should be a list of dicts. Where each dict is # {'ironic_path': '/driver_info', 'ironic_variable': 'pxe_image_source', # 'nova_object': 'image_meta', 'object_field': "['id']"} """ Ironic driver required info mapping. """ class FAKE(object): """Required and optional field list for ironic's FAKE driver.""" required = [] optional = [] class PXE(object): """Required and optional field list for ironic's PXE driver.""" required = [ {'ironic_path': '/driver_info', 'ironic_variable': 'pxe_image_source', 'nova_object': 'image_meta', 'object_field': 'id'}, {'ironic_path': '/driver_info', 'ironic_variable': 'pxe_root_gb', 'nova_object': 'instance', 'object_field': 'root_gb'}, {'ironic_path': '/driver_info', 'ironic_variable': 'pxe_swap_mb', 'nova_object': 'flavor', 'object_field': 'swap'}, {'ironic_path': '/driver_info', 'ironic_variable': 'pxe_deploy_kernel', 'nova_object': 'flavor', 'object_field': 'extra_specs/' 'baremetal:deploy_kernel_id'}, {'ironic_path': '/driver_info', 'ironic_variable': 'pxe_deploy_ramdisk', 'nova_object': 'flavor', 'object_field': 'extra_specs/' 'baremetal:deploy_ramdisk_id'} ] optional = [] ironic-2014.1.rc1/ironic/nova/virt/ironic/__init__.py0000664000175300017540000000130012316614116023506 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 ironic.nova.virt.ironic import driver IronicDriver = driver.IronicDriver ironic-2014.1.rc1/ironic/nova/scheduler/0000775000175300017540000000000012316614636021121 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/nova/scheduler/filters/0000775000175300017540000000000012316614636022571 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/nova/scheduler/filters/exact_core_filter.py0000664000175300017540000000345612316614116026625 0ustar jenkinsjenkins00000000000000# Copyright (c) 2014 OpenStack Foundation # # 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 nova.openstack.common.gettextutils import _ from nova.openstack.common import log as logging from nova.scheduler import filters LOG = logging.getLogger(__name__) class ExactCoreFilter(filters.BaseHostFilter): def host_passes(self, host_state, filter_properties): """Return True if host has sufficient CPU cores.""" instance_type = filter_properties.get('instance_type') if not instance_type: return True if not host_state.vcpus_total: # Fail safe LOG.warning(_("VCPUs not set; assuming CPU collection broken")) return True required_vcpus = instance_type['vcpus'] usable_vcpus = host_state.vcpus_total - host_state.vcpus_used if required_vcpus != usable_vcpus: LOG.debug(_("%(host_state)s does not have %(requested_vcpus)s " "cores of usable vcpu, it only has %(usable_vcpus)s " "cores of usable vcpu."), {'host_state': host_state, 'requested_vcpus': required_vcpus, 'usable_vcpus': usable_vcpus}) return False return True ironic-2014.1.rc1/ironic/nova/scheduler/filters/exact_disk_filter.py0000664000175300017540000000321612316614116026621 0ustar jenkinsjenkins00000000000000# Copyright (c) 2014 OpenStack Foundation # 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 nova.openstack.common.gettextutils import _ from nova.openstack.common import log as logging from nova.scheduler import filters LOG = logging.getLogger(__name__) class ExactDiskFilter(filters.BaseHostFilter): """Exact Disk Filter.""" def host_passes(self, host_state, filter_properties): """Filter based on disk usage.""" instance_type = filter_properties.get('instance_type') requested_disk = (1024 * (instance_type['root_gb'] + instance_type['ephemeral_gb']) + instance_type['swap']) if requested_disk != host_state.free_disk_mb: LOG.debug(_("%(host_state)s does not have %(requested_disk)s MB " "usable disk, it only has %(usable_disk_mb)s MB usable " "disk."), {'host_state': host_state, 'requested_disk': requested_disk, 'usable_disk_mb': host_state.free_disk_mb}) return False return True ironic-2014.1.rc1/ironic/nova/scheduler/filters/exact_ram_filter.py0000664000175300017540000000274112316614116026450 0ustar jenkinsjenkins00000000000000# Copyright (c) 2014 OpenStack Foundation # 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 nova.openstack.common.gettextutils import _ from nova.openstack.common import log as logging from nova.scheduler import filters LOG = logging.getLogger(__name__) class ExactRamFilter(filters.BaseHostFilter): def host_passes(self, host_state, filter_properties): """Only return hosts with sufficient available RAM.""" instance_type = filter_properties.get('instance_type') requested_ram = instance_type['memory_mb'] if requested_ram != host_state.free_ram_mb: LOG.debug(_("%(host_state)s does not have %(requested_ram)s MB " "usable ram, it only has %(usable_ram)s MB usable ram."), {'host_state': host_state, 'requested_ram': requested_ram, 'usable_ram': host_state.free_ram_mb}) return False return True ironic-2014.1.rc1/ironic/nova/scheduler/__init__.py0000664000175300017540000000000012316614116023211 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/nova/scheduler/ironic_host_manager.py0000664000175300017540000000763312316614116025507 0ustar jenkinsjenkins00000000000000# Copyright (c) 2014 OpenStack Foundation # 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. """ Ironic host manager. This host manager will consume all cpu's, disk space, and ram from a host / node as it is supporting Baremetal hosts, which can not be subdivided into multiple instances. """ from oslo.config import cfg from nova.openstack.common import log as logging from nova.openstack.common import timeutils from nova.scheduler import host_manager host_manager_opts = [ cfg.ListOpt('baremetal_scheduler_default_filters', default=[ 'RetryFilter', 'AvailabilityZoneFilter', 'ComputeFilter', 'ComputeCapabilitiesFilter', 'ImagePropertiesFilter', 'ExactRamFilter', 'ExactDiskFilter', 'ExactCoreFilter', ], help='Which filter class names to use for filtering ' 'baremetal hosts when not specified in the request.'), cfg.BoolOpt('scheduler_use_baremetal_filters', default=False, help='Flag to decide whether to use ' 'baremetal_scheduler_default_filters or not.'), ] CONF = cfg.CONF CONF.register_opts(host_manager_opts) LOG = logging.getLogger(__name__) class IronicNodeState(host_manager.HostState): """Mutable and immutable information tracked for a host. This is an attempt to remove the ad-hoc data structures previously used and lock down access. """ def update_from_compute_node(self, compute): """Update information about a host from its compute_node info.""" all_ram_mb = compute['memory_mb'] free_disk_mb = compute['free_disk_gb'] * 1024 free_ram_mb = compute['free_ram_mb'] self.free_ram_mb = free_ram_mb self.total_usable_ram_mb = all_ram_mb self.free_disk_mb = free_disk_mb self.total_usable_disk_gb = compute['local_gb'] self.vcpus_total = compute['vcpus'] self.vcpus_used = compute['vcpus_used'] self.updated = compute['updated_at'] def consume_from_instance(self, instance): """Consume nodes entire resources regardless of instance request.""" self.free_ram_mb = 0 self.free_disk_mb = 0 self.vcpus_used = self.vcpus_total self.updated = timeutils.utcnow() def new_host_state(self, host, node, capabilities=None, service=None): """Returns an instance of IronicNodeState or HostState according to capabilities. If 'ironic_driver' is in capabilities, it returns an instance of IronicHostState. If not, returns an instance of HostState. """ if capabilities is None: capabilities = {} cap = capabilities.get('compute', {}) if bool(cap.get('ironic_driver')): return IronicNodeState(host, node, capabilities, service) else: return host_manager.HostState(host, node, capabilities, service) class IronicHostManager(host_manager.HostManager): """Ironic HostManager class.""" # Override. # Yes, this is not a class, and it is OK host_state_cls = new_host_state def __init__(self): super(IronicHostManager, self).__init__() if CONF.scheduler_use_baremetal_filters: baremetal_default = CONF.baremetal_scheduler_default_filters CONF.scheduler_default_filters = baremetal_default ironic-2014.1.rc1/ironic/nova/tests/0000775000175300017540000000000012316614636020305 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/nova/tests/virt/0000775000175300017540000000000012316614636021271 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/nova/tests/virt/ironic/0000775000175300017540000000000012316614636022554 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/nova/tests/virt/ironic/__init__.py0000664000175300017540000000000012316614116024644 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/nova/tests/virt/ironic/test_driver.py0000664000175300017540000010662412316614116025462 0ustar jenkinsjenkins00000000000000# coding=utf-8 # # Copyright 2014 Red Hat, Inc. # Copyright 2013 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. """Tests for the ironic driver.""" from ironicclient import client as ironic_client from ironicclient import exc as ironic_exception import mock from oslo.config import cfg from nova.compute import power_state as nova_states from nova import context as nova_context from nova import exception from nova.openstack.common import uuidutils from nova import test from nova.tests import fake_instance from nova.tests import utils from nova.virt import fake from nova.virt.ironic import driver as ironic_driver from nova.virt.ironic import ironic_states CONF = cfg.CONF IRONIC_FLAGS = dict( instance_type_extra_specs=['test_spec:test_value'], api_version=1, group='ironic', ) def get_test_validation(**kw): return type('interfaces', (object,), {'power': kw.get('power', True), 'deploy': kw.get('deploy', True), 'console': kw.get('console', True), 'rescue': kw.get('rescue', True)})() def get_test_node(**kw): return type('node', (object,), {'uuid': kw.get('uuid', 'eeeeeeee-dddd-cccc-bbbb-aaaaaaaaaaaa'), 'chassis_uuid': kw.get('chassis_uuid'), 'power_state': kw.get('power_state', ironic_states.NOSTATE), 'target_power_state': kw.get('target_power_state', ironic_states.NOSTATE), 'provision_state': kw.get('provision_state', ironic_states.NOSTATE), 'target_provision_state': kw.get('target_provision_state', ironic_states.NOSTATE), 'last_error': kw.get('last_error'), 'instance_uuid': kw.get('instance_uuid'), 'driver': kw.get('driver', 'fake'), 'driver_info': kw.get('driver_info', {}), 'properties': kw.get('properties', {}), 'reservation': kw.get('reservation'), 'maintenance': kw.get('maintenance', False), 'extra': kw.get('extra', {}), 'updated_at': kw.get('created_at'), 'created_at': kw.get('updated_at')})() def get_test_port(**kw): return type('port', (object,), {'uuid': kw.get('uuid', 'gggggggg-uuuu-qqqq-ffff-llllllllllll'), 'node_uuid': kw.get('node_uuid', get_test_node().uuid), 'address': kw.get('address', 'FF:FF:FF:FF:FF:FF'), 'extra': kw.get('extra', {}), 'created_at': kw.get('created_at'), 'updated_at': kw.get('updated_at')})() class FakePortClient(object): def get(self, port_uuid): pass def update(self, port_uuid, patch): pass class FakeNodeClient(object): def list(self): return [] def get(self, node_uuid): pass def get_by_instance_uuid(self, instance_uuid): pass def list_ports(self, node_uuid): pass def set_power_state(self, node_uuid, target): pass def set_provision_state(self, node_uuid, target): pass def update(self, node_uuid, patch): pass def validate(self, node_uuid): pass class FakeClient(object): node = FakeNodeClient() port = FakePortClient() FAKE_CLIENT = FakeClient() class IronicDriverTestCase(test.NoDBTestCase): def setUp(self): super(IronicDriverTestCase, self).setUp() self.flags(**IRONIC_FLAGS) self.driver = ironic_driver.IronicDriver(None) self.driver.virtapi = fake.FakeVirtAPI() self.ctx = nova_context.get_admin_context() # mock _get_client self.mock_cli_patcher = mock.patch.object(self.driver, '_get_client') self.mock_cli = self.mock_cli_patcher.start() self.mock_cli.return_value = FAKE_CLIENT def stop_patchers(): if self.mock_cli: self.mock_cli_patcher.stop() self.addCleanup(stop_patchers) def test_validate_driver_loading(self): self.assertIsInstance(self.driver, ironic_driver.IronicDriver) def test_get_hypervisor_type(self): self.assertEqual(self.driver.get_hypervisor_type(), 'ironic') def test_get_hypervisor_version(self): self.assertEqual(self.driver.get_hypervisor_version(), 1) def test__get_client_no_auth_token(self): self.flags(admin_auth_token=None, group='ironic') # stop _get_client mock self.mock_cli_patcher.stop() self.mock_cli = None with mock.patch.object(nova_context, 'get_admin_context') as mock_ctx: mock_ctx.return_value = self.ctx with mock.patch.object(ironic_client, 'get_client') as mock_ir_cli: self.driver._get_client() expected = {'os_username': CONF.ironic.admin_username, 'os_password': CONF.ironic.admin_password, 'os_auth_url': CONF.ironic.admin_url, 'os_tenant_name': CONF.ironic.admin_tenant_name, 'os_service_type': 'baremetal', 'os_endpoint_type': 'public'} mock_ir_cli.assert_called_once_with(CONF.ironic.api_version, **expected) def test__get_client_with_auth_token(self): self.flags(admin_auth_token='fake-token', group='ironic') # stop _get_client mock self.mock_cli_patcher.stop() self.mock_cli = None with mock.patch.object(nova_context, 'get_admin_context') as mock_ctx: mock_ctx.return_value = self.ctx with mock.patch.object(ironic_client, 'get_client') as mock_ir_cli: self.driver._get_client() expected = {'os_auth_token': self.ctx.auth_token, 'ironic_url': CONF.ironic.api_endpoint} mock_ir_cli.assert_called_once_with(CONF.ironic.api_version, **expected) def test__require_node(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' test_instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) self.assertEqual(node_uuid, self.driver._require_node(test_instance)) def test__require_node_fail(self): test_instance = fake_instance.fake_instance_obj(self.ctx, node=None) self.assertRaises(exception.NovaException, self.driver._require_node, test_instance) def test__node_resource(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' cpus = 2 mem = 512 disk = 10 arch = 'x86_64' properties = {'cpus': cpus, 'memory_mb': mem, 'local_gb': disk, 'cpu_arch': arch} node = get_test_node(uuid=node_uuid, instance_uuid=uuidutils.generate_uuid(), properties=properties) result = self.driver._node_resource(node) self.assertEqual(cpus, result['vcpus']) self.assertEqual(cpus, result['vcpus_used']) self.assertEqual(mem, result['memory_mb']) self.assertEqual(mem, result['memory_mb_used']) self.assertEqual(disk, result['local_gb']) self.assertEqual(disk, result['local_gb_used']) self.assertEqual(node_uuid, result['hypervisor_hostname']) self.assertEqual('{"cpu_arch": "x86_64", "ironic_driver": "' 'nova.virt.ironic.driver.IronicDriver", ' '"test_spec": "test_value"}', result['stats']) def test__node_resource_no_instance_uuid(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' cpus = 2 mem = 512 disk = 10 arch = 'x86_64' properties = {'cpus': cpus, 'memory_mb': mem, 'local_gb': disk, 'cpu_arch': arch} node = get_test_node(uuid=node_uuid, instance_uuid=None, properties=properties) result = self.driver._node_resource(node) self.assertEqual(cpus, result['vcpus']) self.assertEqual(0, result['vcpus_used']) self.assertEqual(mem, result['memory_mb']) self.assertEqual(0, result['memory_mb_used']) self.assertEqual(disk, result['local_gb']) self.assertEqual(0, result['local_gb_used']) self.assertEqual(node_uuid, result['hypervisor_hostname']) self.assertEqual('{"cpu_arch": "x86_64", "ironic_driver": "' 'nova.virt.ironic.driver.IronicDriver", ' '"test_spec": "test_value"}', result['stats']) def test__retry_on_conflict(self): test_list = [] def test_func(test_list): test_list.append(1) self.driver._retry_on_conflict(test_func, test_list) self.assertIn(1, test_list) def test__retry_on_conflict_fail(self): CONF.set_default('api_max_retries', default=1, group='ironic') CONF.set_default('api_retry_interval', default=0, group='ironic') def test_func(): raise ironic_exception.HTTPConflict() self.assertRaises(ironic_driver.MaximumRetriesReached, self.driver._retry_on_conflict, test_func) def test__start_firewall(self): func_list = ['setup_basic_filtering', 'prepare_instance_filter', 'apply_instance_filter'] patch_list = [mock.patch.object(self.driver.firewall_driver, func) for func in func_list] mock_list = [patcher.start() for patcher in patch_list] for p in patch_list: self.addCleanup(p.stop) fake_inst = 'fake-inst' fake_net_info = utils.get_test_network_info() self.driver._start_firewall(fake_inst, fake_net_info) # assert all methods were invoked with the right args for m in mock_list: m.assert_called_once_with(fake_inst, fake_net_info) def test__stop_firewall(self): fake_inst = 'fake-inst' fake_net_info = utils.get_test_network_info() with mock.patch.object(self.driver.firewall_driver, 'unfilter_instance') as mock_ui: self.driver._stop_firewall(fake_inst, fake_net_info) mock_ui.assert_called_once_with(fake_inst, fake_net_info) def test_list_instances(self): num_nodes = 2 nodes = [] for n in range(num_nodes): nodes.append(get_test_node( instance_uuid=uuidutils.generate_uuid())) # append a node w/o instance_uuid which shouldn't be listed nodes.append(get_test_node(instance_uuid=None)) with mock.patch.object(FAKE_CLIENT.node, 'list') as mock_list: mock_list.return_value = nodes expected = [n for n in nodes if n.instance_uuid] instances = self.driver.list_instances() self.assertEqual(sorted(expected), sorted(instances)) self.assertEqual(num_nodes, len(instances)) def test_get_available_nodes(self): num_nodes = 2 nodes = [] for n in range(num_nodes): nodes.append(get_test_node(uuid=uuidutils.generate_uuid(), power_state=ironic_states.POWER_OFF)) # append a node w/o power_state which shouldn't be listed nodes.append(get_test_node(power_state=None)) with mock.patch.object(FAKE_CLIENT.node, 'list') as mock_list: mock_list.return_value = nodes expected = [n.uuid for n in nodes if n.power_state] available_nodes = self.driver.get_available_nodes() self.assertEqual(sorted(expected), sorted(available_nodes)) self.assertEqual(num_nodes, len(available_nodes)) def test_get_available_resource(self): node = get_test_node() fake_resource = 'fake-resource' mock_get = mock.patch.object(FAKE_CLIENT.node, 'get').start() mock_get.return_value = node self.addCleanup(mock_get.stop) with mock.patch.object(self.driver, '_node_resource') as mock_nr: mock_nr.return_value = fake_resource result = self.driver.get_available_resource(node.uuid) self.assertEqual(fake_resource, result) mock_nr.assert_called_once_with(node) def test_get_info(self): instance_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' properties = {'memory_mb': 512, 'cpus': 2} power_state = ironic_states.POWER_ON node = get_test_node(instance_uuid=instance_uuid, properties=properties, power_state=power_state) with mock.patch.object(FAKE_CLIENT.node, 'get_by_instance_uuid') \ as mock_gbiu: mock_gbiu.return_value = node # ironic_states.POWER_ON should me be mapped to # nova_states.RUNNING expected = {'state': nova_states.RUNNING, 'max_mem': properties['memory_mb'], 'mem': properties['memory_mb'], 'num_cpu': properties['cpus'], 'cpu_time': 0} instance = fake_instance.fake_instance_obj('fake-context', uuid=instance_uuid) result = self.driver.get_info(instance) self.assertEqual(expected, result) def test_get_info_http_not_found(self): with mock.patch.object(FAKE_CLIENT.node, 'get_by_instance_uuid') \ as mock_gbiu: mock_gbiu.side_effect = ironic_exception.HTTPNotFound() expected = {'state': nova_states.NOSTATE, 'max_mem': 0, 'mem': 0, 'num_cpu': 0, 'cpu_time': 0} instance = fake_instance.fake_instance_obj( self.ctx, uuid=uuidutils.generate_uuid()) result = self.driver.get_info(instance) self.assertEqual(expected, result) def test_macs_for_instance(self): node = get_test_node() port = get_test_port() mock_get = mock.patch.object(FAKE_CLIENT.node, 'get').start() mock_get.return_value = node self.addCleanup(mock_get.stop) with mock.patch.object(FAKE_CLIENT.node, 'list_ports') as mock_lp: mock_lp.return_value = [port] instance = fake_instance.fake_instance_obj(self.ctx, node=node.uuid) result = self.driver.macs_for_instance(instance) self.assertEqual([port.address], result) mock_lp.assert_called_once_with(node.uuid) def test_macs_for_instance_http_not_found(self): with mock.patch.object(FAKE_CLIENT.node, 'get') as mock_get: mock_get.side_effect = ironic_exception.HTTPNotFound() instance = fake_instance.fake_instance_obj( self.ctx, node=uuidutils.generate_uuid()) result = self.driver.macs_for_instance(instance) self.assertEqual([], result) def test_spawn(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' node = get_test_node(driver='fake', uuid=node_uuid) instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) fake_flavor = 'fake-flavor' mock_get = mock.patch.object(FAKE_CLIENT.node, 'get').start() mock_get.return_value = node self.addCleanup(mock_get.stop) mock_fg = mock.patch.object(self.driver.virtapi, 'flavor_get').start() mock_fg.return_value = fake_flavor self.addCleanup(mock_fg.stop) mock_validate = mock.patch.object(FAKE_CLIENT.node, 'validate').start() mock_validate.return_value = get_test_validation() self.addCleanup(mock_validate.stop) mock_adf = mock.patch.object(self.driver, '_add_driver_fields').start() self.addCleanup(mock_adf.stop) mock_pvifs = mock.patch.object(self.driver, 'plug_vifs').start() self.addCleanup(mock_pvifs.stop) mock_sf = mock.patch.object(self.driver, '_start_firewall').start() self.addCleanup(mock_pvifs.stop) with mock.patch.object(FAKE_CLIENT.node, 'set_provision_state') \ as mock_sps: self.driver.spawn(self.ctx, instance, None, [], None) mock_get.assert_called_once_with(node_uuid) mock_validate.assert_called_once_with(node_uuid) mock_fg.assert_called_once_with(self.ctx, instance['instance_type_id']) mock_adf.assert_called_once_with(node, instance, None, fake_flavor) mock_pvifs.assert_called_once_with(instance, None) mock_sf.assert_called_once_with(instance, None) mock_sps.assert_called_once_with(node_uuid, 'active') def test_spawn_setting_instance_uuid_fail(self): instance = fake_instance.fake_instance_obj(self.ctx, node=uuidutils.generate_uuid()) with mock.patch.object(FAKE_CLIENT.node, 'update') as mock_update: mock_update.side_effect = ironic_exception.HTTPBadRequest() self.assertRaises(exception.NovaException, self.driver.spawn, self.ctx, instance, None, [], None) def test_spawn_node_driver_validation_fail(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' node = get_test_node(driver='fake', uuid=node_uuid) instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) fake_flavor = 'fake-flavor' mock_get = mock.patch.object(FAKE_CLIENT.node, 'get').start() mock_get.return_value = node self.addCleanup(mock_get.stop) mock_fg = mock.patch.object(self.driver.virtapi, 'flavor_get').start() mock_fg.return_value = fake_flavor self.addCleanup(mock_fg.stop) mock_adf = mock.patch.object(self.driver, '_add_driver_fields').start() self.addCleanup(mock_adf.stop) with mock.patch.object(FAKE_CLIENT.node, 'validate') as mock_validate: mock_validate.return_value = get_test_validation(power=False, deploy=False) self.assertRaises(exception.ValidationError, self.driver.spawn, self.ctx, instance, None, [], None) mock_get.assert_called_once_with(node_uuid) mock_validate.assert_called_once_with(node_uuid) mock_fg.assert_called_once_with(self.ctx, instance['instance_type_id']) mock_adf.assert_called_once_with(node, instance, None, fake_flavor) def test_spawn_node_prepare_for_deploy_fail(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' node = get_test_node(driver='fake', uuid=node_uuid) instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) mock_get = mock.patch.object(FAKE_CLIENT.node, 'get').start() mock_get.return_value = node self.addCleanup(mock_get.stop) mock_validate = mock.patch.object(FAKE_CLIENT.node, 'validate').start() mock_validate.return_value = get_test_validation() self.addCleanup(mock_validate.stop) mock_fg = mock.patch.object(self.driver.virtapi, 'flavor_get').start() self.addCleanup(mock_fg.stop) mock_pvifs = mock.patch.object(self.driver, 'plug_vifs').start() self.addCleanup(mock_pvifs.stop) mock_upvifs = mock.patch.object(self.driver, 'unplug_vifs').start() self.addCleanup(mock_upvifs.stop) mock_stof = mock.patch.object(self.driver, '_stop_firewall').start() self.addCleanup(mock_stof.stop) class TestException(Exception): pass with mock.patch.object(self.driver, '_start_firewall') as mock_sf: mock_sf.side_effect = TestException() self.assertRaises(TestException, self.driver.spawn, self.ctx, instance, None, [], None) mock_get.assert_called_once_with(node_uuid) mock_validate.assert_called_once_with(node_uuid) mock_fg.assert_called_once_with(self.ctx, instance['instance_type_id']) mock_upvifs.assert_called_once_with(instance, None) mock_stof.assert_called_once_with(instance, None) def test_spawn_node_trigger_deploy_fail(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' node = get_test_node(driver='fake', uuid=node_uuid) instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) mock_get = mock.patch.object(FAKE_CLIENT.node, 'get').start() mock_get.return_value = node self.addCleanup(mock_get.stop) mock_validate = mock.patch.object(FAKE_CLIENT.node, 'validate').start() mock_validate.return_value = get_test_validation() self.addCleanup(mock_validate.stop) mock_fg = mock.patch.object(self.driver.virtapi, 'flavor_get').start() self.addCleanup(mock_fg.stop) mock_pvifs = mock.patch.object(self.driver, 'plug_vifs').start() self.addCleanup(mock_pvifs.stop) mock_sf = mock.patch.object(self.driver, '_start_firewall').start() self.addCleanup(mock_sf.stop) mock_upvifs = mock.patch.object(self.driver, 'unplug_vifs').start() self.addCleanup(mock_upvifs.stop) mock_stof = mock.patch.object(self.driver, '_stop_firewall').start() self.addCleanup(mock_stof.stop) with mock.patch.object(FAKE_CLIENT.node, 'set_provision_state') \ as mock_sps: mock_sps.side_effect = ironic_driver.MaximumRetriesReached self.assertRaises(exception.NovaException, self.driver.spawn, self.ctx, instance, None, [], None) mock_get.assert_called_once_with(node_uuid) mock_validate.assert_called_once_with(node_uuid) mock_fg.assert_called_once_with(self.ctx, instance['instance_type_id']) mock_upvifs.assert_called_once_with(instance, None) mock_stof.assert_called_once_with(instance, None) def test_destroy(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' node = get_test_node(driver='fake', uuid=node_uuid) instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) mock_get = mock.patch.object(FAKE_CLIENT.node, 'get').start() mock_get.return_value = node self.addCleanup(mock_get.stop) mock_sps = mock.patch.object(FAKE_CLIENT.node, 'set_provision_state').start() self.addCleanup(mock_sps.stop) mock_update = mock.patch.object(FAKE_CLIENT.node, 'update').start() self.addCleanup(mock_update.stop) mock_upvifs = mock.patch.object(self.driver, 'unplug_vifs').start() self.addCleanup(mock_upvifs.stop) mock_stof = mock.patch.object(self.driver, '_stop_firewall').start() self.addCleanup(mock_stof.stop) self.driver.destroy(self.ctx, instance, None, None) mock_sps.assert_called_once_with(node_uuid, 'deleted') mock_get.assert_called_with(node_uuid) mock_upvifs.assert_called_once_with(instance, None) mock_stof.assert_called_once_with(instance, None) def test_destroy_trigger_undeploy_fail(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) with mock.patch.object(FAKE_CLIENT.node, 'set_provision_state') \ as mock_sps: mock_sps.side_effect = ironic_driver.MaximumRetriesReached self.assertRaises(exception.NovaException, self.driver.destroy, self.ctx, instance, None, None) def test_destroy_unprovision_fail(self): CONF.set_default('api_max_retries', default=1, group='ironic') CONF.set_default('api_retry_interval', default=0, group='ironic') node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' node = get_test_node(driver='fake', uuid=node_uuid, provision_state='fake-state') instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) mock_get = mock.patch.object(FAKE_CLIENT.node, 'get').start() mock_get.return_value = node self.addCleanup(mock_get.stop) mock_sps = mock.patch.object(FAKE_CLIENT.node, 'set_provision_state').start() self.addCleanup(mock_sps.stop) self.assertRaises(exception.NovaException, self.driver.destroy, self.ctx, instance, None, None) mock_sps.assert_called_once_with(node_uuid, 'deleted') def test_destroy_unassociate_fail(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' node = get_test_node(driver='fake', uuid=node_uuid) instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) mock_get = mock.patch.object(FAKE_CLIENT.node, 'get').start() mock_get.return_value = node self.addCleanup(mock_get.stop) mock_sps = mock.patch.object(FAKE_CLIENT.node, 'set_provision_state').start() self.addCleanup(mock_sps.stop) with mock.patch.object(FAKE_CLIENT.node, 'update') as mock_update: mock_update.side_effect = ironic_driver.MaximumRetriesReached() self.assertRaises(exception.NovaException, self.driver.destroy, self.ctx, instance, None, None) mock_sps.assert_called_once_with(node_uuid, 'deleted') mock_get.assert_called_with(node_uuid) def test_reboot(self): #TODO(lucasagomes): Not implemented in the driver.py pass def test_power_off(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) with mock.patch.object(FAKE_CLIENT.node, 'set_power_state') as mock_sp: self.driver.power_off(instance) mock_sp.assert_called_once_with(node_uuid, 'off') def test_power_on(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) with mock.patch.object(FAKE_CLIENT.node, 'set_power_state') as mock_sp: self.driver.power_on(self.ctx, instance, utils.get_test_network_info()) mock_sp.assert_called_once_with(node_uuid, 'on') def test_get_host_stats(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' cpu_arch = 'x86_64' node = get_test_node(uuid=node_uuid, properties={'cpu_arch': cpu_arch}) supported_instances = 'fake-supported-instances' resource = {'supported_instances': supported_instances, 'hypervisor_hostname': uuidutils.generate_uuid(), 'cpu_info': 'baremetal cpu', 'hypervisor_version': 1, 'local_gb': 10, 'memory_mb_used': 512, 'stats': {'cpu_arch': 'x86_64', 'ironic_driver': 'nova.virt.ironic.driver.IronicDriver', 'test_spec': 'test_value'}, 'vcpus_used': 2, 'hypervisor_type': 'ironic', 'local_gb_used': 10, 'memory_mb': 512, 'vcpus': 2} # Reset driver specs test_extra_spec = 'test-spec' self.driver.extra_specs = {test_extra_spec: test_extra_spec} with mock.patch.object(FAKE_CLIENT.node, 'list') as mock_list: mock_list.return_value = [node] with mock.patch.object(self.driver, '_node_resource') as mock_nr: mock_nr.return_value = resource with mock.patch.object(ironic_driver, '_get_nodes_supported_instances') as mock_gnsi: mock_gnsi.return_value = supported_instances expected = {'vcpus': resource['vcpus'], 'vcpus_used': resource['vcpus_used'], 'cpu_info': resource['cpu_info'], 'disk_total': resource['local_gb'], 'disk_used': resource['local_gb'], 'disk_available': 0, 'host_memory_total': resource['memory_mb'], 'host_memory_free': 0, 'hypervisor_type': resource['hypervisor_type'], 'hypervisor_version': resource['hypervisor_version'], 'supported_instances': supported_instances, 'host': CONF.host, 'hypervisor_hostname': node_uuid, 'node': node_uuid, 'cpu_arch': cpu_arch, test_extra_spec: test_extra_spec} result = self.driver.get_host_stats() self.assertEqual([expected], result) def test_plug_vifs(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' node = get_test_node(uuid=node_uuid) port = get_test_port() mock_get = mock.patch.object(FAKE_CLIENT.node, 'get').start() mock_get.return_value = node self.addCleanup(mock_get.stop) mock_uvifs = mock.patch.object(self.driver, 'unplug_vifs').start() self.addCleanup(mock_uvifs.stop) mock_update = mock.patch.object(FAKE_CLIENT.port, 'update').start() self.addCleanup(mock_update.stop) with mock.patch.object(FAKE_CLIENT.node, 'list_ports') as mock_lp: mock_lp.return_value = [port] instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) network_info = utils.get_test_network_info() port_id = unicode(network_info[0]['id']) expected_patch = [{'op': 'add', 'path': '/extra/vif_port_id', 'value': port_id}] self.driver.plug_vifs(instance, network_info) # asserts mock_uvifs.assert_called_once_with(instance, network_info) mock_get.assert_called_once_with(node_uuid) mock_lp.assert_called_once_with(node_uuid) mock_update.assert_called_once_with(port.uuid, expected_patch) def test_plug_vifs_count_missmatch(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' node = get_test_node(uuid=node_uuid) port = get_test_port() mock_get = mock.patch.object(FAKE_CLIENT.node, 'get').start() mock_get.return_value = node self.addCleanup(mock_get.stop) mock_uvifs = mock.patch.object(self.driver, 'unplug_vifs').start() self.addCleanup(mock_uvifs.stop) mock_update = mock.patch.object(FAKE_CLIENT.port, 'update').start() self.addCleanup(mock_update.stop) with mock.patch.object(FAKE_CLIENT.node, 'list_ports') as mock_lp: mock_lp.return_value = [port] instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) # len(network_info) > len(ports) network_info = (utils.get_test_network_info() + utils.get_test_network_info()) self.assertRaises(exception.NovaException, self.driver.plug_vifs, instance, network_info) # asserts mock_uvifs.assert_called_once_with(instance, network_info) mock_get.assert_called_once_with(node_uuid) mock_lp.assert_called_once_with(node_uuid) # assert port.update() was not called assert not mock_update.called def test_plug_vifs_no_network_info(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' node = get_test_node(uuid=node_uuid) port = get_test_port() mock_get = mock.patch.object(FAKE_CLIENT.node, 'get').start() mock_get.return_value = node self.addCleanup(mock_get.stop) mock_uvifs = mock.patch.object(self.driver, 'unplug_vifs').start() self.addCleanup(mock_uvifs.stop) mock_update = mock.patch.object(FAKE_CLIENT.port, 'update').start() self.addCleanup(mock_update.stop) with mock.patch.object(FAKE_CLIENT.node, 'list_ports') as mock_lp: mock_lp.return_value = [port] instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) network_info = [] self.driver.plug_vifs(instance, network_info) # asserts mock_uvifs.assert_called_once_with(instance, network_info) mock_get.assert_called_once_with(node_uuid) mock_lp.assert_called_once_with(node_uuid) # assert port.update() was not called assert not mock_update.called def test_unplug_vifs(self): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' node = get_test_node(uuid=node_uuid) port = get_test_port() mock_update = mock.patch.object(FAKE_CLIENT.port, 'update').start() self.addCleanup(mock_update.stop) mock_get = mock.patch.object(FAKE_CLIENT.node, 'get').start() mock_get.return_value = node self.addCleanup(mock_get.stop) with mock.patch.object(FAKE_CLIENT.node, 'list_ports') as mock_lp: mock_lp.return_value = [port] instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) expected_patch = [{'op': 'remove', 'path': '/extra/vif_port_id'}] self.driver.unplug_vifs(instance, utils.get_test_network_info()) # asserts mock_get.assert_called_once_with(node_uuid) mock_lp.assert_called_once_with(node_uuid) mock_update.assert_called_once_with(port.uuid, expected_patch) def test_unplug_vifs_no_network_info(self): mock_update = mock.patch.object(FAKE_CLIENT.port, 'update').start() self.addCleanup(mock_update.stop) instance = fake_instance.fake_instance_obj(self.ctx) network_info = [] self.driver.unplug_vifs(instance, network_info) # assert port.update() was not called assert not mock_update.called ironic-2014.1.rc1/ironic/nova/tests/scheduler/0000775000175300017540000000000012316614636022263 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/nova/tests/scheduler/ironic_fakes.py0000664000175300017540000001034312316614116025263 0ustar jenkinsjenkins00000000000000# Copyright 2014 OpenStack Foundation # 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. """ Fake nodes for Ironic host manager tests. """ COMPUTE_NODES = [ dict(id=1, local_gb=10, memory_mb=1024, vcpus=1, vcpus_used=0, local_gb_used=0, memory_mb_used=0, updated_at=None, cpu_info='baremetal cpu', service=dict(host='host1', disabled=False), hypervisor_hostname='node1uuid', host_ip='127.0.0.1', hypervisor_version=1, hypervisor_type='ironic', stats=dict(ironic_driver= "nova.virt.ironic.driver.IronicDriver", cpu_arch='i386'), supported_instances='[["i386", "baremetal", "baremetal"]]', free_disk_gb=10, free_ram_mb=1024), dict(id=2, local_gb=20, memory_mb=2048, vcpus=1, vcpus_used=0, local_gb_used=0, memory_mb_used=0, updated_at=None, cpu_info='baremetal cpu', service=dict(host='host2', disabled=True), hypervisor_hostname='node2uuid', host_ip='127.0.0.1', hypervisor_version=1, hypervisor_type='ironic', stats=dict(ironic_driver= "nova.virt.ironic.driver.IronicDriver", cpu_arch='i386'), supported_instances='[["i386", "baremetal", "baremetal"]]', free_disk_gb=20, free_ram_mb=2048), dict(id=3, local_gb=30, memory_mb=3072, vcpus=1, vcpus_used=0, local_gb_used=0, memory_mb_used=0, updated_at=None, cpu_info='baremetal cpu', service=dict(host='host3', disabled=False), hypervisor_hostname='node3uuid', host_ip='127.0.0.1', hypervisor_version=1, hypervisor_type='ironic', stats=dict(ironic_driver= "nova.virt.ironic.driver.IronicDriver", cpu_arch='i386'), supported_instances='[["i386", "baremetal", "baremetal"]]', free_disk_gb=30, free_ram_mb=3072), dict(id=4, local_gb=40, memory_mb=4096, vcpus=1, vcpus_used=0, local_gb_used=0, memory_mb_used=0, updated_at=None, cpu_info='baremetal cpu', service=dict(host='host4', disabled=False), hypervisor_hostname='node4uuid', host_ip='127.0.0.1', hypervisor_version=1, hypervisor_type='ironic', stats=dict(ironic_driver= "nova.virt.ironic.driver.IronicDriver", cpu_arch='i386'), supported_instances='[["i386", "baremetal", "baremetal"]]', free_disk_gb=40, free_ram_mb=4096), # Broken entry dict(id=5, local_gb=50, memory_mb=5120, vcpus=1, service=None, cpu_info='baremetal cpu', stats=dict(ironic_driver= "nova.virt.ironic.driver.IronicDriver", cpu_arch='i386'), supported_instances='[["i386", "baremetal", "baremetal"]]', free_disk_gb=50, free_ram_mb=5120), ] IRONIC_SERVICE_STATE = { ('host1', 'node1uuid'): {'compute': {'ironic_driver': "nova.virt.ironic.driver.IronicDriver"}}, ('host2', 'node2uuid'): {'compute': {'ironic_driver': "nova.virt.ironic.driver.IronicDriver"}}, ('host3', 'node3uuid'): {'compute': {'ironic_driver': "nova.virt.ironic.driver.IronicDriver"}}, ('host4', 'node4uuid'): {'compute': {'ironic_driver': "nova.virt.ironic.driver.IronicDriver"}}, ('host5', 'node5uuid'): {'compute': {'ironic_driver': "nova.virt.ironic.driver.IronicDriver"}}, } ironic-2014.1.rc1/ironic/nova/tests/scheduler/test_ironic_host_manager.py0000664000175300017540000004237212316614116027707 0ustar jenkinsjenkins00000000000000# Copyright (c) 2014 OpenStack Foundation # Copyright (c) 2011 OpenStack Foundation # 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. """ Tests For IronicHostManager """ from nova import db from nova import exception from nova.scheduler import filters from nova.scheduler import ironic_host_manager from nova import test from nova.tests.scheduler import ironic_fakes class FakeFilterClass1(filters.BaseHostFilter): def host_passes(self, host_state, filter_properties): pass class FakeFilterClass2(filters.BaseHostFilter): def host_passes(self, host_state, filter_properties): pass class IronicHostManagerTestCase(test.NoDBTestCase): """Test case for IronicHostManager class.""" def setUp(self): super(IronicHostManagerTestCase, self).setUp() self.host_manager = ironic_host_manager.IronicHostManager() self.fake_hosts = [ironic_host_manager.IronicNodeState( 'fake_host%s' % x, 'fake-node') for x in range(1, 5)] self.fake_hosts += [ironic_host_manager.IronicNodeState( 'fake_multihost', 'fake-node%s' % x) for x in range(1, 5)] def test_get_all_host_states(self): # Ensure .service is set and we have the values we expect to. context = 'fake_context' self.mox.StubOutWithMock(db, 'compute_node_get_all') db.compute_node_get_all(context).AndReturn(ironic_fakes.COMPUTE_NODES) self.mox.ReplayAll() self.host_manager.service_states = ironic_fakes.IRONIC_SERVICE_STATE self.host_manager.get_all_host_states(context) host_states_map = self.host_manager.host_state_map self.assertEqual(len(host_states_map), 4) # Check that .service is set properly for i in range(4): compute_node = ironic_fakes.COMPUTE_NODES[i] host = compute_node['service']['host'] node = compute_node['hypervisor_hostname'] state_key = (host, node) self.assertEqual(compute_node['service'], host_states_map[state_key].service) # check we have the values we think we should. self.assertEqual(1024, host_states_map[('host1', 'node1uuid')].free_ram_mb) self.assertEqual(10240, host_states_map[('host1', 'node1uuid')].free_disk_mb) self.assertEqual(2048, host_states_map[('host2', 'node2uuid')].free_ram_mb) self.assertEqual(20480, host_states_map[('host2', 'node2uuid')].free_disk_mb) self.assertEqual(3072, host_states_map[('host3', 'node3uuid')].free_ram_mb) self.assertEqual(30720, host_states_map[('host3', 'node3uuid')].free_disk_mb) self.assertEqual(4096, host_states_map[('host4', 'node4uuid')].free_ram_mb) self.assertEqual(40960, host_states_map[('host4', 'node4uuid')].free_disk_mb) class IronicHostManagerChangedNodesTestCase(test.NoDBTestCase): """Test case for IronicHostManager class.""" def setUp(self): super(IronicHostManagerChangedNodesTestCase, self).setUp() self.host_manager = ironic_host_manager.IronicHostManager() self.fake_hosts = [ ironic_host_manager.IronicNodeState('host1', 'node1uuid'), ironic_host_manager.IronicNodeState('host2', 'node2uuid'), ironic_host_manager.IronicNodeState('host3', 'node3uuid'), ironic_host_manager.IronicNodeState('host4', 'node4uuid') ] self.compute_node = dict(id=1, local_gb=10, memory_mb=1024, vcpus=1, vcpus_used=0, local_gb_used=0, memory_mb_used=0, updated_at=None, cpu_info='baremetal cpu', stats=dict(ironic_driver= "nova.virt.ironic.driver.IronicDriver", cpu_arch='i386'), supported_instances= '[["i386", "baremetal", "baremetal"]]', free_disk_gb=10, free_ram_mb=1024) def test_get_all_host_states(self): context = 'fake_context' self.mox.StubOutWithMock(db, 'compute_node_get_all') db.compute_node_get_all(context).AndReturn(ironic_fakes.COMPUTE_NODES) self.mox.ReplayAll() self.host_manager.service_states = ironic_fakes.IRONIC_SERVICE_STATE self.host_manager.get_all_host_states(context) host_states_map = self.host_manager.host_state_map self.assertEqual(4, len(host_states_map)) def test_get_all_host_states_after_delete_one(self): context = 'fake_context' self.mox.StubOutWithMock(db, 'compute_node_get_all') # all nodes active for first call db.compute_node_get_all(context).AndReturn(ironic_fakes.COMPUTE_NODES) # remove node4 for second call running_nodes = [n for n in ironic_fakes.COMPUTE_NODES if n.get('hypervisor_hostname') != 'node4uuid'] db.compute_node_get_all(context).AndReturn(running_nodes) self.mox.ReplayAll() self.host_manager.service_states = ironic_fakes.IRONIC_SERVICE_STATE self.host_manager.get_all_host_states(context) self.host_manager.get_all_host_states(context) host_states_map = self.host_manager.host_state_map self.assertEqual(3, len(host_states_map)) def test_get_all_host_states_after_delete_all(self): context = 'fake_context' self.mox.StubOutWithMock(db, 'compute_node_get_all') # all nodes active for first call db.compute_node_get_all(context).AndReturn(ironic_fakes.COMPUTE_NODES) # remove all nodes for second call db.compute_node_get_all(context).AndReturn([]) self.mox.ReplayAll() self.host_manager.service_states = ironic_fakes.IRONIC_SERVICE_STATE self.host_manager.get_all_host_states(context) self.host_manager.get_all_host_states(context) host_states_map = self.host_manager.host_state_map self.assertEqual(0, len(host_states_map)) def test_update_from_compute_node(self): host = ironic_host_manager.IronicNodeState("fakehost", "fakenode") host.update_from_compute_node(self.compute_node) self.assertEqual(1024, host.free_ram_mb) self.assertEqual(1024, host.total_usable_ram_mb) self.assertEqual(10240, host.free_disk_mb) self.assertEqual(1, host.vcpus_total) self.assertEqual(0, host.vcpus_used) def test_consume_identical_instance_from_compute(self): host = ironic_host_manager.IronicNodeState("fakehost", "fakenode") host.update_from_compute_node(self.compute_node) instance = dict(root_gb=10, ephemeral_gb=0, memory_mb=1024, vcpus=1) host.consume_from_instance(instance) self.assertEqual(1, host.vcpus_used) self.assertEqual(0, host.free_ram_mb) self.assertEqual(0, host.free_disk_mb) def test_consume_larger_instance_from_compute(self): host = ironic_host_manager.IronicNodeState("fakehost", "fakenode") host.update_from_compute_node(self.compute_node) instance = dict(root_gb=20, ephemeral_gb=0, memory_mb=2048, vcpus=2) host.consume_from_instance(instance) self.assertEqual(1, host.vcpus_used) self.assertEqual(0, host.free_ram_mb) self.assertEqual(0, host.free_disk_mb) def test_consume_smaller_instance_from_compute(self): host = ironic_host_manager.IronicNodeState("fakehost", "fakenode") host.update_from_compute_node(self.compute_node) instance = dict(root_gb=5, ephemeral_gb=0, memory_mb=512, vcpus=1) host.consume_from_instance(instance) self.assertEqual(1, host.vcpus_used) self.assertEqual(0, host.free_ram_mb) self.assertEqual(0, host.free_disk_mb) class IronicHostManagerTestFilters(test.NoDBTestCase): """Test filters work for IronicHostManager.""" def setUp(self): super(IronicHostManagerTestFilters, self).setUp() self.host_manager = ironic_host_manager.IronicHostManager() self.fake_hosts = [ironic_host_manager.IronicNodeState( 'fake_host%s' % x, 'fake-node') for x in range(1, 5)] self.fake_hosts += [ironic_host_manager.IronicNodeState( 'fake_multihost', 'fake-node%s' % x) for x in range(1, 5)] def test_choose_host_filters_not_found(self): self.flags(scheduler_default_filters='FakeFilterClass3') self.host_manager.filter_classes = [FakeFilterClass1, FakeFilterClass2] self.assertRaises(exception.SchedulerHostFilterNotFound, self.host_manager._choose_host_filters, None) def test_choose_host_filters(self): self.flags(scheduler_default_filters=['FakeFilterClass2']) self.host_manager.filter_classes = [FakeFilterClass1, FakeFilterClass2] # Test we returns 1 correct function filter_classes = self.host_manager._choose_host_filters(None) self.assertEqual(1, len(filter_classes)) self.assertEqual('FakeFilterClass2', filter_classes[0].__name__) def _mock_get_filtered_hosts(self, info, specified_filters=None): self.mox.StubOutWithMock(self.host_manager, '_choose_host_filters') info['got_objs'] = [] info['got_fprops'] = [] def fake_filter_one(_self, obj, filter_props): info['got_objs'].append(obj) info['got_fprops'].append(filter_props) return True self.stubs.Set(FakeFilterClass1, '_filter_one', fake_filter_one) self.host_manager._choose_host_filters(specified_filters).AndReturn( [FakeFilterClass1]) def _verify_result(self, info, result, filters=True): for x in info['got_fprops']: self.assertEqual(x, info['expected_fprops']) if filters: self.assertEqual(set(info['expected_objs']), set(info['got_objs'])) self.assertEqual(set(info['expected_objs']), set(result)) def test_get_filtered_hosts(self): fake_properties = {'moo': 1, 'cow': 2} info = {'expected_objs': self.fake_hosts, 'expected_fprops': fake_properties} self._mock_get_filtered_hosts(info) self.mox.ReplayAll() result = self.host_manager.get_filtered_hosts(self.fake_hosts, fake_properties) self._verify_result(info, result) def test_get_filtered_hosts_with_specified_filters(self): fake_properties = {'moo': 1, 'cow': 2} specified_filters = ['FakeFilterClass1', 'FakeFilterClass2'] info = {'expected_objs': self.fake_hosts, 'expected_fprops': fake_properties} self._mock_get_filtered_hosts(info, specified_filters) self.mox.ReplayAll() result = self.host_manager.get_filtered_hosts(self.fake_hosts, fake_properties, filter_class_names=specified_filters) self._verify_result(info, result) def test_get_filtered_hosts_with_ignore(self): fake_properties = {'ignore_hosts': ['fake_host1', 'fake_host3', 'fake_host5', 'fake_multihost']} # [1] and [3] are host2 and host4 info = {'expected_objs': [self.fake_hosts[1], self.fake_hosts[3]], 'expected_fprops': fake_properties} self._mock_get_filtered_hosts(info) self.mox.ReplayAll() result = self.host_manager.get_filtered_hosts(self.fake_hosts, fake_properties) self._verify_result(info, result) def test_get_filtered_hosts_with_force_hosts(self): fake_properties = {'force_hosts': ['fake_host1', 'fake_host3', 'fake_host5']} # [0] and [2] are host1 and host3 info = {'expected_objs': [self.fake_hosts[0], self.fake_hosts[2]], 'expected_fprops': fake_properties} self._mock_get_filtered_hosts(info) self.mox.ReplayAll() result = self.host_manager.get_filtered_hosts(self.fake_hosts, fake_properties) self._verify_result(info, result, False) def test_get_filtered_hosts_with_no_matching_force_hosts(self): fake_properties = {'force_hosts': ['fake_host5', 'fake_host6']} info = {'expected_objs': [], 'expected_fprops': fake_properties} self._mock_get_filtered_hosts(info) self.mox.ReplayAll() result = self.host_manager.get_filtered_hosts(self.fake_hosts, fake_properties) self._verify_result(info, result, False) def test_get_filtered_hosts_with_ignore_and_force_hosts(self): # Ensure ignore_hosts processed before force_hosts in host filters. fake_properties = {'force_hosts': ['fake_host3', 'fake_host1'], 'ignore_hosts': ['fake_host1']} # only fake_host3 should be left. info = {'expected_objs': [self.fake_hosts[2]], 'expected_fprops': fake_properties} self._mock_get_filtered_hosts(info) self.mox.ReplayAll() result = self.host_manager.get_filtered_hosts(self.fake_hosts, fake_properties) self._verify_result(info, result, False) def test_get_filtered_hosts_with_force_host_and_many_nodes(self): # Ensure all nodes returned for a host with many nodes fake_properties = {'force_hosts': ['fake_multihost']} info = {'expected_objs': [self.fake_hosts[4], self.fake_hosts[5], self.fake_hosts[6], self.fake_hosts[7]], 'expected_fprops': fake_properties} self._mock_get_filtered_hosts(info) self.mox.ReplayAll() result = self.host_manager.get_filtered_hosts(self.fake_hosts, fake_properties) self._verify_result(info, result, False) def test_get_filtered_hosts_with_force_nodes(self): fake_properties = {'force_nodes': ['fake-node2', 'fake-node4', 'fake-node9']} # [5] is fake-node2, [7] is fake-node4 info = {'expected_objs': [self.fake_hosts[5], self.fake_hosts[7]], 'expected_fprops': fake_properties} self._mock_get_filtered_hosts(info) self.mox.ReplayAll() result = self.host_manager.get_filtered_hosts(self.fake_hosts, fake_properties) self._verify_result(info, result, False) def test_get_filtered_hosts_with_force_hosts_and_nodes(self): # Ensure only overlapping results if both force host and node fake_properties = {'force_hosts': ['fake_host1', 'fake_multihost'], 'force_nodes': ['fake-node2', 'fake-node9']} # [5] is fake-node2 info = {'expected_objs': [self.fake_hosts[5]], 'expected_fprops': fake_properties} self._mock_get_filtered_hosts(info) self.mox.ReplayAll() result = self.host_manager.get_filtered_hosts(self.fake_hosts, fake_properties) self._verify_result(info, result, False) def test_get_filtered_hosts_with_force_hosts_and_wrong_nodes(self): # Ensure non-overlapping force_node and force_host yield no result fake_properties = {'force_hosts': ['fake_multihost'], 'force_nodes': ['fake-node']} info = {'expected_objs': [], 'expected_fprops': fake_properties} self._mock_get_filtered_hosts(info) self.mox.ReplayAll() result = self.host_manager.get_filtered_hosts(self.fake_hosts, fake_properties) self._verify_result(info, result, False) def test_get_filtered_hosts_with_ignore_hosts_and_force_nodes(self): # Ensure ignore_hosts can coexist with force_nodes fake_properties = {'force_nodes': ['fake-node4', 'fake-node2'], 'ignore_hosts': ['fake_host1', 'fake_host2']} info = {'expected_objs': [self.fake_hosts[5], self.fake_hosts[7]], 'expected_fprops': fake_properties} self._mock_get_filtered_hosts(info) self.mox.ReplayAll() result = self.host_manager.get_filtered_hosts(self.fake_hosts, fake_properties) self._verify_result(info, result, False) def test_get_filtered_hosts_with_ignore_hosts_and_force_same_nodes(self): # Ensure ignore_hosts is processed before force_nodes fake_properties = {'force_nodes': ['fake_node4', 'fake_node2'], 'ignore_hosts': ['fake_multihost']} info = {'expected_objs': [], 'expected_fprops': fake_properties} self._mock_get_filtered_hosts(info) self.mox.ReplayAll() result = self.host_manager.get_filtered_hosts(self.fake_hosts, fake_properties) self._verify_result(info, result, False) ironic-2014.1.rc1/ironic/netconf.py0000664000175300017540000000322412316614116020200 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # Copyright 2012 Red Hat, Inc. # # 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 socket from oslo.config import cfg CONF = cfg.CONF def _get_my_ip(): """Returns the actual ip of the local machine. This code figures out what source address would be used if some traffic were to be sent out to some well known address on the Internet. In this case, a Google DNS server is used, but the specific address does not matter much. No traffic is actually sent. """ try: csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) csock.connect(('8.8.8.8', 80)) (addr, port) = csock.getsockname() csock.close() return addr except socket.error: return "127.0.0.1" netconf_opts = [ cfg.StrOpt('my_ip', default=_get_my_ip(), help='IP address of this host.'), cfg.BoolOpt('use_ipv6', default=False, help='Use IPv6.'), ] CONF.register_opts(netconf_opts) ironic-2014.1.rc1/ironic/tests/0000775000175300017540000000000012316614636017342 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/tests/test_dbsync.py0000664000175300017540000000173612316614116022235 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 ironic.db import migration from ironic.tests.db import base class DbSyncTestCase(base.DbTestCase): def setUp(self): super(DbSyncTestCase, self).setUp() def test_upgrade_and_version(self): migration.upgrade('head') v = migration.version() self.assertTrue(v) ironic-2014.1.rc1/ironic/tests/objects/0000775000175300017540000000000012316614636020773 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/tests/objects/test_node.py0000664000175300017540000001017512316614116023326 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 datetime import mock from ironic.db import api as db_api from ironic.db.sqlalchemy import models from ironic import objects from ironic.openstack.common import timeutils from ironic.tests.db import base from ironic.tests.db import utils class TestNodeObject(base.DbTestCase): def setUp(self): super(TestNodeObject, self).setUp() self.fake_node = utils.get_test_node() self.dbapi = db_api.get_instance() def test_load(self): uuid = self.fake_node['uuid'] with mock.patch.object(self.dbapi, 'get_node', autospec=True) as mock_get_node: mock_get_node.return_value = self.fake_node objects.Node.get_by_uuid(self.context, uuid) mock_get_node.assert_called_once_with(uuid) def test_save(self): uuid = self.fake_node['uuid'] with mock.patch.object(self.dbapi, 'get_node', autospec=True) as mock_get_node: mock_get_node.return_value = self.fake_node with mock.patch.object(self.dbapi, 'update_node', autospec=True) as mock_update_node: n = objects.Node.get_by_uuid(self.context, uuid) n.properties = {"fake": "property"} n.save() mock_get_node.assert_called_once_with(uuid) mock_update_node.assert_called_once_with( uuid, {'properties': {"fake": "property"}}) def test_refresh(self): uuid = self.fake_node['uuid'] returns = [dict(self.fake_node, properties={"fake": "first"}), dict(self.fake_node, properties={"fake": "second"})] expected = [mock.call(uuid), mock.call(uuid)] with mock.patch.object(self.dbapi, 'get_node', side_effect=returns, autospec=True) as mock_get_node: n = objects.Node.get_by_uuid(self.context, uuid) self.assertEqual({"fake": "first"}, n.properties) n.refresh() self.assertEqual({"fake": "second"}, n.properties) self.assertEqual(expected, mock_get_node.call_args_list) def test_objectify(self): def _get_db_node(): n = models.Node() n.update(self.fake_node) return n @objects.objectify(objects.Node) def _convert_db_node(): return _get_db_node() self.assertIsInstance(_get_db_node(), models.Node) self.assertIsInstance(_convert_db_node(), objects.Node) def test_objectify_deserialize_provision_updated_at(self): dt = timeutils.isotime(datetime.datetime(2000, 1, 1, 0, 0)) self.fake_node['provision_updated_at'] = dt def _get_db_node(): n = models.Node() n.update(self.fake_node) return n @objects.objectify(objects.Node) def _convert_db_node(): return _get_db_node() self.assertIsInstance(_get_db_node(), models.Node) self.assertIsInstance(_convert_db_node(), objects.Node) def test_objectify_many(self): def _get_db_nodes(): nodes = [] for i in range(5): n = models.Node() n.update(self.fake_node) nodes.append(n) return nodes @objects.objectify(objects.Node) def _convert_db_nodes(): return _get_db_nodes() for n in _get_db_nodes(): self.assertIsInstance(n, models.Node) for n in _convert_db_nodes(): self.assertIsInstance(n, objects.Node) ironic-2014.1.rc1/ironic/tests/objects/test_objects.py0000664000175300017540000004232512316614116024034 0ustar jenkinsjenkins00000000000000# Copyright 2013 IBM Corp. # # 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 contextlib import datetime import gettext import iso8601 import netaddr import six from ironic.common import exception from ironic.objects import base from ironic.objects import utils from ironic.openstack.common import context from ironic.openstack.common import timeutils from ironic.tests import base as test_base gettext.install('ironic') class MyObj(base.IronicObject): version = '1.5' fields = {'foo': int, 'bar': str, 'missing': str, } def obj_load_attr(self, attrname): setattr(self, attrname, 'loaded!') @base.remotable_classmethod def get(cls, context): obj = cls() obj.foo = 1 obj.bar = 'bar' obj.obj_reset_changes() return obj @base.remotable def marco(self, context): return 'polo' @base.remotable def update_test(self, context): if context.tenant == 'alternate': self.bar = 'alternate-context' else: self.bar = 'updated' @base.remotable def save(self, context): self.obj_reset_changes() @base.remotable def refresh(self, context): self.foo = 321 self.bar = 'refreshed' self.obj_reset_changes() @base.remotable def modify_save_modify(self, context): self.bar = 'meow' self.save() self.foo = 42 class MyObj2(object): @classmethod def obj_name(cls): return 'MyObj' @base.remotable_classmethod def get(cls, *args, **kwargs): pass class TestMetaclass(test_base.TestCase): def test_obj_tracking(self): @six.add_metaclass(base.IronicObjectMetaclass) class NewBaseClass(object): fields = {} @classmethod def obj_name(cls): return cls.__name__ class Test1(NewBaseClass): @staticmethod def obj_name(): return 'fake1' class Test2(NewBaseClass): pass class Test2v2(NewBaseClass): @staticmethod def obj_name(): return 'Test2' expected = {'fake1': [Test1], 'Test2': [Test2, Test2v2]} self.assertEqual(expected, NewBaseClass._obj_classes) # The following should work, also. self.assertEqual(expected, Test1._obj_classes) self.assertEqual(expected, Test2._obj_classes) class TestUtils(test_base.TestCase): def test_datetime_or_none(self): naive_dt = datetime.datetime.now() dt = timeutils.parse_isotime(timeutils.isotime(naive_dt)) self.assertEqual(utils.datetime_or_none(dt), dt) self.assertEqual(utils.datetime_or_none(dt), naive_dt.replace(tzinfo=iso8601.iso8601.Utc(), microsecond=0)) self.assertIsNone(utils.datetime_or_none(None)) self.assertRaises(ValueError, utils.datetime_or_none, 'foo') def test_datetime_or_str_or_none(self): dts = timeutils.isotime() dt = timeutils.parse_isotime(dts) self.assertEqual(utils.datetime_or_str_or_none(dt), dt) self.assertIsNone(utils.datetime_or_str_or_none(None)) self.assertEqual(utils.datetime_or_str_or_none(dts), dt) self.assertRaises(ValueError, utils.datetime_or_str_or_none, 'foo') def test_int_or_none(self): self.assertEqual(utils.int_or_none(1), 1) self.assertEqual(utils.int_or_none('1'), 1) self.assertIsNone(utils.int_or_none(None)) self.assertRaises(ValueError, utils.int_or_none, 'foo') def test_str_or_none(self): class Obj(object): pass self.assertEqual(utils.str_or_none('foo'), 'foo') self.assertEqual(utils.str_or_none(1), '1') self.assertIsNone(utils.str_or_none(None)) def test_ip_or_none(self): ip4 = netaddr.IPAddress('1.2.3.4', 4) ip6 = netaddr.IPAddress('1::2', 6) self.assertEqual(utils.ip_or_none(4)('1.2.3.4'), ip4) self.assertEqual(utils.ip_or_none(6)('1::2'), ip6) self.assertIsNone(utils.ip_or_none(4)(None)) self.assertIsNone(utils.ip_or_none(6)(None)) self.assertRaises(netaddr.AddrFormatError, utils.ip_or_none(4), 'foo') self.assertRaises(netaddr.AddrFormatError, utils.ip_or_none(6), 'foo') def test_dt_serializer(self): class Obj(object): foo = utils.dt_serializer('bar') obj = Obj() obj.bar = timeutils.parse_isotime('1955-11-05T00:00:00Z') self.assertEqual('1955-11-05T00:00:00Z', obj.foo()) obj.bar = None self.assertIsNone(obj.foo()) obj.bar = 'foo' self.assertRaises(AttributeError, obj.foo) def test_dt_deserializer(self): dt = timeutils.parse_isotime('1955-11-05T00:00:00Z') self.assertEqual(utils.dt_deserializer(None, timeutils.isotime(dt)), dt) self.assertIsNone(utils.dt_deserializer(None, None)) self.assertRaises(ValueError, utils.dt_deserializer, None, 'foo') def test_obj_to_primitive_list(self): class MyList(base.ObjectListBase, base.IronicObject): pass mylist = MyList() mylist.objects = [1, 2, 3] self.assertEqual([1, 2, 3], base.obj_to_primitive(mylist)) def test_obj_to_primitive_dict(self): myobj = MyObj() myobj.foo = 1 myobj.bar = 'foo' self.assertEqual({'foo': 1, 'bar': 'foo'}, base.obj_to_primitive(myobj)) def test_obj_to_primitive_recursive(self): class MyList(base.ObjectListBase, base.IronicObject): pass mylist = MyList() mylist.objects = [MyObj(), MyObj()] for i, value in enumerate(mylist): value.foo = i self.assertEqual([{'foo': 0}, {'foo': 1}], base.obj_to_primitive(mylist)) class _BaseTestCase(test_base.TestCase): def setUp(self): super(_BaseTestCase, self).setUp() self.remote_object_calls = list() class _LocalTest(_BaseTestCase): def setUp(self): super(_LocalTest, self).setUp() # Just in case base.IronicObject.indirection_api = None def assertRemotes(self): self.assertEqual([], self.remote_object_calls) @contextlib.contextmanager def things_temporarily_local(): # Temporarily go non-remote so the conductor handles # this request directly _api = base.IronicObject.indirection_api base.IronicObject.indirection_api = None yield base.IronicObject.indirection_api = _api class _TestObject(object): def test_hydration_type_error(self): primitive = {'ironic_object.name': 'MyObj', 'ironic_object.namespace': 'ironic', 'ironic_object.version': '1.5', 'ironic_object.data': {'foo': 'a'}} self.assertRaises(ValueError, MyObj.obj_from_primitive, primitive) def test_hydration(self): primitive = {'ironic_object.name': 'MyObj', 'ironic_object.namespace': 'ironic', 'ironic_object.version': '1.5', 'ironic_object.data': {'foo': 1}} obj = MyObj.obj_from_primitive(primitive) self.assertEqual(1, obj.foo) def test_hydration_bad_ns(self): primitive = {'ironic_object.name': 'MyObj', 'ironic_object.namespace': 'foo', 'ironic_object.version': '1.5', 'ironic_object.data': {'foo': 1}} self.assertRaises(exception.UnsupportedObjectError, MyObj.obj_from_primitive, primitive) def test_dehydration(self): expected = {'ironic_object.name': 'MyObj', 'ironic_object.namespace': 'ironic', 'ironic_object.version': '1.5', 'ironic_object.data': {'foo': 1}} obj = MyObj() obj.foo = 1 obj.obj_reset_changes() self.assertEqual(expected, obj.obj_to_primitive()) def test_get_updates(self): obj = MyObj() self.assertEqual({}, obj.obj_get_changes()) obj.foo = 123 self.assertEqual({'foo': 123}, obj.obj_get_changes()) obj.bar = 'test' self.assertEqual({'foo': 123, 'bar': 'test'}, obj.obj_get_changes()) obj.obj_reset_changes() self.assertEqual({}, obj.obj_get_changes()) def test_object_property(self): obj = MyObj() obj.foo = 1 self.assertEqual(1, obj.foo) def test_object_property_type_error(self): obj = MyObj() def fail(): obj.foo = 'a' self.assertRaises(ValueError, fail) def test_object_dict_syntax(self): obj = MyObj() obj.foo = 123 obj.bar = 'bar' self.assertEqual(123, obj['foo']) self.assertEqual([('bar', 'bar'), ('foo', 123)], sorted(obj.items(), key=lambda x: x[0])) self.assertEqual([('bar', 'bar'), ('foo', 123)], sorted(list(obj.iteritems()), key=lambda x: x[0])) def test_load(self): obj = MyObj() self.assertEqual('loaded!', obj.bar) def test_load_in_base(self): class Foo(base.IronicObject): fields = {'foobar': int} obj = Foo() # NOTE(danms): Can't use assertRaisesRegexp() because of py26 raised = False try: obj.foobar except NotImplementedError as ex: raised = True self.assertTrue(raised) self.assertTrue('foobar' in str(ex)) def test_loaded_in_primitive(self): obj = MyObj() obj.foo = 1 obj.obj_reset_changes() self.assertEqual('loaded!', obj.bar) expected = {'ironic_object.name': 'MyObj', 'ironic_object.namespace': 'ironic', 'ironic_object.version': '1.5', 'ironic_object.changes': ['bar'], 'ironic_object.data': {'foo': 1, 'bar': 'loaded!'}} self.assertEqual(expected, obj.obj_to_primitive()) def test_changes_in_primitive(self): obj = MyObj() obj.foo = 123 self.assertEqual(set(['foo']), obj.obj_what_changed()) primitive = obj.obj_to_primitive() self.assertTrue('ironic_object.changes' in primitive) obj2 = MyObj.obj_from_primitive(primitive) self.assertEqual(set(['foo']), obj2.obj_what_changed()) obj2.obj_reset_changes() self.assertEqual(set(), obj2.obj_what_changed()) def test_unknown_objtype(self): self.assertRaises(exception.UnsupportedObjectError, base.IronicObject.obj_class_from_name, 'foo', '1.0') def test_with_alternate_context(self): ctxt1 = context.RequestContext('foo', 'foo') ctxt2 = context.RequestContext('bar', tenant='alternate') obj = MyObj.get(ctxt1) obj.update_test(ctxt2) self.assertEqual('alternate-context', obj.bar) self.assertRemotes() def test_orphaned_object(self): ctxt = context.get_admin_context() obj = MyObj.get(ctxt) obj._context = None self.assertRaises(exception.OrphanedObjectError, obj.update_test) self.assertRemotes() def test_changed_1(self): ctxt = context.get_admin_context() obj = MyObj.get(ctxt) obj.foo = 123 self.assertEqual(set(['foo']), obj.obj_what_changed()) obj.update_test(ctxt) self.assertEqual(set(['foo', 'bar']), obj.obj_what_changed()) self.assertEqual(123, obj.foo) self.assertRemotes() def test_changed_2(self): ctxt = context.get_admin_context() obj = MyObj.get(ctxt) obj.foo = 123 self.assertEqual(set(['foo']), obj.obj_what_changed()) obj.save(ctxt) self.assertEqual(set([]), obj.obj_what_changed()) self.assertEqual(123, obj.foo) self.assertRemotes() def test_changed_3(self): ctxt = context.get_admin_context() obj = MyObj.get(ctxt) obj.foo = 123 self.assertEqual(set(['foo']), obj.obj_what_changed()) obj.refresh(ctxt) self.assertEqual(set([]), obj.obj_what_changed()) self.assertEqual(321, obj.foo) self.assertEqual('refreshed', obj.bar) self.assertRemotes() def test_changed_4(self): ctxt = context.get_admin_context() obj = MyObj.get(ctxt) obj.bar = 'something' self.assertEqual(set(['bar']), obj.obj_what_changed()) obj.modify_save_modify(ctxt) self.assertEqual(set(['foo']), obj.obj_what_changed()) self.assertEqual(42, obj.foo) self.assertEqual('meow', obj.bar) self.assertRemotes() def test_static_result(self): ctxt = context.get_admin_context() obj = MyObj.get(ctxt) self.assertEqual('bar', obj.bar) result = obj.marco() self.assertEqual('polo', result) self.assertRemotes() def test_updates(self): ctxt = context.get_admin_context() obj = MyObj.get(ctxt) self.assertEqual(1, obj.foo) obj.update_test() self.assertEqual('updated', obj.bar) self.assertRemotes() def test_base_attributes(self): dt = datetime.datetime(1955, 11, 5) obj = MyObj() obj.created_at = dt obj.updated_at = dt expected = {'ironic_object.name': 'MyObj', 'ironic_object.namespace': 'ironic', 'ironic_object.version': '1.5', 'ironic_object.changes': ['created_at', 'updated_at'], 'ironic_object.data': {'created_at': timeutils.isotime(dt), 'updated_at': timeutils.isotime(dt), } } self.assertEqual(expected, obj.obj_to_primitive()) def test_contains(self): obj = MyObj() self.assertFalse('foo' in obj) obj.foo = 1 self.assertTrue('foo' in obj) self.assertFalse('does_not_exist' in obj) class TestObject(_LocalTest, _TestObject): pass class TestObjectListBase(test_base.TestCase): def test_list_like_operations(self): class Foo(base.ObjectListBase, base.IronicObject): pass objlist = Foo() objlist._context = 'foo' objlist.objects = [1, 2, 3] self.assertEqual(list(objlist), objlist.objects) self.assertEqual(3, len(objlist)) self.assertIn(2, objlist) self.assertEqual([1], list(objlist[:1])) self.assertEqual('foo', objlist[:1]._context) self.assertEqual(3, objlist[2]) self.assertEqual(1, objlist.count(1)) self.assertEqual(1, objlist.index(2)) def test_serialization(self): class Foo(base.ObjectListBase, base.IronicObject): pass class Bar(base.IronicObject): fields = {'foo': str} obj = Foo() obj.objects = [] for i in 'abc': bar = Bar() bar.foo = i obj.objects.append(bar) obj2 = base.IronicObject.obj_from_primitive(obj.obj_to_primitive()) self.assertFalse(obj is obj2) self.assertEqual([x.foo for x in obj], [y.foo for y in obj2]) class TestObjectSerializer(test_base.TestCase): def test_serialize_entity_primitive(self): ser = base.IronicObjectSerializer() for thing in (1, 'foo', [1, 2], {'foo': 'bar'}): self.assertEqual(thing, ser.serialize_entity(None, thing)) def test_deserialize_entity_primitive(self): ser = base.IronicObjectSerializer() for thing in (1, 'foo', [1, 2], {'foo': 'bar'}): self.assertEqual(thing, ser.deserialize_entity(None, thing)) def test_object_serialization(self): ser = base.IronicObjectSerializer() ctxt = context.get_admin_context() obj = MyObj() primitive = ser.serialize_entity(ctxt, obj) self.assertTrue('ironic_object.name' in primitive) obj2 = ser.deserialize_entity(ctxt, primitive) self.assertIsInstance(obj2, MyObj) self.assertEqual(ctxt, obj2._context) def test_object_serialization_iterables(self): ser = base.IronicObjectSerializer() ctxt = context.get_admin_context() obj = MyObj() for iterable in (list, tuple, set): thing = iterable([obj]) primitive = ser.serialize_entity(ctxt, thing) self.assertEqual(1, len(primitive)) for item in primitive: self.assertFalse(isinstance(item, base.IronicObject)) thing2 = ser.deserialize_entity(ctxt, primitive) self.assertEqual(1, len(thing2)) for item in thing2: self.assertIsInstance(item, MyObj) ironic-2014.1.rc1/ironic/tests/objects/test_conductor.py0000664000175300017540000001107312316614116024377 0ustar jenkinsjenkins00000000000000# coding=utf-8 # # Copyright 2013 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. import datetime import mock from ironic.db import api as db_api from ironic.db.sqlalchemy import models from ironic import objects from ironic.objects import utils as obj_utils from ironic.openstack.common import timeutils from ironic.tests.db import base from ironic.tests.db import utils class TestConductorObject(base.DbTestCase): def setUp(self): super(TestConductorObject, self).setUp() self.fake_conductor = utils.get_test_conductor( updated_at=timeutils.utcnow()) self.dbapi = db_api.get_instance() def test_load(self): host = self.fake_conductor['hostname'] with mock.patch.object(self.dbapi, 'get_conductor', autospec=True) as mock_get_cdr: mock_get_cdr.return_value = self.fake_conductor objects.Conductor.get_by_hostname(self.context, host) mock_get_cdr.assert_called_once_with(host) def test_save(self): host = self.fake_conductor['hostname'] with mock.patch.object(self.dbapi, 'get_conductor', autospec=True) as mock_get_cdr: mock_get_cdr.return_value = self.fake_conductor c = objects.Conductor.get_by_hostname(self.context, host) c.hostname = 'another-hostname' self.assertRaises(NotImplementedError, c.save, self.context) mock_get_cdr.assert_called_once_with(host) def test_touch(self): host = self.fake_conductor['hostname'] with mock.patch.object(self.dbapi, 'get_conductor', autospec=True) as mock_get_cdr: with mock.patch.object(self.dbapi, 'touch_conductor', autospec=True) as mock_touch_cdr: mock_get_cdr.return_value = self.fake_conductor c = objects.Conductor.get_by_hostname(self.context, host) c.touch(self.context) mock_get_cdr.assert_called_once_with(host) mock_touch_cdr.assert_called_once_with(host) def test_refresh(self): host = self.fake_conductor['hostname'] t0 = self.fake_conductor['updated_at'] t1 = t0 + datetime.timedelta(seconds=10) returns = [dict(self.fake_conductor, updated_at=t0), dict(self.fake_conductor, updated_at=t1)] expected = [mock.call(host), mock.call(host)] with mock.patch.object(self.dbapi, 'get_conductor', side_effect=returns, autospec=True) as mock_get_cdr: c = objects.Conductor.get_by_hostname(self.context, host) # ensure timestamps have tzinfo self.assertEqual(obj_utils.datetime_or_none(t0), c.updated_at) c.refresh() self.assertEqual(obj_utils.datetime_or_none(t1), c.updated_at) self.assertEqual(expected, mock_get_cdr.call_args_list) def test_objectify(self): def _get_db_conductor(): c = models.Conductor() c.update(self.fake_conductor) return c @objects.objectify(objects.Conductor) def _convert_db_conductor(): return _get_db_conductor() self.assertIsInstance(_get_db_conductor(), models.Conductor) self.assertIsInstance(_convert_db_conductor(), objects.Conductor) def test_objectify_many(self): def _get_db_conductors(): conductors = [] for i in range(5): c = models.Conductor() c.update(self.fake_conductor) conductors.append(c) return conductors @objects.objectify(objects.Conductor) def _convert_db_conductors(): return _get_db_conductors() for c in _get_db_conductors(): self.assertIsInstance(c, models.Conductor) for c in _convert_db_conductors(): self.assertIsInstance(c, objects.Conductor) ironic-2014.1.rc1/ironic/tests/objects/test_chassis.py0000664000175300017540000000732612316614116024042 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 mock from ironic.common import utils as ironic_utils from ironic.db import api as db_api from ironic.db.sqlalchemy import models from ironic import objects from ironic.tests.db import base from ironic.tests.db import utils class TestChassisObject(base.DbTestCase): def setUp(self): super(TestChassisObject, self).setUp() self.fake_chassis = utils.get_test_chassis() self.dbapi = db_api.get_instance() def test_load(self): uuid = self.fake_chassis['uuid'] with mock.patch.object(self.dbapi, 'get_chassis', autospec=True) as mock_get_chassis: mock_get_chassis.return_value = self.fake_chassis objects.Chassis.get_by_uuid(self.context, uuid) mock_get_chassis.assert_called_once_with(uuid) def test_save(self): uuid = self.fake_chassis['uuid'] with mock.patch.object(self.dbapi, 'get_chassis', autospec=True) as mock_get_chassis: mock_get_chassis.return_value = self.fake_chassis with mock.patch.object(self.dbapi, 'update_chassis', autospec=True) as mock_update_chassis: c = objects.Chassis.get_by_uuid(self.context, uuid) c.extra = {"test": 123} c.save() mock_get_chassis.assert_called_once_with(uuid) mock_update_chassis.assert_called_once_with( uuid, {'extra': {"test": 123}}) def test_refresh(self): uuid = self.fake_chassis['uuid'] new_uuid = ironic_utils.generate_uuid() returns = [dict(self.fake_chassis, uuid=uuid), dict(self.fake_chassis, uuid=new_uuid)] expected = [mock.call(uuid), mock.call(uuid)] with mock.patch.object(self.dbapi, 'get_chassis', side_effect=returns, autospec=True) as mock_get_chassis: c = objects.Chassis.get_by_uuid(self.context, uuid) self.assertEqual(uuid, c.uuid) c.refresh() self.assertEqual(new_uuid, c.uuid) self.assertEqual(expected, mock_get_chassis.call_args_list) def test_objectify(self): def _get_db_chassis(): c = models.Chassis() c.update(self.fake_chassis) return c @objects.objectify(objects.Chassis) def _convert_db_chassis(): return _get_db_chassis() self.assertIsInstance(_get_db_chassis(), models.Chassis) self.assertIsInstance(_convert_db_chassis(), objects.Chassis) def test_objectify_many(self): def _get_many_db_chassis(): chassis = [] for i in range(5): c = models.Chassis() c.update(self.fake_chassis) chassis.append(c) return chassis @objects.objectify(objects.Chassis) def _convert_many_db_chassis(): return _get_many_db_chassis() for c in _get_many_db_chassis(): self.assertIsInstance(c, models.Chassis) for c in _convert_many_db_chassis(): self.assertIsInstance(c, objects.Chassis) ironic-2014.1.rc1/ironic/tests/objects/test_port.py0000664000175300017540000000676712316614116023401 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 mock from ironic.db import api as db_api from ironic.db.sqlalchemy import models from ironic import objects from ironic.tests.db import base from ironic.tests.db import utils class TestPortObject(base.DbTestCase): def setUp(self): super(TestPortObject, self).setUp() self.fake_port = utils.get_test_port() self.dbapi = db_api.get_instance() def test_load(self): uuid = self.fake_port['uuid'] with mock.patch.object(self.dbapi, 'get_port', autospec=True) as mock_get_port: mock_get_port.return_value = self.fake_port objects.Port.get_by_uuid(self.context, uuid) mock_get_port.assert_called_once_with(uuid) def test_save(self): uuid = self.fake_port['uuid'] with mock.patch.object(self.dbapi, 'get_port', autospec=True) as mock_get_port: mock_get_port.return_value = self.fake_port with mock.patch.object(self.dbapi, 'update_port', autospec=True) as mock_update_port: p = objects.Port.get_by_uuid(self.context, uuid) p.address = "b2:54:00:cf:2d:40" p.save() mock_get_port.assert_called_once_with(uuid) mock_update_port.assert_called_once_with( uuid, {'address': "b2:54:00:cf:2d:40"}) def test_refresh(self): uuid = self.fake_port['uuid'] returns = [self.fake_port, utils.get_test_port(address="c3:54:00:cf:2d:40")] expected = [mock.call(uuid), mock.call(uuid)] with mock.patch.object(self.dbapi, 'get_port', side_effect=returns, autospec=True) as mock_get_port: p = objects.Port.get_by_uuid(self.context, uuid) self.assertEqual("52:54:00:cf:2d:31", p.address) p.refresh() self.assertEqual("c3:54:00:cf:2d:40", p.address) self.assertEqual(expected, mock_get_port.call_args_list) def test_objectify(self): def _get_db_port(): p = models.Port() p.update(self.fake_port) return p @objects.objectify(objects.Port) def _convert_db_port(): return _get_db_port() self.assertIsInstance(_get_db_port(), models.Port) self.assertIsInstance(_convert_db_port(), objects.Port) def test_objectify_many(self): def _get_db_ports(): nodes = [] for i in range(5): n = models.Port() n.update(self.fake_port) nodes.append(n) return nodes @objects.objectify(objects.Port) def _convert_db_nodes(): return _get_db_ports() for p in _get_db_ports(): self.assertIsInstance(p, models.Port) for p in _convert_db_nodes(): self.assertIsInstance(p, objects.Port) ironic-2014.1.rc1/ironic/tests/objects/__init__.py0000664000175300017540000000000012316614116023063 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/tests/base.py0000664000175300017540000001710512316614116020623 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # 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. """Base classes for our unit tests. Allows overriding of config for use of fakes, and some black magic for inline callbacks. """ import eventlet eventlet.monkey_patch(os=False) import copy import os import shutil import sys import fixtures import testtools from oslo.config import cfg from ironic.db.sqlalchemy import migration from ironic.db.sqlalchemy import models from ironic.common import paths from ironic.db.sqlalchemy import api as sqla_api from ironic.objects import base as objects_base from ironic.openstack.common import log as logging from ironic.tests import conf_fixture from ironic.tests import policy_fixture test_opts = [ cfg.StrOpt('sqlite_clean_db', default='clean.sqlite', help='File name of clean sqlite db.'), ] CONF = cfg.CONF CONF.register_opts(test_opts) CONF.import_opt('connection', 'ironic.openstack.common.db.options', group='database') CONF.import_opt('sqlite_db', 'ironic.openstack.common.db.options', group='database') CONF.set_override('use_stderr', False) logging.setup('ironic') _DB_CACHE = None class Database(fixtures.Fixture): def __init__(self, db_api, db_migrate, sql_connection, sqlite_db, sqlite_clean_db): self.sql_connection = sql_connection self.sqlite_db = sqlite_db self.sqlite_clean_db = sqlite_clean_db self.engine = db_api.get_engine() self.engine.dispose() conn = self.engine.connect() if sql_connection == "sqlite://": self.setup_sqlite(db_migrate) elif sql_connection.startswith('sqlite:///'): testdb = paths.state_path_rel(sqlite_db) if os.path.exists(testdb): return self.setup_sqlite(db_migrate) else: db_migrate.upgrade('head') self.post_migrations() if sql_connection == "sqlite://": conn = self.engine.connect() self._DB = "".join(line for line in conn.connection.iterdump()) self.engine.dispose() else: cleandb = paths.state_path_rel(sqlite_clean_db) shutil.copyfile(testdb, cleandb) def setup_sqlite(self, db_migrate): if db_migrate.version(): return models.Base.metadata.create_all(self.engine) db_migrate.stamp('head') def setUp(self): super(Database, self).setUp() if self.sql_connection == "sqlite://": conn = self.engine.connect() conn.connection.executescript(self._DB) self.addCleanup(self.engine.dispose) else: shutil.copyfile(paths.state_path_rel(self.sqlite_clean_db), paths.state_path_rel(self.sqlite_db)) self.addCleanup(os.unlink, self.sqlite_db) def post_migrations(self): """Any addition steps that are needed outside of the migrations.""" class ReplaceModule(fixtures.Fixture): """Replace a module with a fake module.""" def __init__(self, name, new_value): self.name = name self.new_value = new_value def _restore(self, old_value): sys.modules[self.name] = old_value def setUp(self): super(ReplaceModule, self).setUp() old_value = sys.modules.get(self.name) sys.modules[self.name] = self.new_value self.addCleanup(self._restore, old_value) class TestingException(Exception): pass class TestCase(testtools.TestCase): """Test case base class for all unit tests.""" def setUp(self): """Run before each test method to initialize test environment.""" super(TestCase, self).setUp() test_timeout = os.environ.get('OS_TEST_TIMEOUT', 0) try: test_timeout = int(test_timeout) except ValueError: # If timeout value is invalid do not set a timeout. test_timeout = 0 if test_timeout > 0: self.useFixture(fixtures.Timeout(test_timeout, gentle=True)) self.useFixture(fixtures.NestedTempfile()) self.useFixture(fixtures.TempHomeDir()) if (os.environ.get('OS_STDOUT_CAPTURE') == 'True' or os.environ.get('OS_STDOUT_CAPTURE') == '1'): stdout = self.useFixture(fixtures.StringStream('stdout')).stream self.useFixture(fixtures.MonkeyPatch('sys.stdout', stdout)) if (os.environ.get('OS_STDERR_CAPTURE') == 'True' or os.environ.get('OS_STDERR_CAPTURE') == '1'): stderr = self.useFixture(fixtures.StringStream('stderr')).stream self.useFixture(fixtures.MonkeyPatch('sys.stderr', stderr)) self.log_fixture = self.useFixture(fixtures.FakeLogger()) self.useFixture(conf_fixture.ConfFixture(CONF)) global _DB_CACHE if not _DB_CACHE: _DB_CACHE = Database(sqla_api, migration, sql_connection=CONF.database.connection, sqlite_db=CONF.database.sqlite_db, sqlite_clean_db=CONF.sqlite_clean_db) self.useFixture(_DB_CACHE) # NOTE(danms): Make sure to reset us back to non-remote objects # for each test to avoid interactions. Also, backup the object # registry objects_base.IronicObject.indirection_api = None self._base_test_obj_backup = copy.copy( objects_base.IronicObject._obj_classes) self.addCleanup(self._restore_obj_registry) self.addCleanup(self._clear_attrs) self.useFixture(fixtures.EnvironmentVariable('http_proxy')) self.policy = self.useFixture(policy_fixture.PolicyFixture()) CONF.set_override('fatal_exception_format_errors', True) def _restore_obj_registry(self): objects_base.IronicObject._obj_classes = self._base_test_obj_backup def _clear_attrs(self): # Delete attributes that don't start with _ so they don't pin # memory around unnecessarily for the duration of the test # suite for key in [k for k in self.__dict__.keys() if k[0] != '_']: del self.__dict__[key] def config(self, **kw): """Override config options for a test.""" group = kw.pop('group', None) for k, v in kw.iteritems(): CONF.set_override(k, v, group) def path_get(self, project_file=None): """Get the absolute path to a file. Used for testing the API. :param project_file: File whose path to return. Default: None. :returns: path to the specified file, or path to project root. """ root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', ) ) if project_file: return os.path.join(root, project_file) else: return root ironic-2014.1.rc1/ironic/tests/conductor/0000775000175300017540000000000012316614636021342 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/tests/conductor/test_manager.py0000664000175300017540000016766112316614116024377 0ustar jenkinsjenkins00000000000000# coding=utf-8 # Copyright 2013 Hewlett-Packard Development Company, L.P. # Copyright 2013 International Business Machines 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. """Test class for Ironic ManagerService.""" import datetime import time import mock from oslo.config import cfg from testtools.matchers import HasLength from ironic.common import driver_factory from ironic.common import exception from ironic.common import states from ironic.common import utils as ironic_utils from ironic.conductor import manager from ironic.conductor import task_manager from ironic.conductor import utils as conductor_utils from ironic.db import api as dbapi from ironic import objects from ironic.openstack.common import context from ironic.openstack.common.rpc import common as messaging from ironic.openstack.common import timeutils from ironic.tests.conductor import utils as mgr_utils from ironic.tests.db import base from ironic.tests.db import utils CONF = cfg.CONF class ManagerTestCase(base.DbTestCase): def setUp(self): super(ManagerTestCase, self).setUp() self.hostname = 'test-host' self.service = manager.ConductorManager(self.hostname, 'test-topic') self.context = context.get_admin_context() self.dbapi = dbapi.get_instance() mgr_utils.mock_the_extension_manager() self.driver = driver_factory.get_driver("fake") def test_start_registers_conductor(self): self.assertRaises(exception.ConductorNotFound, self.dbapi.get_conductor, self.hostname) self.service.start() res = self.dbapi.get_conductor(self.hostname) self.assertEqual(self.hostname, res['hostname']) def test_stop_unregisters_conductor(self): self.service.start() res = self.dbapi.get_conductor(self.hostname) self.assertEqual(self.hostname, res['hostname']) self.service.stop() self.assertRaises(exception.ConductorNotFound, self.dbapi.get_conductor, self.hostname) def test_start_registers_driver_names(self): init_names = ['fake1', 'fake2'] restart_names = ['fake3', 'fake4'] df = driver_factory.DriverFactory() with mock.patch.object(df._extension_manager, 'names') as mock_names: # verify driver names are registered mock_names.return_value = init_names self.service.start() res = self.dbapi.get_conductor(self.hostname) self.assertEqual(init_names, res['drivers']) # verify that restart registers new driver names mock_names.return_value = restart_names self.service.start() res = self.dbapi.get_conductor(self.hostname) self.assertEqual(restart_names, res['drivers']) def test__conductor_service_record_keepalive(self): self.service.start() with mock.patch.object(self.dbapi, 'touch_conductor') as mock_touch: self.service._conductor_service_record_keepalive(self.context) mock_touch.assert_called_once_with(self.hostname) def test__sync_power_state_no_sync(self): self.service.start() n = utils.get_test_node(driver='fake', power_state='fake-power') self.dbapi.create_node(n) with mock.patch.object(self.driver.power, 'get_power_state') as get_power_mock: get_power_mock.return_value = 'fake-power' self.service._sync_power_states(self.context) get_power_mock.assert_called_once_with(mock.ANY, mock.ANY) node = self.dbapi.get_node(n['id']) self.assertEqual('fake-power', node['power_state']) def test__sync_power_state_not_set(self): self.service.start() n = utils.get_test_node(driver='fake', power_state=None) self.dbapi.create_node(n) with mock.patch.object(self.driver.power, 'get_power_state') as get_power_mock: get_power_mock.return_value = states.POWER_ON self.service._sync_power_states(self.context) get_power_mock.assert_called_once_with(mock.ANY, mock.ANY) node = self.dbapi.get_node(n['id']) self.assertEqual(states.POWER_ON, node['power_state']) @mock.patch.object(objects.node.Node, 'save') def test__sync_power_state_unchanged(self, save_mock): self.service.start() n = utils.get_test_node(driver='fake', power_state=states.POWER_ON) self.dbapi.create_node(n) with mock.patch.object(self.driver.power, 'get_power_state') as get_power_mock: get_power_mock.return_value = states.POWER_ON self.service._sync_power_states(self.context) get_power_mock.assert_called_once_with(mock.ANY, mock.ANY) self.assertFalse(save_mock.called) @mock.patch.object(conductor_utils, 'node_power_action') @mock.patch.object(objects.node.Node, 'save') def test__sync_power_state_changed_sync(self, save_mock, npa_mock): self.service.start() self.config(force_power_state_during_sync=True, group='conductor') n = utils.get_test_node(driver='fake', power_state=states.POWER_ON) self.dbapi.create_node(n) with mock.patch.object(self.driver.power, 'get_power_state') as get_power_mock: get_power_mock.return_value = states.POWER_OFF self.service._sync_power_states(self.context) get_power_mock.assert_called_once_with(mock.ANY, mock.ANY) npa_mock.assert_called_once_with(mock.ANY, mock.ANY, states.POWER_ON) self.assertFalse(save_mock.called) @mock.patch.object(conductor_utils, 'node_power_action') @mock.patch.object(objects.node.Node, 'save') def test__sync_power_state_max_retries_exceeded(self, save_mock, npa_mock): """Force sync node power state and check if max retry limit for force sync is honoured """ self.service.start() self.config(force_power_state_during_sync=True, group='conductor') self.config(power_state_sync_max_retries=1, group='conductor') n = utils.get_test_node(driver='fake', power_state=states.POWER_ON) self.dbapi.create_node(n) with mock.patch.object(self.driver.power, 'get_power_state') as get_power_mock: get_power_mock.return_value = states.POWER_OFF self.service._sync_power_states(self.context) self.assertEqual(1, get_power_mock.call_count) npa_mock.assert_called_once_with(mock.ANY, mock.ANY, states.POWER_ON) self.assertEqual(0, save_mock.call_count) npa_mock.reset_mock() save_mock.reset_mock() get_power_mock.reset_mock() # This try wont succeed self.service._sync_power_states(self.context) self.assertEqual(0, npa_mock.call_count) self.assertEqual(1, get_power_mock.call_count) self.assertEqual(1, save_mock.call_count) @mock.patch.object(conductor_utils, 'node_power_action') @mock.patch.object(objects.node.Node, 'save') def test__sync_power_state_changed_failed(self, save_mock, npa_mock): self.service.start() self.config(force_power_state_during_sync=True, group='conductor') n = utils.get_test_node(driver='fake', power_state=states.POWER_ON) self.dbapi.create_node(n) with mock.patch.object(self.driver.power, 'get_power_state') as get_power_mock: get_power_mock.return_value = states.POWER_OFF npa_mock.side_effect = exception.IronicException('test') # we are testing that this does NOT raise an exception # so don't assertRaises here self.service._sync_power_states(self.context) get_power_mock.assert_called_once_with(mock.ANY, mock.ANY) npa_mock.assert_called_once_with(mock.ANY, mock.ANY, states.POWER_ON) self.assertFalse(save_mock.called) @mock.patch.object(conductor_utils, 'node_power_action') @mock.patch.object(objects.node.Node, 'save') def test__sync_power_state_changed_save(self, save_mock, npa_mock): self.service.start() self.config(force_power_state_during_sync=False, group='conductor') n = utils.get_test_node(driver='fake', power_state=states.POWER_OFF) self.dbapi.create_node(n) with mock.patch.object(self.driver.power, 'get_power_state') as get_power_mock: get_power_mock.return_value = states.POWER_ON self.service._sync_power_states(self.context) get_power_mock.assert_called_once_with(mock.ANY, mock.ANY) self.assertFalse(npa_mock.called) self.assertTrue(save_mock.called) def test__sync_power_state_node_locked(self): self.service.start() n = utils.get_test_node(driver='fake', power_state='fake-power') self.dbapi.create_node(n) self.dbapi.reserve_nodes('fake-reserve', [n['id']]) with mock.patch.object(self.driver.power, 'get_power_state') as get_power_mock: self.service._sync_power_states(self.context) self.assertFalse(get_power_mock.called) node = self.dbapi.get_node(n['id']) self.assertEqual('fake-power', node['power_state']) def test__sync_power_state_multiple_nodes(self): self.service.start() self.config(force_power_state_during_sync=False, group='conductor') # create three nodes nodes = [] nodeinfo = [] for i in range(0, 3): n = utils.get_test_node(id=i, uuid=ironic_utils.generate_uuid(), driver='fake', power_state=states.POWER_OFF) self.dbapi.create_node(n) nodes.append(n['uuid']) nodeinfo.append([i, n['uuid'], 'fake']) # lock the first node self.dbapi.reserve_nodes('fake-reserve', [nodes[0]]) with mock.patch.object(self.driver.power, 'get_power_state') as get_power_mock: get_power_mock.return_value = states.POWER_ON with mock.patch.object(self.dbapi, 'get_nodeinfo_list') as get_fnl_mock: # delete the second node self.dbapi.destroy_node(nodes[1]) get_fnl_mock.return_value = nodeinfo self.service._sync_power_states(self.context) # check that get_power only called once, which updated third node get_power_mock.assert_called_once_with(mock.ANY, mock.ANY) n1 = self.dbapi.get_node(nodes[0]) n3 = self.dbapi.get_node(nodes[2]) self.assertEqual(states.POWER_OFF, n1['power_state']) self.assertEqual(states.POWER_ON, n3['power_state']) def test__sync_power_state_node_no_power_state(self): self.service.start() self.config(force_power_state_during_sync=False, group='conductor') # create three nodes nodes = [] for i in range(0, 3): n = utils.get_test_node(id=i, uuid=ironic_utils.generate_uuid(), driver='fake', power_state=states.POWER_OFF) self.dbapi.create_node(n) nodes.append(n['uuid']) # cannot get power state of node 2; only nodes 1 & 3 have # their power states changed. with mock.patch.object(self.driver.power, 'get_power_state') as get_power_mock: returns = [states.POWER_ON, exception.InvalidParameterValue("invalid"), states.POWER_ON] def side_effect(*args): result = returns.pop(0) if isinstance(result, Exception): raise result return result get_power_mock.side_effect = side_effect self.service._sync_power_states(self.context) self.assertThat(returns, HasLength(0)) final = [states.POWER_ON, states.POWER_OFF, states.POWER_ON] for i in range(0, 3): n = self.dbapi.get_node(nodes[i]) self.assertEqual(final[i], n.power_state) def test__sync_power_state_node_deploywait(self): self.service.start() n = utils.get_test_node(provision_state=states.DEPLOYWAIT) self.dbapi.create_node(n) with mock.patch.object(self.driver.power, 'get_power_state') as get_power_mock: self.service._sync_power_states(self.context) self.assertFalse(get_power_mock.called) def test_change_node_power_state_power_on(self): # Test change_node_power_state including integration with # conductor.utils.node_power_action and lower. n = utils.get_test_node(driver='fake', power_state=states.POWER_OFF) db_node = self.dbapi.create_node(n) self.service.start() with mock.patch.object(self.driver.power, 'get_power_state') \ as get_power_mock: get_power_mock.return_value = states.POWER_OFF self.service.change_node_power_state(self.context, db_node.uuid, states.POWER_ON) self.service._worker_pool.waitall() get_power_mock.assert_called_once_with(mock.ANY, mock.ANY) db_node.refresh(self.context) self.assertEqual(states.POWER_ON, db_node.power_state) self.assertIsNone(db_node.target_power_state) self.assertIsNone(db_node.last_error) # Verify the reservation has been cleared by # background task's link callback. self.assertIsNone(db_node.reservation) @mock.patch.object(conductor_utils, 'node_power_action') def test_change_node_power_state_node_already_locked(self, pwr_act_mock): # Test change_node_power_state with mocked # conductor.utils.node_power_action. fake_reservation = 'fake-reserv' pwr_state = states.POWER_ON n = utils.get_test_node(driver='fake', power_state=pwr_state, reservation=fake_reservation) db_node = self.dbapi.create_node(n) self.service.start() exc = self.assertRaises(messaging.ClientException, self.service.change_node_power_state, self.context, db_node.uuid, states.POWER_ON) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NodeLocked) # In this test worker should not be spawned, but waiting to make sure # the below perform_mock assertion is valid. self.service._worker_pool.waitall() self.assertFalse(pwr_act_mock.called, 'node_power_action has been ' 'unexpectedly called.') # Verify existing reservation wasn't broken. db_node.refresh(self.context) self.assertEqual(fake_reservation, db_node.reservation) def test_change_node_power_state_worker_pool_full(self): # Test change_node_power_state including integration with # conductor.utils.node_power_action and lower. initial_state = states.POWER_OFF n = utils.get_test_node(driver='fake', power_state=initial_state) db_node = self.dbapi.create_node(n) self.service.start() with mock.patch.object(self.service, '_spawn_worker') \ as spawn_mock: spawn_mock.side_effect = exception.NoFreeConductorWorker() exc = self.assertRaises(messaging.ClientException, self.service.change_node_power_state, self.context, db_node.uuid, states.POWER_ON) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NoFreeConductorWorker) spawn_mock.assert_called_once_with(mock.ANY, mock.ANY, mock.ANY, mock.ANY) db_node.refresh(self.context) self.assertEqual(initial_state, db_node.power_state) self.assertIsNone(db_node.target_power_state) self.assertIsNone(db_node.last_error) # Verify the picked reservation has been cleared due to full pool. self.assertIsNone(db_node.reservation) def test_change_node_power_state_exception_in_background_task( self): # Test change_node_power_state including integration with # conductor.utils.node_power_action and lower. initial_state = states.POWER_OFF n = utils.get_test_node(driver='fake', power_state=initial_state) db_node = self.dbapi.create_node(n) self.service.start() with mock.patch.object(self.driver.power, 'get_power_state') \ as get_power_mock: get_power_mock.return_value = states.POWER_OFF with mock.patch.object(self.driver.power, 'set_power_state') \ as set_power_mock: new_state = states.POWER_ON set_power_mock.side_effect = exception.PowerStateFailure( pstate=new_state ) self.service.change_node_power_state(self.context, db_node.uuid, new_state) self.service._worker_pool.waitall() get_power_mock.assert_called_once_with(mock.ANY, mock.ANY) set_power_mock.assert_called_once_with(mock.ANY, mock.ANY, new_state) db_node.refresh(self.context) self.assertEqual(initial_state, db_node.power_state) self.assertIsNone(db_node.target_power_state) self.assertIsNotNone(db_node.last_error) # Verify the reservation has been cleared by background task's # link callback despite exception in background task. self.assertIsNone(db_node.reservation) def test_update_node(self): ndict = utils.get_test_node(driver='fake', extra={'test': 'one'}) node = self.dbapi.create_node(ndict) # check that ManagerService.update_node actually updates the node node['extra'] = {'test': 'two'} res = self.service.update_node(self.context, node) self.assertEqual({'test': 'two'}, res['extra']) def test_update_node_already_locked(self): ndict = utils.get_test_node(driver='fake', extra={'test': 'one'}) node = self.dbapi.create_node(ndict) # check that it fails if something else has locked it already with task_manager.acquire(self.context, node['id'], shared=False): node['extra'] = {'test': 'two'} exc = self.assertRaises(messaging.ClientException, self.service.update_node, self.context, node) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NodeLocked) # verify change did not happen res = objects.Node.get_by_uuid(self.context, node['uuid']) self.assertEqual({'test': 'one'}, res['extra']) def test_associate_node_invalid_state(self): ndict = utils.get_test_node(driver='fake', extra={'test': 'one'}, instance_uuid=None, power_state=states.POWER_ON) node = self.dbapi.create_node(ndict) # check that it fails because state is POWER_ON node['instance_uuid'] = 'fake-uuid' exc = self.assertRaises(messaging.ClientException, self.service.update_node, self.context, node) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NodeInWrongPowerState) # verify change did not happen res = objects.Node.get_by_uuid(self.context, node['uuid']) self.assertIsNone(res['instance_uuid']) def test_associate_node_valid_state(self): ndict = utils.get_test_node(driver='fake', instance_uuid=None, power_state=states.NOSTATE) node = self.dbapi.create_node(ndict) with mock.patch('ironic.drivers.modules.fake.FakePower.' 'get_power_state') as mock_get_power_state: mock_get_power_state.return_value = states.POWER_OFF node['instance_uuid'] = 'fake-uuid' self.service.update_node(self.context, node) # Check if the change was applied res = objects.Node.get_by_uuid(self.context, node['uuid']) self.assertEqual('fake-uuid', res['instance_uuid']) def test_update_node_invalid_driver(self): existing_driver = 'fake' wrong_driver = 'wrong-driver' ndict = utils.get_test_node(driver=existing_driver, extra={'test': 'one'}, instance_uuid=None, task_state=states.POWER_ON) node = self.dbapi.create_node(ndict) # check that it fails because driver not found node['driver'] = wrong_driver node['driver_info'] = {} self.assertRaises(exception.DriverNotFound, self.service.update_node, self.context, node) # verify change did not happen res = objects.Node.get_by_uuid(self.context, node['uuid']) self.assertEqual(existing_driver, res['driver']) def test_vendor_passthru_success(self): n = utils.get_test_node(driver='fake') node = self.dbapi.create_node(n) info = {'bar': 'baz'} self.service.start() self.service.vendor_passthru( self.context, n['uuid'], 'first_method', info) # Waiting to make sure the below assertions are valid. self.service._worker_pool.waitall() node.refresh(self.context) self.assertIsNone(node.last_error) # Verify reservation has been cleared. self.assertIsNone(node.reservation) def test_vendor_passthru_node_already_locked(self): fake_reservation = 'test_reserv' n = utils.get_test_node(driver='fake', reservation=fake_reservation) node = self.dbapi.create_node(n) info = {'bar': 'baz'} self.service.start() exc = self.assertRaises(messaging.ClientException, self.service.vendor_passthru, self.context, n['uuid'], 'first_method', info) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NodeLocked) node.refresh(self.context) self.assertIsNone(node.last_error) # Verify the existing reservation is not broken. self.assertEqual(fake_reservation, node.reservation) def test_vendor_passthru_unsupported_method(self): n = utils.get_test_node(driver='fake') node = self.dbapi.create_node(n) info = {'bar': 'baz'} self.service.start() exc = self.assertRaises(messaging.ClientException, self.service.vendor_passthru, self.context, n['uuid'], 'unsupported_method', info) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.UnsupportedDriverExtension) node.refresh(self.context) self.assertIsNone(node.last_error) # Verify reservation has been cleared. self.assertIsNone(node.reservation) def test_vendor_passthru_invalid_method_parameters(self): n = utils.get_test_node(driver='fake') node = self.dbapi.create_node(n) info = {'invalid_param': 'whatever'} self.service.start() exc = self.assertRaises(messaging.ClientException, self.service.vendor_passthru, self.context, n['uuid'], 'first_method', info) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.InvalidParameterValue) node.refresh(self.context) self.assertIsNone(node.last_error) # Verify reservation has been cleared. self.assertIsNone(node.reservation) def test_vendor_passthru_vendor_interface_not_supported(self): n = utils.get_test_node(driver='fake') node = self.dbapi.create_node(n) info = {'bar': 'baz'} self.driver.vendor = None self.service.start() exc = self.assertRaises(messaging.ClientException, self.service.vendor_passthru, self.context, n['uuid'], 'whatever_method', info) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.UnsupportedDriverExtension) node.refresh(self.context) # Verify reservation has been cleared. self.assertIsNone(node.reservation) def test_vendor_passthru_worker_pool_full(self): n = utils.get_test_node(driver='fake') node = self.dbapi.create_node(n) info = {'bar': 'baz'} self.service.start() with mock.patch.object(self.service, '_spawn_worker') \ as spawn_mock: spawn_mock.side_effect = exception.NoFreeConductorWorker() exc = self.assertRaises(messaging.ClientException, self.service.vendor_passthru, self.context, n['uuid'], 'first_method', info) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NoFreeConductorWorker) # Waiting to make sure the below assertions are valid. self.service._worker_pool.waitall() node.refresh(self.context) self.assertIsNone(node.last_error) # Verify reservation has been cleared. self.assertIsNone(node.reservation) def test_do_node_deploy_invalid_state(self): # test node['provision_state'] is not NOSTATE ndict = utils.get_test_node(driver='fake', provision_state=states.ACTIVE) node = self.dbapi.create_node(ndict) exc = self.assertRaises(messaging.ClientException, self.service.do_node_deploy, self.context, node['uuid']) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.InstanceDeployFailure) # This is a sync operation last_error should be None. self.assertIsNone(node.last_error) # Verify reservation has been cleared. self.assertIsNone(node.reservation) def test_do_node_deploy_maintenance(self): ndict = utils.get_test_node(driver='fake', maintenance=True) node = self.dbapi.create_node(ndict) exc = self.assertRaises(messaging.ClientException, self.service.do_node_deploy, self.context, node['uuid']) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NodeInMaintenance) # This is a sync operation last_error should be None. self.assertIsNone(node.last_error) # Verify reservation has been cleared. self.assertIsNone(node.reservation) @mock.patch('ironic.drivers.modules.fake.FakeDeploy.validate') def test_do_node_deploy_validate_fail(self, mock_validate): # InvalidParameterValue should be re-raised as InstanceDeployFailure mock_validate.side_effect = exception.InvalidParameterValue('error') ndict = utils.get_test_node(driver='fake') node = self.dbapi.create_node(ndict) exc = self.assertRaises(messaging.ClientException, self.service.do_node_deploy, self.context, node.uuid) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.InstanceDeployFailure) # This is a sync operation last_error should be None. self.assertIsNone(node.last_error) # Verify reservation has been cleared. self.assertIsNone(node.reservation) @mock.patch('ironic.drivers.modules.fake.FakeDeploy.deploy') def test__do_node_deploy_driver_raises_error(self, mock_deploy): # test when driver.deploy.deploy raises an exception mock_deploy.side_effect = exception.InstanceDeployFailure('test') ndict = utils.get_test_node(driver='fake', provision_state=states.NOSTATE) node = self.dbapi.create_node(ndict) task = task_manager.TaskManager(self.context, node.uuid) self.assertRaises(exception.InstanceDeployFailure, self.service._do_node_deploy, self.context, task) node.refresh(self.context) self.assertEqual(node.provision_state, states.DEPLOYFAIL) self.assertEqual(node.target_provision_state, states.NOSTATE) self.assertIsNotNone(node.last_error) mock_deploy.assert_called_once_with(mock.ANY, mock.ANY) @mock.patch('ironic.drivers.modules.fake.FakeDeploy.deploy') def test__do_node_deploy_ok(self, mock_deploy): # test when driver.deploy.deploy returns DEPLOYDONE mock_deploy.return_value = states.DEPLOYDONE ndict = utils.get_test_node(driver='fake', provision_state=states.NOSTATE) node = self.dbapi.create_node(ndict) task = task_manager.TaskManager(self.context, node.uuid) self.service._do_node_deploy(self.context, task) node.refresh(self.context) self.assertEqual(node.provision_state, states.ACTIVE) self.assertEqual(node.target_provision_state, states.NOSTATE) self.assertIsNone(node.last_error) mock_deploy.assert_called_once_with(mock.ANY, mock.ANY) def test_do_node_deploy_partial_ok(self): self.service.start() thread = self.service._spawn_worker(lambda: None) with mock.patch.object(self.service, '_spawn_worker') as mock_spawn: mock_spawn.return_value = thread ndict = utils.get_test_node(driver='fake', provision_state=states.NOSTATE) node = self.dbapi.create_node(ndict) self.service.do_node_deploy(self.context, node.uuid) self.service._worker_pool.waitall() node.refresh(self.context) self.assertEqual(node.provision_state, states.DEPLOYING) self.assertEqual(node.target_provision_state, states.DEPLOYDONE) # This is a sync operation last_error should be None. self.assertIsNone(node.last_error) # Verify reservation has been cleared. self.assertIsNone(node.reservation) mock_spawn.assert_called_once_with(mock.ANY, mock.ANY, mock.ANY) def test_do_node_deploy_worker_pool_full(self): ndict = utils.get_test_node(driver='fake') node = self.dbapi.create_node(ndict) self.service.start() with mock.patch.object(self.service, '_spawn_worker') as mock_spawn: mock_spawn.side_effect = exception.NoFreeConductorWorker() exc = self.assertRaises(messaging.ClientException, self.service.do_node_deploy, self.context, node.uuid) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NoFreeConductorWorker) self.service._worker_pool.waitall() node.refresh(self.context) # This is a sync operation last_error should be None. self.assertIsNone(node.last_error) # Verify reservation has been cleared. self.assertIsNone(node.reservation) def test_do_node_tear_down_invalid_state(self): # test node.provision_state is incorrect for tear_down ndict = utils.get_test_node(driver='fake', provision_state=states.NOSTATE) node = self.dbapi.create_node(ndict) exc = self.assertRaises(messaging.ClientException, self.service.do_node_tear_down, self.context, node['uuid']) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.InstanceDeployFailure) @mock.patch('ironic.drivers.modules.fake.FakeDeploy.validate') def test_do_node_tear_down_validate_fail(self, mock_validate): # InvalidParameterValue should be re-raised as InstanceDeployFailure mock_validate.side_effect = exception.InvalidParameterValue('error') ndict = utils.get_test_node(driver='fake') ndict['provision_state'] = states.ACTIVE node = self.dbapi.create_node(ndict) exc = self.assertRaises(messaging.ClientException, self.service.do_node_tear_down, self.context, node.uuid) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.InstanceDeployFailure) @mock.patch('ironic.drivers.modules.fake.FakeDeploy.tear_down') def test_do_node_tear_down_driver_raises_error(self, mock_tear_down): # test when driver.deploy.tear_down raises exception ndict = utils.get_test_node(driver='fake', provision_state=states.ACTIVE) node = self.dbapi.create_node(ndict) task = task_manager.TaskManager(self.context, node.uuid) self.service.start() mock_tear_down.side_effect = exception.InstanceDeployFailure('test') self.assertRaises(exception.InstanceDeployFailure, self.service._do_node_tear_down, self.context, task) node.refresh(self.context) self.assertEqual(states.ERROR, node.provision_state) self.assertEqual(states.NOSTATE, node.target_provision_state) self.assertIsNotNone(node.last_error) mock_tear_down.assert_called_once_with(mock.ANY, mock.ANY) @mock.patch('ironic.drivers.modules.fake.FakeDeploy.tear_down') def test_do_node_tear_down_ok(self, mock_tear_down): # test when driver.deploy.tear_down returns DELETED ndict = utils.get_test_node(driver='fake', provision_state=states.ACTIVE) node = self.dbapi.create_node(ndict) task = task_manager.TaskManager(self.context, node.uuid) self.service.start() mock_tear_down.return_value = states.DELETED self.service._do_node_tear_down(self.context, task) node.refresh(self.context) self.assertEqual(states.NOSTATE, node.provision_state) self.assertEqual(states.NOSTATE, node.target_provision_state) self.assertIsNone(node.last_error) mock_tear_down.assert_called_once_with(mock.ANY, mock.ANY) @mock.patch('ironic.drivers.modules.fake.FakeDeploy.tear_down') def test_do_node_tear_down_partial_ok(self, mock_tear_down): # test when driver.deploy.tear_down doesn't return DELETED ndict = utils.get_test_node(driver='fake', provision_state=states.ACTIVE) node = self.dbapi.create_node(ndict) self.service.start() task = task_manager.TaskManager(self.context, node.uuid) mock_tear_down.return_value = states.DELETING self.service._do_node_tear_down(self.context, task) node.refresh(self.context) self.assertEqual(states.DELETING, node.provision_state) self.assertIsNone(node.last_error) mock_tear_down.assert_called_once_with(mock.ANY, mock.ANY) @mock.patch('ironic.conductor.manager.ConductorManager._spawn_worker') def test_do_node_tear_down_worker_pool_full(self, mock_spawn): ndict = utils.get_test_node(driver='fake', provision_state=states.ACTIVE) node = self.dbapi.create_node(ndict) self.service.start() mock_spawn.side_effect = exception.NoFreeConductorWorker() exc = self.assertRaises(messaging.ClientException, self.service.do_node_tear_down, self.context, node.uuid) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NoFreeConductorWorker) self.service._worker_pool.waitall() node.refresh(self.context) # This is a sync operation last_error should be None. self.assertIsNone(node.last_error) # Verify reservation has been cleared. self.assertIsNone(node.reservation) def test_validate_driver_interfaces(self): ndict = utils.get_test_node(driver='fake') node = self.dbapi.create_node(ndict) ret = self.service.validate_driver_interfaces(self.context, node['uuid']) expected = {'console': {'result': True}, 'power': {'result': True}, 'deploy': {'result': True}} self.assertEqual(expected, ret) def test_validate_driver_interfaces_validation_fail(self): ndict = utils.get_test_node(driver='fake') node = self.dbapi.create_node(ndict) with mock.patch('ironic.drivers.modules.fake.FakeDeploy.validate') \ as deploy: reason = 'fake reason' deploy.side_effect = exception.InvalidParameterValue(reason) ret = self.service.validate_driver_interfaces(self.context, node['uuid']) self.assertFalse(ret['deploy']['result']) self.assertEqual(reason, ret['deploy']['reason']) def test_maintenance_mode_on(self): ndict = utils.get_test_node(driver='fake') node = self.dbapi.create_node(ndict) self.service.change_node_maintenance_mode(self.context, node.uuid, True) node.refresh(self.context) self.assertTrue(node.maintenance) def test_maintenance_mode_off(self): ndict = utils.get_test_node(driver='fake', maintenance=True) node = self.dbapi.create_node(ndict) self.service.change_node_maintenance_mode(self.context, node.uuid, False) node.refresh(self.context) self.assertFalse(node.maintenance) def test_maintenance_mode_on_failed(self): ndict = utils.get_test_node(driver='fake', maintenance=True) node = self.dbapi.create_node(ndict) exc = self.assertRaises(messaging.ClientException, self.service.change_node_maintenance_mode, self.context, node.uuid, True) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NodeMaintenanceFailure) node.refresh(self.context) self.assertTrue(node.maintenance) def test_maintenance_mode_off_failed(self): ndict = utils.get_test_node(driver='fake') node = self.dbapi.create_node(ndict) exc = self.assertRaises(messaging.ClientException, self.service.change_node_maintenance_mode, self.context, node.uuid, False) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NodeMaintenanceFailure) node.refresh(self.context) self.assertFalse(node.maintenance) def test__spawn_worker(self): func_mock = mock.Mock() args = (1, 2, "test") kwargs = dict(kw1='test1', kw2='test2') self.service.start() thread = self.service._spawn_worker(func_mock, *args, **kwargs) self.service._worker_pool.waitall() self.assertIsNotNone(thread) func_mock.assert_called_once_with(*args, **kwargs) # The tests below related to greenthread. We have they to assert our # assumptions about greenthread behavior. def test__spawn_link_callback_added_during_execution(self): def func(): time.sleep(1) link_callback = mock.Mock() self.service.start() thread = self.service._spawn_worker(func) # func_mock executing at this moment thread.link(link_callback) self.service._worker_pool.waitall() link_callback.assert_called_once_with(thread) def test__spawn_link_callback_added_after_execution(self): def func(): pass link_callback = mock.Mock() self.service.start() thread = self.service._spawn_worker(func) self.service._worker_pool.waitall() # func_mock finished at this moment thread.link(link_callback) link_callback.assert_called_once_with(thread) def test__spawn_link_callback_exception_inside_thread(self): def func(): time.sleep(1) raise Exception() link_callback = mock.Mock() self.service.start() thread = self.service._spawn_worker(func) # func_mock executing at this moment thread.link(link_callback) self.service._worker_pool.waitall() link_callback.assert_called_once_with(thread) def test__spawn_link_callback_added_after_exception_inside_thread(self): def func(): raise Exception() link_callback = mock.Mock() self.service.start() thread = self.service._spawn_worker(func) self.service._worker_pool.waitall() # func_mock finished at this moment thread.link(link_callback) link_callback.assert_called_once_with(thread) def test_destroy_node(self): self.service.start() ndict = utils.get_test_node(driver='fake') node = self.dbapi.create_node(ndict) self.service.destroy_node(self.context, node.uuid) self.assertRaises(exception.NodeNotFound, self.dbapi.get_node, node.uuid) def test_destroy_node_reserved(self): self.service.start() fake_reservation = 'fake-reserv' ndict = utils.get_test_node(reservation=fake_reservation) node = self.dbapi.create_node(ndict) exc = self.assertRaises(messaging.ClientException, self.service.destroy_node, self.context, node.uuid) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NodeLocked) # Verify existing reservation wasn't broken. node.refresh(self.context) self.assertEqual(fake_reservation, node.reservation) def test_destroy_node_associated(self): self.service.start() ndict = utils.get_test_node(instance_uuid='fake-uuid') node = self.dbapi.create_node(ndict) exc = self.assertRaises(messaging.ClientException, self.service.destroy_node, self.context, node.uuid) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NodeAssociated) # Verify reservation was released. node.refresh(self.context) self.assertIsNone(node.reservation) @mock.patch.object(timeutils, 'utcnow') def test__check_deploy_timeouts_timeout(self, mock_utcnow): self.config(deploy_callback_timeout=60, group='conductor') past = datetime.datetime(2000, 1, 1, 0, 0) present = past + datetime.timedelta(minutes=5) mock_utcnow.return_value = past self.service.start() n = utils.get_test_node(provision_state=states.DEPLOYWAIT, target_provision_state=states.DEPLOYDONE, provision_updated_at=past) node = self.dbapi.create_node(n) mock_utcnow.return_value = present with mock.patch.object(self.driver.deploy, 'clean_up') as clean_mock: self.service._check_deploy_timeouts(self.context) self.service._worker_pool.waitall() node.refresh(self.context) self.assertEqual(states.DEPLOYFAIL, node.provision_state) self.assertEqual(states.NOSTATE, node.target_provision_state) self.assertIsNotNone(node.last_error) clean_mock.assert_called_once_with(mock.ANY, mock.ANY) @mock.patch.object(timeutils, 'utcnow') def test__check_deploy_timeouts_no_timeout(self, mock_utcnow): self.config(deploy_callback_timeout=600, group='conductor') past = datetime.datetime(2000, 1, 1, 0, 0) present = past + datetime.timedelta(minutes=5) mock_utcnow.return_value = past self.service.start() n = utils.get_test_node(provision_state=states.DEPLOYWAIT, target_provision_state=states.DEPLOYDONE, provision_updated_at=past) node = self.dbapi.create_node(n) mock_utcnow.return_value = present with mock.patch.object(self.driver.deploy, 'clean_up') as clean_mock: self.service._check_deploy_timeouts(self.context) node.refresh(self.context) self.assertEqual(states.DEPLOYWAIT, node.provision_state) self.assertEqual(states.DEPLOYDONE, node.target_provision_state) self.assertIsNone(node.last_error) self.assertFalse(clean_mock.called) def test__check_deploy_timeouts_disabled(self): self.config(deploy_callback_timeout=0, group='conductor') self.service.start() with mock.patch.object(self.dbapi, 'get_nodeinfo_list') as get_mock: self.service._check_deploy_timeouts(self.context) self.assertFalse(get_mock.called) @mock.patch.object(timeutils, 'utcnow') def test__check_deploy_timeouts_cleanup_failed(self, mock_utcnow): self.config(deploy_callback_timeout=60, group='conductor') past = datetime.datetime(2000, 1, 1, 0, 0) present = past + datetime.timedelta(minutes=5) mock_utcnow.return_value = past self.service.start() n = utils.get_test_node(provision_state=states.DEPLOYWAIT, target_provision_state=states.DEPLOYDONE, provision_updated_at=past) node = self.dbapi.create_node(n) mock_utcnow.return_value = present with mock.patch.object(self.driver.deploy, 'clean_up') as clean_mock: error = 'test-123' clean_mock.side_effect = exception.IronicException(message=error) self.service._check_deploy_timeouts(self.context) self.service._worker_pool.waitall() node.refresh(self.context) self.assertEqual(states.DEPLOYFAIL, node.provision_state) self.assertEqual(states.NOSTATE, node.target_provision_state) self.assertIn(error, node.last_error) self.assertIsNone(node.reservation) def test_set_console_mode_worker_pool_full(self): ndict = utils.get_test_node(driver='fake') node = self.dbapi.create_node(ndict) self.service.start() with mock.patch.object(self.service, '_spawn_worker') \ as spawn_mock: spawn_mock.side_effect = exception.NoFreeConductorWorker() exc = self.assertRaises(messaging.ClientException, self.service.set_console_mode, self.context, node.uuid, True) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NoFreeConductorWorker) self.service._worker_pool.waitall() spawn_mock.assert_called_once_with(mock.ANY, mock.ANY, mock.ANY) def test_set_console_mode_enabled(self): ndict = utils.get_test_node(driver='fake') node = self.dbapi.create_node(ndict) self.service.start() self.service.set_console_mode(self.context, node.uuid, True) self.service._worker_pool.waitall() node.refresh(self.context) self.assertTrue(node.console_enabled) def test_set_console_mode_disabled(self): ndict = utils.get_test_node(driver='fake') node = self.dbapi.create_node(ndict) self.service.start() self.service.set_console_mode(self.context, node.uuid, False) self.service._worker_pool.waitall() node.refresh(self.context) self.assertFalse(node.console_enabled) def test_set_console_mode_not_supported(self): ndict = utils.get_test_node(driver='fake', last_error=None) node = self.dbapi.create_node(ndict) self.service.start() # null the console interface self.driver.console = None exc = self.assertRaises(messaging.ClientException, self.service.set_console_mode, self.context, node.uuid, True) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.UnsupportedDriverExtension) self.service._worker_pool.waitall() node.refresh(self.context) self.assertIsNotNone(node.last_error) def test_set_console_mode_validation_fail(self): ndict = utils.get_test_node(driver='fake', last_error=None) node = self.dbapi.create_node(ndict) self.service.start() with mock.patch.object(self.driver.console, 'validate') as mock_val: mock_val.side_effect = exception.InvalidParameterValue('error') exc = self.assertRaises(messaging.ClientException, self.service.set_console_mode, self.context, node.uuid, True) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.InvalidParameterValue) def test_set_console_mode_start_fail(self): ndict = utils.get_test_node(driver='fake', last_error=None, console_enabled=False) node = self.dbapi.create_node(ndict) self.service.start() with mock.patch.object(self.driver.console, 'start_console') \ as mock_sc: mock_sc.side_effect = exception.IronicException('test-error') self.service.set_console_mode(self.context, node.uuid, True) self.service._worker_pool.waitall() mock_sc.assert_called_once_with(mock.ANY, mock.ANY) node.refresh(self.context) self.assertIsNotNone(node.last_error) def test_set_console_mode_stop_fail(self): ndict = utils.get_test_node(driver='fake', last_error=None, console_enabled=True) node = self.dbapi.create_node(ndict) self.service.start() with mock.patch.object(self.driver.console, 'stop_console') \ as mock_sc: mock_sc.side_effect = exception.IronicException('test-error') self.service.set_console_mode(self.context, node.uuid, False) self.service._worker_pool.waitall() mock_sc.assert_called_once_with(mock.ANY, mock.ANY) node.refresh(self.context) self.assertIsNotNone(node.last_error) def test_enable_console_already_enabled(self): ndict = utils.get_test_node(driver='fake', console_enabled=True) node = self.dbapi.create_node(ndict) self.service.start() with mock.patch.object(self.driver.console, 'start_console') \ as mock_sc: self.service.set_console_mode(self.context, node.uuid, True) self.service._worker_pool.waitall() self.assertFalse(mock_sc.called) def test_disable_console_already_disabled(self): ndict = utils.get_test_node(driver='fake', console_enabled=False) node = self.dbapi.create_node(ndict) self.service.start() with mock.patch.object(self.driver.console, 'stop_console') \ as mock_sc: self.service.set_console_mode(self.context, node.uuid, False) self.service._worker_pool.waitall() self.assertFalse(mock_sc.called) def test_get_console(self): ndict = utils.get_test_node(driver='fake', console_enabled=True) node = self.dbapi.create_node(ndict) console_info = {'test': 'test info'} with mock.patch.object(self.driver.console, 'get_console') as mock_gc: mock_gc.return_value = console_info data = self.service.get_console_information(self.context, node.uuid) self.assertEqual(console_info, data) def test_get_console_not_supported(self): ndict = utils.get_test_node(driver='fake', console_enabled=True) node = self.dbapi.create_node(ndict) # null the console interface self.driver.console = None exc = self.assertRaises(messaging.ClientException, self.service.get_console_information, self.context, node.uuid) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.UnsupportedDriverExtension) def test_get_console_disabled(self): ndict = utils.get_test_node(driver='fake', console_enabled=False) node = self.dbapi.create_node(ndict) exc = self.assertRaises(messaging.ClientException, self.service.get_console_information, self.context, node.uuid) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NodeConsoleNotEnabled) def test_get_console_validate_fail(self): ndict = utils.get_test_node(driver='fake', console_enabled=True) node = self.dbapi.create_node(ndict) with mock.patch.object(self.driver.console, 'validate') as mock_gc: mock_gc.side_effect = exception.InvalidParameterValue('error') exc = self.assertRaises(messaging.ClientException, self.service.get_console_information, self.context, node.uuid) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.InvalidParameterValue) def test_destroy_node_power_on(self): self.service.start() ndict = utils.get_test_node(power_state=states.POWER_ON) node = self.dbapi.create_node(ndict) exc = self.assertRaises(messaging.ClientException, self.service.destroy_node, self.context, node.uuid) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NodeInWrongPowerState) # Verify reservation was released. node.refresh(self.context) self.assertIsNone(node.reservation) def test_destroy_node_power_off(self): self.service.start() ndict = utils.get_test_node(power_state=states.POWER_OFF) node = self.dbapi.create_node(ndict) self.service.destroy_node(self.context, node.uuid) def test_update_port(self): ndict = utils.get_test_node(driver='fake') self.dbapi.create_node(ndict) pdict = utils.get_test_port(extra={'foo': 'bar'}) port = self.dbapi.create_port(pdict) new_extra = {'foo': 'baz'} port.extra = new_extra res = self.service.update_port(self.context, port) self.assertEqual(new_extra, res.extra) def test_update_port_node_locked(self): ndict = utils.get_test_node(driver='fake', reservation='fake-reserv') self.dbapi.create_node(ndict) pdict = utils.get_test_port() port = self.dbapi.create_port(pdict) port.extra = {'foo': 'baz'} exc = self.assertRaises(messaging.ClientException, self.service.update_port, self.context, port) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.NodeLocked) @mock.patch('ironic.common.neutron.NeutronAPI.update_port_address') def test_update_port_address(self, mac_update_mock): ndict = utils.get_test_node(driver='fake') self.dbapi.create_node(ndict) pdict = utils.get_test_port(extra={'vif_port_id': 'fake-id'}) port = self.dbapi.create_port(pdict) new_address = '11:22:33:44:55:bb' port.address = new_address res = self.service.update_port(self.context, port) self.assertEqual(new_address, res.address) mac_update_mock.assert_called_once_with('fake-id', new_address) @mock.patch('ironic.common.neutron.NeutronAPI.update_port_address') def test_update_port_address_fail(self, mac_update_mock): ndict = utils.get_test_node(driver='fake') self.dbapi.create_node(ndict) pdict = utils.get_test_port(extra={'vif_port_id': 'fake-id'}) port = self.dbapi.create_port(pdict) old_address = port.address port.address = '11:22:33:44:55:bb' mac_update_mock.side_effect = exception.FailedToUpdateMacOnPort( port_id=port.uuid) exc = self.assertRaises(messaging.ClientException, self.service.update_port, self.context, port) # Compare true exception hidden by @messaging.client_exceptions self.assertEqual(exc._exc_info[0], exception.FailedToUpdateMacOnPort) port.refresh(self.context) self.assertEqual(old_address, port.address) @mock.patch('ironic.common.neutron.NeutronAPI.update_port_address') def test_update_port_address_no_vif_id(self, mac_update_mock): ndict = utils.get_test_node(driver='fake') self.dbapi.create_node(ndict) pdict = utils.get_test_port() port = self.dbapi.create_port(pdict) new_address = '11:22:33:44:55:bb' port.address = new_address res = self.service.update_port(self.context, port) self.assertEqual(new_address, res.address) self.assertFalse(mac_update_mock.called) ironic-2014.1.rc1/ironic/tests/conductor/utils.py0000664000175300017540000000445112316614116023051 0ustar jenkinsjenkins00000000000000# coding=utf-8 # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """Test utils for Ironic Managers.""" from ironic.common import driver_factory import pkg_resources from stevedore import dispatch def mock_the_extension_manager(driver="fake", namespace="ironic.drivers"): """Get a fake stevedore NameDispatchExtensionManager instance. :param namespace: A string representing the namespace over which to search for entrypoints. :returns mock_ext_mgr: A DriverFactory instance that has been faked. :returns mock_ext: A real plugin loaded by mock_ext_mgr in the specified namespace. """ entry_point = None for ep in list(pkg_resources.iter_entry_points(namespace)): s = "%s" % ep if driver == s[:s.index(' =')]: entry_point = ep break # NOTE(lucasagomes): Initialize the _extension_manager before # instantiaing a DriverFactory class to avoid # a real NameDispatchExtensionManager to be created # with the real namespace. driver_factory.DriverFactory._extension_manager = \ dispatch.NameDispatchExtensionManager('ironic.no-such-namespace', lambda x: True) mock_ext_mgr = driver_factory.DriverFactory() mock_ext = mock_ext_mgr._extension_manager._load_one_plugin( entry_point, True, [], {}, False) mock_ext_mgr._extension_manager.extensions = [mock_ext] mock_ext_mgr._extension_manager.by_name = dict((e.name, e) for e in [mock_ext]) return (mock_ext_mgr, mock_ext) ironic-2014.1.rc1/ironic/tests/conductor/__init__.py0000664000175300017540000000000012316614116023432 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/tests/conductor/test_utils.py0000664000175300017540000000413112316614116024103 0ustar jenkinsjenkins00000000000000# coding=utf-8 # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """Tests for Ironic Manager test utils.""" from ironic.tests import base from ironic.tests.conductor import utils class UtilsTestCase(base.TestCase): def setUp(self): super(UtilsTestCase, self).setUp() def test_fails_to_load_extension(self): self.assertRaises(AttributeError, utils.mock_the_extension_manager, 'fake', 'bad.namespace') self.assertRaises(AttributeError, utils.mock_the_extension_manager, 'no-such-driver', 'ironic.drivers') def test_get_mockable_ext_mgr(self): (mgr, ext) = utils.mock_the_extension_manager('fake', 'ironic.drivers') # confirm that stevedore did not scan the actual entrypoints self.assertNotEqual(mgr._extension_manager.namespace, 'ironic.drivers') # confirm mgr has only one extension self.assertEqual(1, len(mgr._extension_manager.extensions)) # confirm that we got a reference to the extension in this manager self.assertEqual(ext, mgr._extension_manager.extensions[0]) # confirm that it is the "fake" driver we asked for self.assertEqual("fake = ironic.drivers.fake:FakeDriver", "%s" % ext.entry_point) # Confirm driver is loaded self.assertIn('fake', mgr.names) ironic-2014.1.rc1/ironic/tests/conductor/test_task_manager.py0000664000175300017540000002142512316614116025404 0ustar jenkinsjenkins00000000000000# coding=utf-8 # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """Tests for :class:`ironic.conductor.task_manager`.""" from testtools import matchers from ironic.common import driver_factory from ironic.common import exception from ironic.common import utils as ironic_utils from ironic.conductor import task_manager from ironic.db import api as dbapi from ironic.openstack.common import context from ironic.tests.conductor import utils as mgr_utils from ironic.tests.db import base from ironic.tests.db import utils def create_fake_node(i): dbh = dbapi.get_instance() node = utils.get_test_node(id=i, uuid=ironic_utils.generate_uuid()) dbh.create_node(node) return node['uuid'] def ContainsUUIDs(uuids): def _task_uuids(task): return sorted([r.node.uuid for r in task.resources]) return matchers.AfterPreprocessing( _task_uuids, matchers.Equals(uuids)) class TaskManagerSetup(base.DbTestCase): def setUp(self): super(TaskManagerSetup, self).setUp() self.dbapi = dbapi.get_instance() self.context = context.get_admin_context() mgr_utils.mock_the_extension_manager() self.driver = driver_factory.get_driver("fake") self.config(host='test-host') class TaskManagerTestCase(TaskManagerSetup): def setUp(self): super(TaskManagerTestCase, self).setUp() self.uuids = [create_fake_node(i) for i in range(1, 6)] self.uuids.sort() def test_task_manager_gets_node(self): node_uuid = self.uuids[0] task = task_manager.TaskManager(self.context, node_uuid) self.assertEqual(node_uuid, task.node.uuid) def test_task_manager_updates_db(self): node_uuid = self.uuids[0] node = self.dbapi.get_node(node_uuid) self.assertIsNone(node.reservation) with task_manager.acquire(self.context, node_uuid) as task: self.assertEqual(node.uuid, task.node.uuid) node.refresh(self.context) self.assertEqual('test-host', node.reservation) node.refresh(self.context) self.assertIsNone(node.reservation) def test_get_many_nodes(self): uuids = self.uuids[1:3] with task_manager.acquire(self.context, uuids) as task: self.assertThat(task, ContainsUUIDs(uuids)) for node in [r.node for r in task.resources]: self.assertEqual('test-host', node.reservation) # Ensure all reservations are cleared for uuid in self.uuids: node = self.dbapi.get_node(uuid) self.assertIsNone(node.reservation) def test_get_nodes_nested(self): uuids = self.uuids[0:2] more_uuids = self.uuids[3:4] with task_manager.acquire(self.context, uuids) as task: self.assertThat(task, ContainsUUIDs(uuids)) with task_manager.acquire(self.context, more_uuids) as another_task: self.assertThat(another_task, ContainsUUIDs(more_uuids)) def test_get_shared_lock(self): uuids = self.uuids[0:2] # confirm we can elevate from shared -> exclusive with task_manager.acquire(self.context, uuids, shared=True) as task: self.assertThat(task, ContainsUUIDs(uuids)) with task_manager.acquire(self.context, uuids, shared=False) as inner_task: self.assertThat(inner_task, ContainsUUIDs(uuids)) # confirm someone else can still get a shared lock with task_manager.acquire(self.context, uuids, shared=False) as task: self.assertThat(task, ContainsUUIDs(uuids)) with task_manager.acquire(self.context, uuids, shared=True) as inner_task: self.assertThat(inner_task, ContainsUUIDs(uuids)) def test_get_one_node_already_locked(self): node_uuid = self.uuids[0] task_manager.TaskManager(self.context, node_uuid) # Check that db node reservation is still set # if another TaskManager attempts to acquire the same node self.assertRaises(exception.NodeLocked, task_manager.TaskManager, self.context, node_uuid) node = self.dbapi.get_node(node_uuid) self.assertEqual('test-host', node.reservation) def test_get_many_nodes_some_already_locked(self): unlocked_node_uuids = self.uuids[0:2] + self.uuids[3:5] locked_node_uuid = self.uuids[2] task_manager.TaskManager(self.context, locked_node_uuid) # Check that none of the other nodes are reserved # and the one which we first locked has not been unlocked self.assertRaises(exception.NodeLocked, task_manager.TaskManager, self.context, self.uuids) node = self.dbapi.get_node(locked_node_uuid) self.assertEqual('test-host', node.reservation) for uuid in unlocked_node_uuids: node = self.dbapi.get_node(uuid) self.assertIsNone(node.reservation) def test_get_one_node_driver_load_exception(self): node_uuid = self.uuids[0] self.assertRaises(exception.DriverNotFound, task_manager.TaskManager, self.context, node_uuid, driver_name='no-such-driver') # Check that db node reservation is not set. node = self.dbapi.get_node(node_uuid) self.assertIsNone(node.reservation) class ExclusiveLockDecoratorTestCase(TaskManagerSetup): def setUp(self): super(ExclusiveLockDecoratorTestCase, self).setUp() self.uuids = [create_fake_node(123)] def test_require_exclusive_lock(self): @task_manager.require_exclusive_lock def do_state_change(task): for r in task.resources: task.dbapi.update_node(r.node.uuid, {'power_state': 'test-state'}) with task_manager.acquire(self.context, self.uuids, shared=True) as task: self.assertRaises(exception.ExclusiveLockRequired, do_state_change, task) with task_manager.acquire(self.context, self.uuids, shared=False) as task: do_state_change(task) for uuid in self.uuids: res = self.dbapi.get_node(uuid) self.assertEqual('test-state', res.power_state) @task_manager.require_exclusive_lock def _do_state_change(self, task): for r in task.resources: task.dbapi.update_node(r.node.uuid, {'power_state': 'test-state'}) def test_require_exclusive_lock_on_object(self): with task_manager.acquire(self.context, self.uuids, shared=True) as task: self.assertRaises(exception.ExclusiveLockRequired, self._do_state_change, task) with task_manager.acquire(self.context, self.uuids, shared=False) as task: self._do_state_change(task) for uuid in self.uuids: res = self.dbapi.get_node(uuid) self.assertEqual('test-state', res.power_state) def test_one_node_per_task_properties(self): with task_manager.acquire(self.context, self.uuids) as task: self.assertEqual(task.node, task.resources[0].node) self.assertEqual(task.driver, task.resources[0].driver) self.assertEqual(task.node_manager, task.resources[0]) def test_one_node_per_task_properties_fail(self): self.uuids.append(create_fake_node(456)) with task_manager.acquire(self.context, self.uuids) as task: def get_node(): return task.node def get_driver(): return task.driver def get_node_manager(): return task.node_manager self.assertRaises(AttributeError, get_node) self.assertRaises(AttributeError, get_driver) self.assertRaises(AttributeError, get_node_manager) ironic-2014.1.rc1/ironic/tests/conductor/test_rpcapi.py0000664000175300017540000001365412316614116024233 0ustar jenkinsjenkins00000000000000# coding=utf-8 # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """ Unit Tests for :py:class:`ironic.conductor.rpcapi.ConductorAPI`. """ import fixtures from oslo.config import cfg from ironic.common import exception from ironic.common import states from ironic.conductor import rpcapi as conductor_rpcapi from ironic.db import api as dbapi from ironic import objects from ironic.openstack.common import context from ironic.tests.db import base from ironic.tests.db import utils as dbutils CONF = cfg.CONF class RPCAPITestCase(base.DbTestCase): def setUp(self): super(RPCAPITestCase, self).setUp() self.context = context.get_admin_context() self.dbapi = dbapi.get_instance() self.fake_node = dbutils.get_test_node(driver='fake-driver') self.fake_node_obj = objects.Node._from_db_object( objects.Node(), self.fake_node) def test_serialized_instance_has_uuid(self): self.assertTrue('uuid' in self.fake_node) def test_get_topic_for_known_driver(self): CONF.set_override('host', 'fake-host') self.dbapi.register_conductor({'hostname': 'fake-host', 'drivers': ['fake-driver']}) rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') expected_topic = 'fake-topic.fake-host' self.assertEqual(expected_topic, rpcapi.get_topic_for(self.fake_node_obj)) def test_get_topic_for_unknown_driver(self): CONF.set_override('host', 'fake-host') self.dbapi.register_conductor({'hostname': 'fake-host', 'drivers': ['other-driver']}) rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') self.assertRaises(exception.NoValidHost, rpcapi.get_topic_for, self.fake_node_obj) def _test_rpcapi(self, method, rpc_method, **kwargs): ctxt = context.get_admin_context() rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') expected_retval = 'hello world' if rpc_method == 'call' else None expected_version = kwargs.pop('version', rpcapi.RPC_API_VERSION) expected_msg = rpcapi.make_msg(method, **kwargs) expected_msg['version'] = expected_version expected_topic = 'fake-topic' if 'host' in kwargs: expected_topic += ".%s" % kwargs['host'] self.fake_args = None self.fake_kwargs = None def _fake_rpc_method(*args, **kwargs): self.fake_args = args self.fake_kwargs = kwargs if expected_retval: return expected_retval self.useFixture(fixtures.MonkeyPatch( "ironic.openstack.common.rpc.%s" % rpc_method, _fake_rpc_method)) retval = getattr(rpcapi, method)(ctxt, **kwargs) self.assertEqual(expected_retval, retval) expected_args = [ctxt, expected_topic, expected_msg] for arg, expected_arg in zip(self.fake_args, expected_args): self.assertEqual(expected_arg, arg) def test_update_node(self): self._test_rpcapi('update_node', 'call', node_obj=self.fake_node) def test_change_node_power_state(self): self._test_rpcapi('change_node_power_state', 'call', node_id=self.fake_node['uuid'], new_state=states.POWER_ON) def test_pass_vendor_info(self): self._test_rpcapi('vendor_passthru', 'call', node_id=self.fake_node['uuid'], driver_method='test-driver-method', info={"test_info": "test_value"}) def test_do_node_deploy(self): self._test_rpcapi('do_node_deploy', 'call', node_id=self.fake_node['uuid']) def test_do_node_tear_down(self): self._test_rpcapi('do_node_tear_down', 'call', node_id=self.fake_node['uuid']) def test_validate_driver_interfaces(self): self._test_rpcapi('validate_driver_interfaces', 'call', node_id=self.fake_node['uuid']) def test_change_node_maintenance_mode(self): self._test_rpcapi('change_node_maintenance_mode', 'call', node_id=self.fake_node['uuid'], mode=True) def test_destroy_node(self): self._test_rpcapi('destroy_node', 'call', node_id=self.fake_node['uuid']) def test_get_console_information(self): self._test_rpcapi('get_console_information', 'call', node_id=self.fake_node['uuid']) def test_set_console_mode(self): self._test_rpcapi('set_console_mode', 'call', node_id=self.fake_node['uuid'], enabled=True) def test_update_port(self): fake_port = dbutils.get_test_port() self._test_rpcapi('update_port', 'call', port_obj=fake_port) ironic-2014.1.rc1/ironic/tests/conductor/test_conductor_utils.py0000664000175300017540000003131212316614116026164 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 mock from ironic.common import driver_factory from ironic.common import exception from ironic.common import states from ironic.common import utils as cmn_utils from ironic.conductor import task_manager from ironic.conductor import utils as conductor_utils from ironic.db import api as dbapi from ironic.openstack.common import context from ironic.tests.conductor import utils as mgr_utils from ironic.tests.db import base from ironic.tests.db import utils class NodeSetBootDeviceTestCase(base.DbTestCase): def setUp(self): super(NodeSetBootDeviceTestCase, self).setUp() self.context = context.get_admin_context() self.dbapi = dbapi.get_instance() def test_node_set_boot_device_non_existent_device(self): mgr_utils.mock_the_extension_manager(driver="fake_ipmitool") self.driver = driver_factory.get_driver("fake_ipmitool") ndict = utils.get_test_node(uuid=cmn_utils.generate_uuid(), driver='fake_ipmitool') node = self.dbapi.create_node(ndict) task = task_manager.TaskManager(self.context, node.uuid) self.assertRaises(exception.InvalidParameterValue, conductor_utils.node_set_boot_device, task, task.node, device='fake') def test_node_set_boot_device_valid(self): mgr_utils.mock_the_extension_manager(driver="fake_ipmitool") self.driver = driver_factory.get_driver("fake_ipmitool") ipmi_info = utils.get_test_ipmi_info() ndict = utils.get_test_node(uuid=cmn_utils.generate_uuid(), driver='fake_ipmitool', driver_info=ipmi_info) node = self.dbapi.create_node(ndict) task = task_manager.TaskManager(self.context, node.uuid) with mock.patch.object(self.driver.vendor, 'vendor_passthru') as driver_vpassthru: conductor_utils.node_set_boot_device(task, task.node, device='pxe') driver_vpassthru.assert_called_once_with(task, task.node, device='pxe', persistent=False, method='set_boot_device') class NodePowerActionTestCase(base.DbTestCase): def setUp(self): super(NodePowerActionTestCase, self).setUp() self.context = context.get_admin_context() self.dbapi = dbapi.get_instance() mgr_utils.mock_the_extension_manager() self.driver = driver_factory.get_driver("fake") def test_node_power_action_power_on(self): """Test node_power_action to turn node power on.""" ndict = utils.get_test_node(uuid=cmn_utils.generate_uuid(), driver='fake', power_state=states.POWER_OFF) node = self.dbapi.create_node(ndict) task = task_manager.TaskManager(self.context, node.uuid) with mock.patch.object(self.driver.power, 'get_power_state') \ as get_power_mock: get_power_mock.return_value = states.POWER_OFF conductor_utils.node_power_action(task, task.node, states.POWER_ON) node.refresh(self.context) get_power_mock.assert_called_once_with(mock.ANY, mock.ANY) self.assertEqual(states.POWER_ON, node['power_state']) self.assertIsNone(node['target_power_state']) self.assertIsNone(node['last_error']) def test_node_power_action_power_off(self): """Test node_power_action to turn node power off.""" ndict = utils.get_test_node(uuid=cmn_utils.generate_uuid(), driver='fake', power_state=states.POWER_ON) node = self.dbapi.create_node(ndict) task = task_manager.TaskManager(self.context, node.uuid) with mock.patch.object(self.driver.power, 'get_power_state') \ as get_power_mock: get_power_mock.return_value = states.POWER_ON conductor_utils.node_power_action(task, task.node, states.POWER_OFF) node.refresh(self.context) get_power_mock.assert_called_once_with(mock.ANY, mock.ANY) self.assertEqual(states.POWER_OFF, node['power_state']) self.assertIsNone(node['target_power_state']) self.assertIsNone(node['last_error']) def test_node_power_action_power_reboot(self): """Test for reboot a node.""" ndict = utils.get_test_node(uuid=cmn_utils.generate_uuid(), driver='fake', power_state=states.POWER_ON) node = self.dbapi.create_node(ndict) task = task_manager.TaskManager(self.context, node.uuid) with mock.patch.object(self.driver.power, 'reboot') as reboot_mock: conductor_utils.node_power_action(task, task.node, states.REBOOT) node.refresh(self.context) reboot_mock.assert_called_once_with(mock.ANY, mock.ANY) self.assertEqual(states.POWER_ON, node['power_state']) self.assertIsNone(node['target_power_state']) self.assertIsNone(node['last_error']) def test_node_power_action_invalid_state(self): """Test if an exception is thrown when changing to an invalid power state. """ ndict = utils.get_test_node(uuid=cmn_utils.generate_uuid(), driver='fake', power_state=states.POWER_ON) node = self.dbapi.create_node(ndict) task = task_manager.TaskManager(self.context, node.uuid) with mock.patch.object(self.driver.power, 'get_power_state') \ as get_power_mock: get_power_mock.return_value = states.POWER_ON self.assertRaises(exception.InvalidParameterValue, conductor_utils.node_power_action, task, task.node, "INVALID_POWER_STATE") node.refresh(self.context) get_power_mock.assert_called_once_with(mock.ANY, mock.ANY) self.assertEqual(states.POWER_ON, node['power_state']) self.assertIsNone(node['target_power_state']) self.assertIsNotNone(node['last_error']) # last_error is cleared when a new transaction happens conductor_utils.node_power_action(task, task.node, states.POWER_OFF) node.refresh(self.context) self.assertEqual(states.POWER_OFF, node['power_state']) self.assertIsNone(node['target_power_state']) self.assertIsNone(node['last_error']) def test_node_power_action_already_being_processed(self): """The target_power_state is expected to be None so it isn't checked in the code. This is what happens if it is not None. (Eg, if a conductor had died during a previous power-off attempt and left the target_power_state set to states.POWER_OFF, and the user is attempting to power-off again.) """ ndict = utils.get_test_node(uuid=cmn_utils.generate_uuid(), driver='fake', power_state=states.POWER_ON, target_power_state=states.POWER_OFF) node = self.dbapi.create_node(ndict) task = task_manager.TaskManager(self.context, node.uuid) conductor_utils.node_power_action(task, task.node, states.POWER_OFF) node.refresh(self.context) self.assertEqual(states.POWER_OFF, node['power_state']) self.assertEqual(states.NOSTATE, node['target_power_state']) self.assertIsNone(node['last_error']) def test_node_power_action_in_same_state(self): """Test that we don't try to set the power state if the requested state is the same as the current state. """ ndict = utils.get_test_node(uuid=cmn_utils.generate_uuid(), driver='fake', last_error='anything but None', power_state=states.POWER_ON) node = self.dbapi.create_node(ndict) task = task_manager.TaskManager(self.context, node.uuid) with mock.patch.object(self.driver.power, 'get_power_state') \ as get_power_mock: get_power_mock.return_value = states.POWER_ON with mock.patch.object(self.driver.power, 'set_power_state') \ as set_power_mock: conductor_utils.node_power_action(task, task.node, states.POWER_ON) node.refresh(self.context) get_power_mock.assert_called_once_with(mock.ANY, mock.ANY) self.assertFalse(set_power_mock.called, "set_power_state unexpectedly called") self.assertEqual(states.POWER_ON, node['power_state']) self.assertIsNone(node['target_power_state']) self.assertIsNone(node['last_error']) def test_node_power_action_invalid_driver_info(self): """Test if an exception is thrown when the driver validation fails. """ ndict = utils.get_test_node(uuid=cmn_utils.generate_uuid(), driver='fake', power_state=states.POWER_ON) node = self.dbapi.create_node(ndict) task = task_manager.TaskManager(self.context, node.uuid) with mock.patch.object(self.driver.power, 'validate') \ as validate_mock: validate_mock.side_effect = exception.InvalidParameterValue( 'wrong power driver info') self.assertRaises(exception.InvalidParameterValue, conductor_utils.node_power_action, task, task.node, states.POWER_ON) node.refresh(self.context) validate_mock.assert_called_once_with(mock.ANY, mock.ANY) self.assertEqual(states.POWER_ON, node['power_state']) self.assertIsNone(node['target_power_state']) self.assertIsNotNone(node['last_error']) def test_node_power_action_set_power_failure(self): """Test if an exception is thrown when the set_power call fails. """ ndict = utils.get_test_node(uuid=cmn_utils.generate_uuid(), driver='fake', power_state=states.POWER_OFF) node = self.dbapi.create_node(ndict) task = task_manager.TaskManager(self.context, node.uuid) with mock.patch.object(self.driver.power, 'get_power_state') \ as get_power_mock: with mock.patch.object(self.driver.power, 'set_power_state') \ as set_power_mock: get_power_mock.return_value = states.POWER_OFF set_power_mock.side_effect = exception.IronicException() self.assertRaises( exception.IronicException, conductor_utils.node_power_action, task, task.node, states.POWER_ON) node.refresh(self.context) get_power_mock.assert_called_once_with(mock.ANY, mock.ANY) set_power_mock.assert_called_once_with(mock.ANY, mock.ANY, states.POWER_ON) self.assertEqual(states.POWER_OFF, node['power_state']) self.assertIsNone(node['target_power_state']) self.assertIsNotNone(node['last_error']) ironic-2014.1.rc1/ironic/tests/test_neutron.py0000664000175300017540000001431712316614116022444 0ustar jenkinsjenkins00000000000000# # Copyright 2014 OpenStack Foundation # 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 mock from neutronclient.common import exceptions as neutron_client_exc from neutronclient.v2_0 import client from oslo.config import cfg from ironic.common import exception from ironic.common import neutron from ironic.openstack.common import context from ironic.tests import base CONF = cfg.CONF class TestNeutron(base.TestCase): def setUp(self): super(TestNeutron, self).setUp() self.config(url='test-url', url_timeout=30, group='neutron') self.config(insecure=False, certfile='test-file', admin_user='test-admin-user', admin_tenant_name='test-admin-tenant', admin_password='test-admin-password', auth_uri='test-auth-uri', group='keystone_authtoken') def test_create_with_token(self): token = 'test-token-123' my_context = context.RequestContext(user='test-user', tenant='test-tenant', auth_token=token) expected = {'timeout': 30, 'insecure': False, 'ca_cert': 'test-file', 'token': token, 'endpoint_url': 'test-url', 'auth_strategy': None} with mock.patch.object(client.Client, "__init__") as mock_client_init: mock_client_init.return_value = None neutron.NeutronAPI(my_context) mock_client_init.assert_called_once_with(**expected) def test_create_without_token(self): my_context = context.RequestContext(user='test-user', tenant='test-tenant') expected = {'timeout': 30, 'insecure': False, 'ca_cert': 'test-file', 'endpoint_url': 'test-url', 'username': 'test-admin-user', 'tenant_name': 'test-admin-tenant', 'password': 'test-admin-password', 'auth_url': 'test-auth-uri'} with mock.patch.object(client.Client, "__init__") as mock_client_init: mock_client_init.return_value = None neutron.NeutronAPI(my_context) mock_client_init.assert_called_once_with(**expected) def test_neutron_port_update(self): opts = [{'opt_name': 'bootfile-name', 'opt_value': 'pxelinux.0'}, {'opt_name': 'tftp-server', 'opt_value': '1.1.1.1'}, {'opt_name': 'server-ip-address', 'opt_value': '1.1.1.1'}] port_id = 'fake-port-id' expected = {'port': {'extra_dhcp_opts': opts}} my_context = context.RequestContext(user='test-user', tenant='test-tenant') with mock.patch.object(client.Client, "__init__") as mock_client_init: mock_client_init.return_value = None api = neutron.NeutronAPI(my_context) with mock.patch.object(client.Client, "update_port") as mock_update_port: mock_update_port.return_value = None api.update_port_dhcp_opts(port_id, opts) mock_update_port.assert_called_once_with(port_id, expected) def test_neutron_port_update_with_execption(self): opts = [{}] port_id = 'fake-port-id' my_context = context.RequestContext(user='test-user', tenant='test-tenant') with mock.patch.object(client.Client, "__init__") as mock_client_init: mock_client_init.return_value = None api = neutron.NeutronAPI(my_context) with mock.patch.object(client.Client, "update_port") as mock_update_port: mock_update_port.side_effect = ( neutron_client_exc.NeutronClientException()) self.assertRaises( exception.FailedToUpdateDHCPOptOnPort, api.update_port_dhcp_opts, port_id, opts) @mock.patch.object(client.Client, 'update_port') @mock.patch.object(client.Client, '__init__') def test_neutron_address_update(self, mock_client_init, mock_update_port): address = 'fe:54:00:77:07:d9' port_id = 'fake-port-id' expected = {'port': {'mac_address': address}} my_context = context.RequestContext(user='test-user', tenant='test-tenant') mock_client_init.return_value = None api = neutron.NeutronAPI(my_context) mock_update_port.return_value = None api.update_port_address(port_id, address) mock_update_port.assert_called_once_with(port_id, expected) @mock.patch.object(client.Client, 'update_port') @mock.patch.object(client.Client, '__init__') def test_neutron_address_update_with_exception(self, mock_client_init, mock_update_port): address = 'fe:54:00:77:07:d9' port_id = 'fake-port-id' my_context = context.RequestContext(user='test-user', tenant='test-tenant') mock_client_init.return_value = None api = neutron.NeutronAPI(my_context) mock_update_port.side_effect = ( neutron_client_exc.NeutronClientException()) self.assertRaises(exception.FailedToUpdateMacOnPort, api.update_port_address, port_id, address) ironic-2014.1.rc1/ironic/tests/fake_policy.py0000664000175300017540000000133412316614116022173 0ustar jenkinsjenkins00000000000000# Copyright (c) 2012 OpenStack Foundation # # 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. policy_data = """ { "admin": "role:admin or role:administrator", "admin_api": "is_admin:True", "default": "rule:admin_api" } """ ironic-2014.1.rc1/ironic/tests/drivers/0000775000175300017540000000000012316614636021020 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/tests/drivers/pxe_config.template0000664000175300017540000000115412316614116024670 0ustar jenkinsjenkins00000000000000default deploy label deploy kernel /tftpboot/1be26c0b-03f2-4d2e-ae87-c02d7f33c123/deploy_kernel append initrd=/tftpboot/1be26c0b-03f2-4d2e-ae87-c02d7f33c123/deploy_ramdisk selinux=0 disk=cciss/c0d0,sda,hda,vda iscsi_target_iqn=iqn-1be26c0b-03f2-4d2e-ae87-c02d7f33c123 deployment_id=1be26c0b-03f2-4d2e-ae87-c02d7f33c123 deployment_key=0123456789ABCDEFGHIJKLMNOPQRSTUV ironic_api_url=http://192.168.122.184:6385 troubleshoot=0 test_param ipappend 3 label boot kernel /tftpboot/1be26c0b-03f2-4d2e-ae87-c02d7f33c123/kernel append initrd=/tftpboot/1be26c0b-03f2-4d2e-ae87-c02d7f33c123/ramdisk root={{ ROOT }} ro test_paramironic-2014.1.rc1/ironic/tests/drivers/test_ssh.py0000664000175300017540000011632112316614116023223 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """Test class for Ironic SSH power driver.""" import fixtures import mock import paramiko from ironic.common import driver_factory from ironic.common import exception from ironic.common import states from ironic.common import utils from ironic.conductor import task_manager from ironic.db import api as dbapi from ironic.drivers.modules import ssh from ironic.openstack.common import context from ironic.openstack.common import processutils from ironic.tests import base from ironic.tests.conductor import utils as mgr_utils from ironic.tests.db import base as db_base from ironic.tests.db import utils as db_utils from oslo.config import cfg CONF = cfg.CONF class SSHValidateParametersTestCase(base.TestCase): def test__parse_driver_info_good_password(self): # make sure we get back the expected things node = db_utils.get_test_node( driver='fake_ssh', driver_info=db_utils.get_test_ssh_info('password')) info = ssh._parse_driver_info(node) self.assertIsNotNone(info.get('host')) self.assertIsNotNone(info.get('username')) self.assertIsNotNone(info.get('password')) self.assertIsNotNone(info.get('port')) self.assertIsNotNone(info.get('virt_type')) self.assertIsNotNone(info.get('cmd_set')) self.assertIsNotNone(info.get('uuid')) def test__parse_driver_info_good_key(self): # make sure we get back the expected things node = db_utils.get_test_node( driver='fake_ssh', driver_info=db_utils.get_test_ssh_info('key')) info = ssh._parse_driver_info(node) self.assertIsNotNone(info.get('host')) self.assertIsNotNone(info.get('username')) self.assertIsNotNone(info.get('key_contents')) self.assertIsNotNone(info.get('port')) self.assertIsNotNone(info.get('virt_type')) self.assertIsNotNone(info.get('cmd_set')) self.assertIsNotNone(info.get('uuid')) def test__parse_driver_info_good_file(self): # make sure we get back the expected things d_info = db_utils.get_test_ssh_info('file') tempdir = self.useFixture(fixtures.TempDir()) key_path = tempdir.path + '/foo' open(key_path, 'wt').close() d_info['ssh_key_filename'] = key_path node = db_utils.get_test_node(driver='fake_ssh', driver_info=d_info) info = ssh._parse_driver_info(node) self.assertIsNotNone(info.get('host')) self.assertIsNotNone(info.get('username')) self.assertIsNotNone(info.get('key_filename')) self.assertIsNotNone(info.get('port')) self.assertIsNotNone(info.get('virt_type')) self.assertIsNotNone(info.get('cmd_set')) self.assertIsNotNone(info.get('uuid')) def test__parse_driver_info_bad_file(self): # A filename that doesn't exist errors. info = db_utils.get_test_ssh_info('file') node = db_utils.get_test_node(driver='fake_ssh', driver_info=info) self.assertRaises( exception.InvalidParameterValue, ssh._parse_driver_info, node) def test__parse_driver_info_too_many(self): info = db_utils.get_test_ssh_info('too_many') node = db_utils.get_test_node(driver='fake_ssh', driver_info=info) self.assertRaises( exception.InvalidParameterValue, ssh._parse_driver_info, node) def test__parse_driver_info_missing_host(self): # make sure error is raised when info is missing info = db_utils.get_test_ssh_info() del info['ssh_address'] node = db_utils.get_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, ssh._parse_driver_info, node) def test__parse_driver_info_missing_user(self): # make sure error is raised when info is missing info = db_utils.get_test_ssh_info() del info['ssh_username'] node = db_utils.get_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, ssh._parse_driver_info, node) def test__parse_driver_info_missing_creds(self): # make sure error is raised when info is missing info = db_utils.get_test_ssh_info('no-creds') node = db_utils.get_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, ssh._parse_driver_info, node) def test__parse_driver_info_missing_virt_type(self): # make sure error is raised when info is missing info = db_utils.get_test_ssh_info() del info['ssh_virt_type'] node = db_utils.get_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, ssh._parse_driver_info, node) def test__parse_driver_info_ssh_port_wrong_type(self): # make sure error is raised when ssh_port is not integer info = db_utils.get_test_ssh_info() info['ssh_port'] = 'wrong_port_value' node = db_utils.get_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, ssh._parse_driver_info, node) def test__normalize_mac_string(self): mac_raw = "0A:1B-2C-3D:4F" mac_clean = ssh._normalize_mac(mac_raw) self.assertEqual("0a1b2c3d4f", mac_clean) def test__normalize_mac_unicode(self): mac_raw = u"0A:1B-2C-3D:4F" mac_clean = ssh._normalize_mac(mac_raw) self.assertEqual("0a1b2c3d4f", mac_clean) def test__parse_driver_info_with_custom_libvirt_uri(self): CONF.set_override('libvirt_uri', 'qemu:///foo', 'ssh') expected_base_cmd = "/usr/bin/virsh --connect qemu:///foo" node = db_utils.get_test_node( driver='fake_ssh', driver_info=db_utils.get_test_ssh_info()) node['driver_info']['ssh_virt_type'] = 'virsh' info = ssh._parse_driver_info(node) self.assertEqual(expected_base_cmd, info['cmd_set']['base_cmd']) class SSHPrivateMethodsTestCase(base.TestCase): def setUp(self): super(SSHPrivateMethodsTestCase, self).setUp() self.node = db_utils.get_test_node( driver='fake_ssh', driver_info=db_utils.get_test_ssh_info()) self.sshclient = paramiko.SSHClient() # Set up the mock for processutils.ssh_execute because most tests use # it. processutils.ssh_execute returns (stdout, stderr). self.ssh_patcher = mock.patch.object(processutils, 'ssh_execute') self.exec_ssh_mock = self.ssh_patcher.start() self.exec_ssh_mock.return_value = ('', '') def stop_patcher(): if self.ssh_patcher: self.ssh_patcher.stop() self.addCleanup(stop_patcher) def test__get_connection_client(self): with mock.patch.object( utils, 'ssh_connect') as ssh_connect_mock: ssh_connect_mock.return_value = self.sshclient client = ssh._get_connection(self.node) self.assertEqual(self.sshclient, client) driver_info = ssh._parse_driver_info(self.node) ssh_connect_mock.assert_called_once_with(driver_info) def test__get_connection_exception(self): with mock.patch.object( utils, 'ssh_connect') as ssh_connect_mock: ssh_connect_mock.side_effect = exception.SSHConnectFailed( host='fake') self.assertRaises(exception.SSHConnectFailed, ssh._get_connection, self.node) driver_info = ssh._parse_driver_info(self.node) ssh_connect_mock.assert_called_once_with(driver_info) def test__ssh_execute(self): ssh_cmd = "somecmd" expected = ['a', 'b', 'c'] self.exec_ssh_mock.return_value = ('\n'.join(expected), '') lst = ssh._ssh_execute(self.sshclient, ssh_cmd) self.exec_ssh_mock.assert_called_once_with(self.sshclient, ssh_cmd) self.assertEqual(expected, lst) def test__ssh_execute_exception(self): ssh_cmd = "somecmd" self.exec_ssh_mock.side_effect = processutils.ProcessExecutionError self.assertRaises(exception.SSHCommandFailed, ssh._ssh_execute, self.sshclient, ssh_cmd) self.exec_ssh_mock.assert_called_once_with(self.sshclient, ssh_cmd) def test__get_power_status_on(self): info = ssh._parse_driver_info(self.node) with mock.patch.object(ssh, '_get_hosts_name_for_node') \ as get_hosts_name_mock: self.exec_ssh_mock.return_value = ( '"NodeName" {b43c4982-110c-4c29-9325-d5f41b053513}', '') get_hosts_name_mock.return_value = "NodeName" pstate = ssh._get_power_status(self.sshclient, info) ssh_cmd = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['list_running']) self.assertEqual(states.POWER_ON, pstate) self.exec_ssh_mock.assert_called_once_with( self.sshclient, ssh_cmd) get_hosts_name_mock.assert_called_once_with(self.sshclient, info) def test__get_power_status_off(self): info = ssh._parse_driver_info(self.node) with mock.patch.object(ssh, '_get_hosts_name_for_node') \ as get_hosts_name_mock: self.exec_ssh_mock.return_value = ( '"NodeName" {b43c4982-110c-4c29-9325-d5f41b053513}', '') get_hosts_name_mock.return_value = "NotNodeName" pstate = ssh._get_power_status(self.sshclient, info) ssh_cmd = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['list_running']) self.assertEqual(states.POWER_OFF, pstate) self.exec_ssh_mock.assert_called_once_with(self.sshclient, ssh_cmd) get_hosts_name_mock.assert_called_once_with(self.sshclient, info) def test__get_power_status_error(self): info = ssh._parse_driver_info(self.node) with mock.patch.object(ssh, '_get_hosts_name_for_node') \ as get_hosts_name_mock: self.exec_ssh_mock.return_value = ( '"NodeName" {b43c4982-110c-4c29-9325-d5f41b053513}', '') info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] get_hosts_name_mock.return_value = None self.assertRaises(exception.NodeNotFound, ssh._get_power_status, self.sshclient, info) ssh_cmd = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['list_running']) self.exec_ssh_mock.assert_called_once_with( self.sshclient, ssh_cmd) get_hosts_name_mock.assert_called_once_with(self.sshclient, info) def test__get_power_status_exception(self): info = ssh._parse_driver_info(self.node) self.exec_ssh_mock.side_effect = processutils.ProcessExecutionError self.assertRaises(exception.SSHCommandFailed, ssh._get_power_status, self.sshclient, info) ssh_cmd = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['list_running']) self.exec_ssh_mock.assert_called_once_with( self.sshclient, ssh_cmd) def test__get_hosts_name_for_node_match(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] ssh_cmd = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['list_all']) cmd_to_exec = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['get_node_macs']) cmd_to_exec = cmd_to_exec.replace('{_NodeName_}', 'NodeName') self.exec_ssh_mock.side_effect = [('NodeName', ''), ('52:54:00:cf:2d:31', '')] expected = [mock.call(self.sshclient, ssh_cmd), mock.call(self.sshclient, cmd_to_exec)] found_name = ssh._get_hosts_name_for_node(self.sshclient, info) self.assertEqual('NodeName', found_name) self.assertEqual(expected, self.exec_ssh_mock.call_args_list) def test__get_hosts_name_for_node_no_match(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "22:22:22:22:22:22"] self.exec_ssh_mock.side_effect = [('NodeName', ''), ('52:54:00:cf:2d:31', '')] ssh_cmd = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['list_all']) cmd_to_exec = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['get_node_macs']) cmd_to_exec = cmd_to_exec.replace('{_NodeName_}', 'NodeName') expected = [mock.call(self.sshclient, ssh_cmd), mock.call(self.sshclient, cmd_to_exec)] found_name = ssh._get_hosts_name_for_node(self.sshclient, info) self.assertIsNone(found_name) self.assertEqual(expected, self.exec_ssh_mock.call_args_list) def test__get_hosts_name_for_node_exception(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] ssh_cmd = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['list_all']) cmd_to_exec = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['get_node_macs']) cmd_to_exec = cmd_to_exec.replace('{_NodeName_}', 'NodeName') self.exec_ssh_mock.side_effect = [('NodeName', ''), processutils.ProcessExecutionError] expected = [mock.call(self.sshclient, ssh_cmd), mock.call(self.sshclient, cmd_to_exec)] self.assertRaises(exception.SSHCommandFailed, ssh._get_hosts_name_for_node, self.sshclient, info) self.assertEqual(expected, self.exec_ssh_mock.call_args_list) def test__power_on_good(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] with mock.patch.object(ssh, '_get_power_status') \ as get_power_status_mock: with mock.patch.object(ssh, '_get_hosts_name_for_node') \ as get_hosts_name_mock: get_power_status_mock.side_effect = [states.POWER_OFF, states.POWER_ON] get_hosts_name_mock.return_value = "NodeName" expected = [mock.call(self.sshclient, info), mock.call(self.sshclient, info)] cmd_to_exec = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['start_cmd']) cmd_to_exec = cmd_to_exec.replace('{_NodeName_}', 'NodeName') current_state = ssh._power_on(self.sshclient, info) self.assertEqual(states.POWER_ON, current_state) self.assertEqual(expected, get_power_status_mock.call_args_list) get_hosts_name_mock.assert_called_once_with(self.sshclient, info) self.exec_ssh_mock.assert_called_once_with(self.sshclient, cmd_to_exec) def test__power_on_fail(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] with mock.patch.object(ssh, '_get_power_status') \ as get_power_status_mock: with mock.patch.object(ssh, '_get_hosts_name_for_node') \ as get_hosts_name_mock: get_power_status_mock.side_effect = [states.POWER_OFF, states.POWER_OFF] get_hosts_name_mock.return_value = "NodeName" expected = [mock.call(self.sshclient, info), mock.call(self.sshclient, info)] cmd_to_exec = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['start_cmd']) cmd_to_exec = cmd_to_exec.replace('{_NodeName_}', 'NodeName') current_state = ssh._power_on(self.sshclient, info) self.assertEqual(states.ERROR, current_state) self.assertEqual(expected, get_power_status_mock.call_args_list) get_hosts_name_mock.assert_called_once_with(self.sshclient, info) self.exec_ssh_mock.assert_called_once_with(self.sshclient, cmd_to_exec) def test__power_on_exception(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] self.exec_ssh_mock.side_effect = processutils.ProcessExecutionError with mock.patch.object( ssh, '_get_power_status') as get_power_status_mock: with mock.patch.object( ssh, '_get_hosts_name_for_node') as get_hosts_name_mock: get_power_status_mock.side_effect = [states.POWER_OFF, states.POWER_ON] get_hosts_name_mock.return_value = "NodeName" cmd_to_exec = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['start_cmd']) cmd_to_exec = cmd_to_exec.replace('{_NodeName_}', 'NodeName') self.assertRaises(exception.SSHCommandFailed, ssh._power_on, self.sshclient, info) get_power_status_mock.assert_called_once_with(self.sshclient, info) get_hosts_name_mock.assert_called_once_with(self.sshclient, info) self.exec_ssh_mock.assert_called_once_with(self.sshclient, cmd_to_exec) def test__power_off_good(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] with mock.patch.object(ssh, '_get_power_status') \ as get_power_status_mock: with mock.patch.object(ssh, '_get_hosts_name_for_node') \ as get_hosts_name_mock: get_power_status_mock.side_effect = [states.POWER_ON, states.POWER_OFF] get_hosts_name_mock.return_value = "NodeName" expected = [mock.call(self.sshclient, info), mock.call(self.sshclient, info)] cmd_to_exec = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['stop_cmd']) cmd_to_exec = cmd_to_exec.replace('{_NodeName_}', 'NodeName') current_state = ssh._power_off(self.sshclient, info) self.assertEqual(states.POWER_OFF, current_state) self.assertEqual(expected, get_power_status_mock.call_args_list) get_hosts_name_mock.assert_called_once_with(self.sshclient, info) self.exec_ssh_mock.assert_called_once_with(self.sshclient, cmd_to_exec) def test__power_off_fail(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] with mock.patch.object(ssh, '_get_power_status') \ as get_power_status_mock: with mock.patch.object(ssh, '_get_hosts_name_for_node') \ as get_hosts_name_mock: get_power_status_mock.side_effect = [states.POWER_ON, states.POWER_ON] get_hosts_name_mock.return_value = "NodeName" expected = [mock.call(self.sshclient, info), mock.call(self.sshclient, info)] cmd_to_exec = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['stop_cmd']) cmd_to_exec = cmd_to_exec.replace('{_NodeName_}', 'NodeName') current_state = ssh._power_off(self.sshclient, info) self.assertEqual(states.ERROR, current_state) self.assertEqual(expected, get_power_status_mock.call_args_list) get_hosts_name_mock.assert_called_once_with(self.sshclient, info) self.exec_ssh_mock.assert_called_once_with(self.sshclient, cmd_to_exec) def test__power_off_exception(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] self.exec_ssh_mock.side_effect = processutils.ProcessExecutionError with mock.patch.object( ssh, '_get_power_status') as get_power_status_mock: with mock.patch.object( ssh, '_get_hosts_name_for_node') as get_hosts_name_mock: self.exec_ssh_mock.side_effect = ( processutils.ProcessExecutionError) get_power_status_mock.side_effect = [states.POWER_ON, states.POWER_OFF] get_hosts_name_mock.return_value = "NodeName" cmd_to_exec = "%s %s" % (info['cmd_set']['base_cmd'], info['cmd_set']['stop_cmd']) cmd_to_exec = cmd_to_exec.replace('{_NodeName_}', 'NodeName') self.assertRaises(exception.SSHCommandFailed, ssh._power_off, self.sshclient, info) get_power_status_mock.assert_called_once_with(self.sshclient, info) get_hosts_name_mock.assert_called_once_with(self.sshclient, info) self.exec_ssh_mock.assert_called_once_with(self.sshclient, cmd_to_exec) def test_exec_ssh_command_good(self): # stop mocking the processutils.ssh_execute because we # are testing it here self.ssh_patcher.stop() self.ssh_patcher = None class Channel(object): def recv_exit_status(self): return 0 class Stream(object): def __init__(self, buffer=''): self.buffer = buffer self.channel = Channel() def read(self): return self.buffer def close(self): pass with mock.patch.object(self.sshclient, 'exec_command') \ as exec_command_mock: exec_command_mock.return_value = (Stream(), Stream('hello'), Stream()) stdout, stderr = processutils.ssh_execute(self.sshclient, "command") self.assertEqual('hello', stdout) exec_command_mock.assert_called_once_with("command") def test_exec_ssh_command_fail(self): # stop mocking the processutils.ssh_execute because we # are testing it here self.ssh_patcher.stop() self.ssh_patcher = None class Channel(object): def recv_exit_status(self): return 127 class Stream(object): def __init__(self, buffer=''): self.buffer = buffer self.channel = Channel() def read(self): return self.buffer def close(self): pass with mock.patch.object(self.sshclient, 'exec_command') \ as exec_command_mock: exec_command_mock.return_value = (Stream(), Stream('hello'), Stream()) self.assertRaises(processutils.ProcessExecutionError, processutils.ssh_execute, self.sshclient, "command") exec_command_mock.assert_called_once_with("command") class SSHDriverTestCase(db_base.DbTestCase): def setUp(self): super(SSHDriverTestCase, self).setUp() self.context = context.get_admin_context() mgr_utils.mock_the_extension_manager(driver="fake_ssh") self.driver = driver_factory.get_driver("fake_ssh") n = db_utils.get_test_node( driver='fake_ssh', driver_info=db_utils.get_test_ssh_info()) self.dbapi = dbapi.get_instance() self.node = self.dbapi.create_node(n) self.port = self.dbapi.create_port(db_utils.get_test_port( node_id=self.node.id)) self.sshclient = paramiko.SSHClient() #setup these mocks because most tests use them self.parse_drv_info_patcher = mock.patch.object(ssh, '_parse_driver_info') self.parse_drv_info_mock = None self.get_mac_addr_patcher = mock.patch.object( ssh, '_get_nodes_mac_addresses') self.get_mac_addr_mock = self.get_mac_addr_patcher.start() self.get_conn_patcher = mock.patch.object(ssh, '_get_connection') self.get_conn_mock = self.get_conn_patcher.start() def stop_patchers(): if self.parse_drv_info_mock: self.parse_drv_info_patcher.stop() if self.get_mac_addr_mock: self.get_mac_addr_patcher.stop() if self.get_conn_mock: self.get_conn_patcher.stop() self.addCleanup(stop_patchers) def test__get_nodes_mac_addresses(self): #stop all the mocks because this test does not use them self.get_mac_addr_patcher.stop() self.get_mac_addr_mock = None self.get_conn_patcher.stop() self.get_conn_mock = None ports = [] ports.append(self.port) ports.append( self.dbapi.create_port( db_utils.get_test_port( id=6, node_id=self.node['id'], address='aa:bb:cc', uuid='bb43dc0b-03f2-4d2e-ae87-c02d7f33cc53'))) ports.append( self.dbapi.create_port( db_utils.get_test_port( id=7, node_id=self.node['id'], address='dd:ee:ff', uuid='4fc26c0b-03f2-4d2e-ae87-c02d7f33c234'))) with task_manager.acquire(self.context, [self.node['uuid']]) as task: node_macs = ssh._get_nodes_mac_addresses(task, self.node) self.assertEqual(sorted([p.address for p in ports]), sorted(node_macs)) def test__validate_info_ssh_connect_failed(self): info = ssh._parse_driver_info(self.node) self.get_conn_patcher.stop() self.get_conn_mock = None with mock.patch.object(utils, 'ssh_connect') \ as ssh_connect_mock: ssh_connect_mock.side_effect = exception.SSHConnectFailed( host='fake') with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: self.assertRaises(exception.InvalidParameterValue, task.resources[0].driver.power.validate, task, self.node) driver_info = ssh._parse_driver_info(self.node) ssh_connect_mock.assert_called_once_with(driver_info) def test_validate_fail_no_port(self): # stop the get_mac_addr mock, it's needed for this test self.get_mac_addr_patcher.stop() self.get_mac_addr_mock = None new_node = self.dbapi.create_node(db_utils.get_test_node(id=321, uuid='aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee', driver='fake_ssh', driver_info=db_utils.get_test_ssh_info())) with task_manager.acquire(self.context, [new_node.uuid], shared=True) as task: self.assertRaises(exception.InvalidParameterValue, task.resources[0].driver.power.validate, task, new_node) def test_reboot_good(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] self.parse_drv_info_mock = self.parse_drv_info_patcher.start() self.parse_drv_info_mock.return_value = info self.get_mac_addr_mock.return_value = info['macs'] self.get_conn_mock.return_value = self.sshclient with mock.patch.object(ssh, '_get_power_status') \ as get_power_stat_mock: with mock.patch.object(ssh, '_power_off') as power_off_mock: with mock.patch.object(ssh, '_power_on') as power_on_mock: get_power_stat_mock.return_value = states.POWER_ON power_off_mock.return_value = None power_on_mock.return_value = states.POWER_ON with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: task.resources[0].driver.power.reboot(task, self.node) self.parse_drv_info_mock.assert_called_once_with(self.node) self.get_mac_addr_mock.assert_called_once_with(mock.ANY, self.node) self.get_conn_mock.assert_called_once_with(self.node) get_power_stat_mock.assert_called_once_with(self.sshclient, info) power_off_mock.assert_called_once_with(self.sshclient, info) power_on_mock.assert_called_once_with(self.sshclient, info) def test_reboot_fail(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] self.parse_drv_info_mock = self.parse_drv_info_patcher.start() self.parse_drv_info_mock.return_value = info self.get_mac_addr_mock.return_value = info['macs'] self.get_conn_mock.return_value = self.sshclient with mock.patch.object(ssh, '_get_power_status') \ as get_power_stat_mock: with mock.patch.object(ssh, '_power_off') as power_off_mock: with mock.patch.object(ssh, '_power_on') as power_on_mock: get_power_stat_mock.return_value = states.POWER_ON power_off_mock.return_value = None power_on_mock.return_value = states.POWER_OFF with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: self.assertRaises( exception.PowerStateFailure, task.resources[0].driver.power.reboot, task, self.node) self.parse_drv_info_mock.assert_called_once_with(self.node) self.get_mac_addr_mock.assert_called_once_with(mock.ANY, self.node) self.get_conn_mock.assert_called_once_with(self.node) get_power_stat_mock.assert_called_once_with(self.sshclient, info) power_off_mock.assert_called_once_with(self.sshclient, info) power_on_mock.assert_called_once_with(self.sshclient, info) def test_set_power_state_bad_state(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] self.parse_drv_info_mock = self.parse_drv_info_patcher.start() self.parse_drv_info_mock.return_value = info self.get_mac_addr_mock.return_value = info['macs'] self.get_conn_mock.return_value = self.sshclient with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: self.assertRaises( exception.InvalidParameterValue, task.resources[0].driver.power.set_power_state, task, self.node, "BAD_PSTATE") self. parse_drv_info_mock.assert_called_once_with(self.node) self.get_mac_addr_mock.assert_called_once_with(mock.ANY, self.node) self.get_conn_mock.assert_called_once_with(self.node) def test_set_power_state_on_good(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] self.parse_drv_info_mock = self.parse_drv_info_patcher.start() self.parse_drv_info_mock.return_value = info self.get_mac_addr_mock.return_value = info['macs'] self.get_conn_mock.return_value = self.sshclient with mock.patch.object(ssh, '_power_on') as power_on_mock: power_on_mock.return_value = states.POWER_ON with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: task.resources[0].driver.power.set_power_state(task, self.node, states.POWER_ON) self.parse_drv_info_mock.assert_called_once_with(self.node) self.get_mac_addr_mock.assert_called_once_with(mock.ANY, self.node) self.get_conn_mock.assert_called_once_with(self.node) power_on_mock.assert_called_once_with(self.sshclient, info) def test_set_power_state_on_fail(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] self.parse_drv_info_mock = self.parse_drv_info_patcher.start() self.parse_drv_info_mock.return_value = info self.get_mac_addr_mock.return_value = info['macs'] self.get_conn_mock.return_value = self.sshclient with mock.patch.object(ssh, '_power_on') as power_on_mock: power_on_mock.return_value = states.POWER_OFF with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: self.assertRaises( exception.PowerStateFailure, task.resources[0].driver.power.set_power_state, task, self.node, states.POWER_ON) self.parse_drv_info_mock.assert_called_once_with(self.node) self.get_mac_addr_mock.assert_called_once_with(mock.ANY, self.node) self.get_conn_mock.assert_called_once_with(self.node) power_on_mock.assert_called_once_with(self.sshclient, info) def test_set_power_state_off_good(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] self.parse_drv_info_mock = self.parse_drv_info_patcher.start() self.parse_drv_info_mock.return_value = info self.get_mac_addr_mock.return_value = info['macs'] self.get_conn_mock.return_value = self.sshclient with mock.patch.object(ssh, '_power_off') as power_off_mock: power_off_mock.return_value = states.POWER_OFF with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: task.resources[0].driver.power.set_power_state(task, self.node, states.POWER_OFF) self.parse_drv_info_mock.assert_called_once_with(self.node) self.get_mac_addr_mock.assert_called_once_with(mock.ANY, self.node) self.get_conn_mock.assert_called_once_with(self.node) power_off_mock.assert_called_once_with(self.sshclient, info) def test_set_power_state_off_fail(self): info = ssh._parse_driver_info(self.node) info['macs'] = ["11:11:11:11:11:11", "52:54:00:cf:2d:31"] self.parse_drv_info_mock = self.parse_drv_info_patcher.start() self.parse_drv_info_mock.return_value = info self.get_mac_addr_mock.return_value = info['macs'] self.get_conn_mock.return_value = self.sshclient with mock.patch.object(ssh, '_power_off') as power_off_mock: power_off_mock.return_value = states.POWER_ON with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: self.assertRaises( exception.PowerStateFailure, task.resources[0].driver.power.set_power_state, task, self.node, states.POWER_OFF) self.parse_drv_info_mock.assert_called_once_with(self.node) self.get_mac_addr_mock.assert_called_once_with(mock.ANY, self.node) self.get_conn_mock.assert_called_once_with(self.node) power_off_mock.assert_called_once_with(self.sshclient, info) ironic-2014.1.rc1/ironic/tests/drivers/test_ipminative.py0000664000175300017540000002650212316614116024574 0ustar jenkinsjenkins00000000000000# coding=utf-8 # Copyright 2013 International Business Machines 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. """ Test class for Native IPMI power driver module. """ import mock from ironic.common import driver_factory from ironic.common import exception from ironic.common import states from ironic.conductor import task_manager from ironic.db import api as db_api from ironic.drivers.modules import ipminative from ironic.openstack.common import context from ironic.tests import base from ironic.tests.conductor import utils as mgr_utils from ironic.tests.db import base as db_base from ironic.tests.db import utils as db_utils from oslo.config import cfg CONF = cfg.CONF INFO_DICT = db_utils.get_test_ipmi_info() class IPMINativePrivateMethodTestCase(base.TestCase): """Test cases for ipminative private methods.""" def setUp(self): super(IPMINativePrivateMethodTestCase, self).setUp() n = db_utils.get_test_node( driver='fake_ipminative', driver_info=INFO_DICT) self.dbapi = db_api.get_instance() self.node = self.dbapi.create_node(n) self.info = ipminative._parse_driver_info(self.node) ipmi_patch = mock.patch('pyghmi.ipmi.command.Command') self.ipmi_mock = ipmi_patch.start() self.addCleanup(ipmi_patch.stop) def test__parse_driver_info(self): # make sure we get back the expected things self.assertIsNotNone(self.info.get('address')) self.assertIsNotNone(self.info.get('username')) self.assertIsNotNone(self.info.get('password')) self.assertIsNotNone(self.info.get('uuid')) # make sure error is raised when info, eg. username, is missing info = dict(INFO_DICT) del info['ipmi_username'] node = db_utils.get_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, ipminative._parse_driver_info, node) def test__power_status_on(self): ipmicmd = self.ipmi_mock.return_value ipmicmd.get_power.return_value = {'powerstate': 'on'} state = ipminative._power_status(self.info) ipmicmd.get_power.assert_called_once_with() self.assertEqual(states.POWER_ON, state) def test__power_status_off(self): ipmicmd = self.ipmi_mock.return_value ipmicmd.get_power.return_value = {'powerstate': 'off'} state = ipminative._power_status(self.info) ipmicmd.get_power.assert_called_once_with() self.assertEqual(states.POWER_OFF, state) def test__power_status_error(self): ipmicmd = self.ipmi_mock.return_value ipmicmd.get_power.return_value = {'powerstate': 'Error'} state = ipminative._power_status(self.info) ipmicmd.get_power.assert_called_once_with() self.assertEqual(states.ERROR, state) def test__power_on(self): ipmicmd = self.ipmi_mock.return_value ipmicmd.set_power.return_value = {'powerstate': 'on'} self.config(retry_timeout=400, group='ipmi') state = ipminative._power_on(self.info) ipmicmd.set_power.assert_called_once_with('on', 400) self.assertEqual(states.POWER_ON, state) def test__power_off(self): ipmicmd = self.ipmi_mock.return_value ipmicmd.set_power.return_value = {'powerstate': 'off'} self.config(retry_timeout=500, group='ipmi') state = ipminative._power_off(self.info) ipmicmd.set_power.assert_called_once_with('off', 500) self.assertEqual(states.POWER_OFF, state) def test__reboot(self): ipmicmd = self.ipmi_mock.return_value ipmicmd.set_power.return_value = {'powerstate': 'on'} self.config(retry_timeout=600, group='ipmi') state = ipminative._reboot(self.info) ipmicmd.set_power.assert_called_once_with('boot', 600) self.assertEqual(states.POWER_ON, state) class IPMINativeDriverTestCase(db_base.DbTestCase): """Test cases for ipminative.NativeIPMIPower class functions. """ def setUp(self): super(IPMINativeDriverTestCase, self).setUp() self.context = context.get_admin_context() mgr_utils.mock_the_extension_manager(driver="fake_ipminative") self.driver = driver_factory.get_driver("fake_ipminative") n = db_utils.get_test_node( driver='fake_ipminative', driver_info=INFO_DICT) self.dbapi = db_api.get_instance() self.node = self.dbapi.create_node(n) self.info = ipminative._parse_driver_info(self.node) def test_get_power_state(self): with mock.patch('pyghmi.ipmi.command.Command') as ipmi_mock: # Getting the mocked command. cmd_mock = ipmi_mock.return_value # Getting the get power mock. get_power_mock = cmd_mock.get_power return_values = [{'powerstate': 'error'}, {'powerstate': 'on'}, {'powerstate': 'off'}] get_power_mock.side_effect = lambda: return_values.pop() pstate = self.driver.power.get_power_state(None, self.node) self.assertEqual(states.POWER_OFF, pstate) pstate = self.driver.power.get_power_state(None, self.node) self.assertEqual(states.POWER_ON, pstate) pstate = self.driver.power.get_power_state(None, self.node) self.assertEqual(states.ERROR, pstate) self.assertEqual(3, get_power_mock.call_count, "pyghmi.ipmi.command.Command.get_power was not" " called 3 times.") def test_set_power_on_ok(self): with mock.patch.object(ipminative, '_power_on') as power_on_mock: power_on_mock.return_value = states.POWER_ON with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.driver.power.set_power_state( task, self.node, states.POWER_ON) power_on_mock.assert_called_once_with(self.info) def test_set_power_off_ok(self): with mock.patch.object(ipminative, '_power_off') as power_off_mock: power_off_mock.return_value = states.POWER_OFF with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.driver.power.set_power_state( task, self.node, states.POWER_OFF) power_off_mock.assert_called_once_with(self.info) def test_set_power_on_fail(self): with mock.patch('pyghmi.ipmi.command.Command') as ipmi_mock: ipmicmd = ipmi_mock.return_value ipmicmd.set_power.return_value = {'powerstate': 'error'} self.config(retry_timeout=500, group='ipmi') with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.assertRaises(exception.PowerStateFailure, self.driver.power.set_power_state, task, self.node, states.POWER_ON) ipmicmd.set_power.assert_called_once_with('on', 500) def test_set_boot_device_ok(self): with mock.patch('pyghmi.ipmi.command.Command') as ipmi_mock: ipmicmd = ipmi_mock.return_value ipmicmd.set_bootdev.return_value = None with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.driver.vendor._set_boot_device(task, self.node, 'pxe') ipmicmd.set_bootdev.assert_called_once_with('pxe') def test_set_boot_device_bad_device(self): with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.assertRaises(exception.InvalidParameterValue, self.driver.vendor._set_boot_device, task, self.node, 'fake-device') def test_reboot_ok(self): with mock.patch.object(ipminative, '_reboot') as reboot_mock: reboot_mock.return_value = None with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.driver.power.reboot(task, self.node) reboot_mock.assert_called_once_with(self.info) def test_reboot_fail(self): with mock.patch('pyghmi.ipmi.command.Command') as ipmi_mock: ipmicmd = ipmi_mock.return_value ipmicmd.set_power.return_value = {'powerstate': 'error'} self.config(retry_timeout=500, group='ipmi') with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.assertRaises(exception.PowerStateFailure, self.driver.power.reboot, task, self.node) ipmicmd.set_power.assert_called_once_with('boot', 500) def test_vendor_passthru_validate__set_boot_device_good(self): self.driver.vendor.validate(self.node, method='set_boot_device', device='pxe') def test_vendor_passthru_val__set_boot_device_fail_unknown_device(self): self.assertRaises(exception.InvalidParameterValue, self.driver.vendor.validate, self.node, method='set_boot_device', device='non-existent') def test_vendor_passthru_val__set_boot_device_fail_missed_device_arg(self): self.assertRaises(exception.InvalidParameterValue, self.driver.vendor.validate, self.node, method='set_boot_device') def test_vendor_passthru_validate_method_notmatch(self): self.assertRaises(exception.InvalidParameterValue, self.driver.vendor.validate, self.node, method='non-existent-method') def test_vendor_passthru_call__set_boot_device(self): with task_manager.acquire(self.context, [self.node['uuid']], shared=False) as task: with mock.patch.object(ipminative.VendorPassthru, '_set_boot_device') as boot_mock: self.driver.vendor.vendor_passthru(task, self.node, method='set_boot_device', device='pxe') boot_mock.assert_called_once_with(task, self.node, 'pxe', False) ironic-2014.1.rc1/ironic/tests/drivers/test_ipmitool.py0000664000175300017540000004712712316614116024271 0ustar jenkinsjenkins00000000000000# coding=utf-8 # Copyright 2012 Hewlett-Packard Development Company, L.P. # Copyright (c) 2012 NTT DOCOMO, INC. # 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. """Test class for IPMITool driver module.""" import os import stat import tempfile import mock from oslo.config import cfg from ironic.common import driver_factory from ironic.common import exception from ironic.common import states from ironic.common import utils from ironic.conductor import task_manager from ironic.db import api as db_api from ironic.drivers.modules import ipmitool as ipmi from ironic.openstack.common import context from ironic.openstack.common import processutils from ironic.tests import base from ironic.tests.conductor import utils as mgr_utils from ironic.tests.db import base as db_base from ironic.tests.db import utils as db_utils CONF = cfg.CONF INFO_DICT = db_utils.get_test_ipmi_info() class IPMIToolPrivateMethodTestCase(base.TestCase): def setUp(self): super(IPMIToolPrivateMethodTestCase, self).setUp() self.node = db_utils.get_test_node( driver='fake_ipmitool', driver_info=INFO_DICT) self.info = ipmi._parse_driver_info(self.node) def test__make_password_file(self): with ipmi._make_password_file(self.info.get('password')) as pw_file: del_chk_pw_file = pw_file self.assertTrue(os.path.isfile(pw_file)) self.assertEqual(0o600, os.stat(pw_file)[stat.ST_MODE] & 0o777) with open(pw_file, "r") as f: password = f.read() self.assertEqual(self.info.get('password'), password) self.assertFalse(os.path.isfile(del_chk_pw_file)) def test__parse_driver_info(self): # make sure we get back the expected things self.assertIsNotNone(self.info.get('address')) self.assertIsNotNone(self.info.get('username')) self.assertIsNotNone(self.info.get('password')) self.assertIsNotNone(self.info.get('uuid')) info = dict(INFO_DICT) # test the default value for 'priv_level' node = db_utils.get_test_node(driver_info=info) ret = ipmi._parse_driver_info(node) self.assertEqual('ADMINISTRATOR', ret['priv_level']) # ipmi_username / ipmi_password are not mandatory del info['ipmi_username'] node = db_utils.get_test_node(driver_info=info) ipmi._parse_driver_info(node) del info['ipmi_password'] node = db_utils.get_test_node(driver_info=info) ipmi._parse_driver_info(node) # make sure error is raised when ipmi_address is missing del info['ipmi_address'] node = db_utils.get_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, ipmi._parse_driver_info, node) # test the invalid priv_level value self.info['priv_level'] = 'ABCD' node = db_utils.get_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, ipmi._parse_driver_info, node) def test__exec_ipmitool(self): pw_file_handle = tempfile.NamedTemporaryFile() pw_file = pw_file_handle.name file_handle = open(pw_file, "w") args = [ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle, 'A', 'B', 'C', ] with mock.patch.object(ipmi, '_make_password_file', autospec=True) as mock_pwf: mock_pwf.return_value = file_handle with mock.patch.object(utils, 'execute', autospec=True) as mock_exec: mock_exec.return_value = (None, None) ipmi._exec_ipmitool(self.info, 'A B C') mock_pwf.assert_called_once_with(self.info['password']) mock_exec.assert_called_once_with(*args, attempts=3) def test__exec_ipmitool_without_password(self): self.info['password'] = None pw_file_handle = tempfile.NamedTemporaryFile() pw_file = pw_file_handle.name file_handle = open(pw_file, "w") args = [ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle, 'A', 'B', 'C', ] with mock.patch.object(ipmi, '_make_password_file', autospec=True) as mock_pwf: mock_pwf.return_value = file_handle with mock.patch.object(utils, 'execute', autospec=True) as mock_exec: mock_exec.return_value = (None, None) ipmi._exec_ipmitool(self.info, 'A B C') self.assertTrue(mock_pwf.called) mock_exec.assert_called_once_with(*args, attempts=3) def test__exec_ipmitool_without_username(self): self.info['username'] = None pw_file_handle = tempfile.NamedTemporaryFile() pw_file = pw_file_handle.name file_handle = open(pw_file, "w") args = [ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-f', file_handle, 'A', 'B', 'C', ] with mock.patch.object(ipmi, '_make_password_file', autospec=True) as mock_pwf: mock_pwf.return_value = file_handle with mock.patch.object(utils, 'execute', autospec=True) as mock_exec: mock_exec.return_value = (None, None) ipmi._exec_ipmitool(self.info, 'A B C') self.assertTrue(mock_pwf.called) mock_exec.assert_called_once_with(*args, attempts=3) def test__exec_ipmitool_exception(self): pw_file_handle = tempfile.NamedTemporaryFile() pw_file = pw_file_handle.name file_handle = open(pw_file, "w") args = [ 'ipmitool', '-I', 'lanplus', '-H', self.info['address'], '-L', self.info['priv_level'], '-U', self.info['username'], '-f', file_handle, 'A', 'B', 'C', ] with mock.patch.object(ipmi, '_make_password_file', autospec=True) as mock_pwf: mock_pwf.return_value = file_handle with mock.patch.object(utils, 'execute', autospec=True) as mock_exec: mock_exec.side_effect = processutils.ProcessExecutionError("x") self.assertRaises(processutils.ProcessExecutionError, ipmi._exec_ipmitool, self.info, 'A B C') mock_pwf.assert_called_once_with(self.info['password']) mock_exec.assert_called_once_with(*args, attempts=3) def test__power_status_on(self): with mock.patch.object(ipmi, '_exec_ipmitool', autospec=True) as mock_exec: mock_exec.return_value = ["Chassis Power is on\n", None] state = ipmi._power_status(self.info) mock_exec.assert_called_once_with(self.info, "power status") self.assertEqual(states.POWER_ON, state) def test__power_status_off(self): with mock.patch.object(ipmi, '_exec_ipmitool', autospec=True) as mock_exec: mock_exec.return_value = ["Chassis Power is off\n", None] state = ipmi._power_status(self.info) mock_exec.assert_called_once_with(self.info, "power status") self.assertEqual(states.POWER_OFF, state) def test__power_status_error(self): with mock.patch.object(ipmi, '_exec_ipmitool', autospec=True) as mock_exec: mock_exec.return_value = ["Chassis Power is badstate\n", None] state = ipmi._power_status(self.info) mock_exec.assert_called_once_with(self.info, "power status") self.assertEqual(states.ERROR, state) def test__power_status_exception(self): with mock.patch.object(ipmi, '_exec_ipmitool', side_effect=processutils.ProcessExecutionError("error"), autospec=True) as mock_exec: self.assertRaises(exception.IPMIFailure, ipmi._power_status, self.info) mock_exec.assert_called_once_with(self.info, "power status") @mock.patch('eventlet.greenthread.sleep') def test__power_on_max_retries(self, sleep_mock): self.config(retry_timeout=2, group='ipmi') def side_effect(driver_info, command): resp_dict = {"power status": ["Chassis Power is off\n", None], "power on": [None, None]} return resp_dict.get(command, ["Bad\n", None]) with mock.patch.object(ipmi, '_exec_ipmitool', autospec=True) as mock_exec: mock_exec.side_effect = side_effect expected = [mock.call(self.info, "power on"), mock.call(self.info, "power status"), mock.call(self.info, "power status")] state = ipmi._power_on(self.info) self.assertEqual(mock_exec.call_args_list, expected) self.assertEqual(states.ERROR, state) class IPMIToolDriverTestCase(db_base.DbTestCase): def setUp(self): super(IPMIToolDriverTestCase, self).setUp() self.context = context.get_admin_context() self.dbapi = db_api.get_instance() mgr_utils.mock_the_extension_manager(driver="fake_ipmitool") self.driver = driver_factory.get_driver("fake_ipmitool") self.node = db_utils.get_test_node( driver='fake_ipmitool', driver_info=INFO_DICT) self.info = ipmi._parse_driver_info(self.node) self.dbapi.create_node(self.node) def test_get_power_state(self): returns = [["Chassis Power is off\n", None], ["Chassis Power is on\n", None], ["\n", None]] expected = [mock.call(self.info, "power status"), mock.call(self.info, "power status"), mock.call(self.info, "power status")] with mock.patch.object(ipmi, '_exec_ipmitool', side_effect=returns, autospec=True) as mock_exec: pstate = self.driver.power.get_power_state(None, self.node) self.assertEqual(states.POWER_OFF, pstate) pstate = self.driver.power.get_power_state(None, self.node) self.assertEqual(states.POWER_ON, pstate) pstate = self.driver.power.get_power_state(None, self.node) self.assertEqual(states.ERROR, pstate) self.assertEqual(mock_exec.call_args_list, expected) def test_get_power_state_exception(self): with mock.patch.object(ipmi, '_exec_ipmitool', side_effect=processutils.ProcessExecutionError("error"), autospec=True) as mock_exec: self.assertRaises(exception.IPMIFailure, self.driver.power.get_power_state, None, self.node) mock_exec.assert_called_once_with(self.info, "power status") def test_set_power_on_ok(self): self.config(retry_timeout=0, group='ipmi') with mock.patch.object(ipmi, '_power_on', autospec=True) as mock_on: mock_on.return_value = states.POWER_ON with mock.patch.object(ipmi, '_power_off', autospec=True) as mock_off: with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.driver.power.set_power_state( task, self.node, states.POWER_ON) mock_on.assert_called_once_with(self.info) self.assertFalse(mock_off.called) def test_set_power_off_ok(self): self.config(retry_timeout=0, group='ipmi') with mock.patch.object(ipmi, '_power_on', autospec=True) as mock_on: with mock.patch.object(ipmi, '_power_off', autospec=True) as mock_off: mock_off.return_value = states.POWER_OFF with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.driver.power.set_power_state( task, self.node, states.POWER_OFF) mock_off.assert_called_once_with(self.info) self.assertFalse(mock_on.called) def test_set_power_on_fail(self): self.config(retry_timeout=0, group='ipmi') with mock.patch.object(ipmi, '_power_on', autospec=True) as mock_on: mock_on.return_value = states.ERROR with mock.patch.object(ipmi, '_power_off', autospec=True) as mock_off: with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.assertRaises(exception.PowerStateFailure, self.driver.power.set_power_state, task, self.node, states.POWER_ON) mock_on.assert_called_once_with(self.info) self.assertFalse(mock_off.called) def test_set_power_invalid_state(self): with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.assertRaises(exception.InvalidParameterValue, self.driver.power.set_power_state, task, self.node, "fake state") def test_set_boot_device_ok(self): with mock.patch.object(ipmi, '_exec_ipmitool', autospec=True) as mock_exec: mock_exec.return_value = [None, None] with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.driver.vendor._set_boot_device(task, self.node, 'pxe') mock_exec.assert_called_once_with(self.info, "chassis bootdev pxe") def test_set_boot_device_bad_device(self): with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.assertRaises(exception.InvalidParameterValue, self.driver.vendor._set_boot_device, task, self.node, 'fake-device') def test_reboot_ok(self): manager = mock.MagicMock() #NOTE(rloo): if autospec is True, then manager.mock_calls is empty with mock.patch.object(ipmi, '_power_off', autospec=False) as mock_off: with mock.patch.object(ipmi, '_power_on', autospec=False) as mock_on: mock_on.return_value = states.POWER_ON manager.attach_mock(mock_off, 'power_off') manager.attach_mock(mock_on, 'power_on') expected = [mock.call.power_off(self.info), mock.call.power_on(self.info)] with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.driver.power.reboot(task, self.node) self.assertEqual(manager.mock_calls, expected) def test_reboot_fail(self): manager = mock.MagicMock() #NOTE(rloo): if autospec is True, then manager.mock_calls is empty with mock.patch.object(ipmi, '_power_off', autospec=False) as mock_off: with mock.patch.object(ipmi, '_power_on', autospec=False) as mock_on: mock_on.return_value = states.ERROR manager.attach_mock(mock_off, 'power_off') manager.attach_mock(mock_on, 'power_on') expected = [mock.call.power_off(self.info), mock.call.power_on(self.info)] with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.assertRaises(exception.PowerStateFailure, self.driver.power.reboot, task, self.node) self.assertEqual(manager.mock_calls, expected) def test_vendor_passthru_validate__set_boot_device_good(self): self.driver.vendor.validate(self.node, method='set_boot_device', device='pxe') def test_vendor_passthru_validate__set_boot_device_fail(self): self.assertRaises(exception.InvalidParameterValue, self.driver.vendor.validate, self.node, method='set_boot_device', device='fake') def test_vendor_passthru_validate__set_boot_device_fail_no_device(self): self.assertRaises(exception.InvalidParameterValue, self.driver.vendor.validate, self.node, method='set_boot_device') def test_vendor_passthru_validate_method_notmatch(self): self.assertRaises(exception.InvalidParameterValue, self.driver.vendor.validate, self.node, method='fake_method') def test_vendor_passthru_call_set_boot_device(self): with task_manager.acquire(self.context, [self.node['uuid']], shared=False) as task: with mock.patch.object(ipmi.VendorPassthru, '_set_boot_device') as boot_mock: self.driver.vendor.vendor_passthru(task, self.node, method='set_boot_device', device='pxe') boot_mock.assert_called_once_with(task, self.node, 'pxe', False) @mock.patch.object(ipmi, '_exec_ipmitool') def test_validate_ok(self, exec_mock): exec_mock.return_value = ('System GUID: fake', '') with task_manager.acquire(self.context, [self.node['uuid']]) as task: task.driver.power.validate(task, task.node) exec_mock.assert_called_once() @mock.patch.object(ipmi, '_exec_ipmitool') def test_validate_fail(self, exec_mock): exec_mock.side_effect = Exception with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.assertRaises(exception.InvalidParameterValue, task.driver.power.validate, task, task.node) exec_mock.assert_called_once() ironic-2014.1.rc1/ironic/tests/drivers/test_pxe.py0000664000175300017540000013373512316614116023232 0ustar jenkinsjenkins00000000000000# coding=utf-8 # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """Test class for PXE driver.""" import fixtures import mock import os import tempfile import threading import time from oslo.config import cfg from ironic.common import exception from ironic.common.glance_service import base_image_service from ironic.common.glance_service import service_utils from ironic.common import images from ironic.common import keystone from ironic.common import neutron from ironic.common import states from ironic.common import utils from ironic.conductor import task_manager from ironic.conductor import utils as manager_utils from ironic.db import api as dbapi from ironic.drivers.modules import pxe from ironic.openstack.common import context from ironic.openstack.common import fileutils from ironic.openstack.common import jsonutils as json from ironic.tests import base from ironic.tests.conductor import utils as mgr_utils from ironic.tests.db import base as db_base from ironic.tests.db import utils as db_utils CONF = cfg.CONF INFO_DICT = db_utils.get_test_pxe_info() class PXEValidateParametersTestCase(base.TestCase): def setUp(self): super(PXEValidateParametersTestCase, self).setUp() self.dbapi = dbapi.get_instance() def _create_test_node(self, **kwargs): n = db_utils.get_test_node(**kwargs) return self.dbapi.create_node(n) def test__parse_driver_info_good(self): # make sure we get back the expected things node = self._create_test_node( driver='fake_pxe', driver_info=INFO_DICT) info = pxe._parse_driver_info(node) self.assertIsNotNone(info.get('image_source')) self.assertIsNotNone(info.get('deploy_kernel')) self.assertIsNotNone(info.get('deploy_ramdisk')) self.assertIsNotNone(info.get('root_gb')) self.assertEqual(0, info.get('ephemeral_gb')) def test__parse_driver_info_missing_instance_source(self): # make sure error is raised when info is missing info = dict(INFO_DICT) del info['pxe_image_source'] node = self._create_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, pxe._parse_driver_info, node) def test__parse_driver_info_missing_deploy_kernel(self): # make sure error is raised when info is missing info = dict(INFO_DICT) del info['pxe_deploy_kernel'] node = self._create_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, pxe._parse_driver_info, node) def test__parse_driver_info_missing_deploy_ramdisk(self): # make sure error is raised when info is missing info = dict(INFO_DICT) del info['pxe_deploy_ramdisk'] node = self._create_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, pxe._parse_driver_info, node) def test__parse_driver_info_missing_root_gb(self): # make sure error is raised when info is missing info = dict(INFO_DICT) del info['pxe_root_gb'] node = self._create_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, pxe._parse_driver_info, node) def test__parse_driver_info_invalid_root_gb(self): info = dict(INFO_DICT) info['pxe_root_gb'] = 'foobar' node = self._create_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, pxe._parse_driver_info, node) def test__parse_driver_info_valid_ephemeral_gb(self): ephemeral_gb = 10 info = dict(INFO_DICT) info['pxe_ephemeral_gb'] = ephemeral_gb info['pxe_ephemeral_format'] = 'exttest' node = self._create_test_node(driver_info=info) data = pxe._parse_driver_info(node) self.assertEqual(ephemeral_gb, data.get('ephemeral_gb')) def test__parse_driver_info_invalid_ephemeral_gb(self): info = dict(INFO_DICT) info['pxe_ephemeral_gb'] = 'foobar' info['pxe_ephemeral_format'] = 'exttest' node = self._create_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, pxe._parse_driver_info, node) def test__parse_driver_info_valid_ephemeral_missing_format(self): ephemeral_gb = 10 info = dict(INFO_DICT) info['pxe_ephemeral_gb'] = ephemeral_gb info['pxe_ephemeral_format'] = None node = self._create_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, pxe._parse_driver_info, node) def test__parse_driver_info_valid_preserve_ephemeral_true(self): info = dict(INFO_DICT) for _id, opt in enumerate(['true', 'TRUE', 'True', 't', 'on', 'yes', 'y', '1']): info['pxe_preserve_ephemeral'] = opt node = self._create_test_node(id=_id, uuid=utils.generate_uuid(), driver_info=info) data = pxe._parse_driver_info(node) self.assertTrue(data.get('preserve_ephemeral')) def test__parse_driver_info_valid_preserve_ephemeral_false(self): info = dict(INFO_DICT) for _id, opt in enumerate(['false', 'FALSE', 'False', 'f', 'off', 'no', 'n', '0']): info['pxe_preserve_ephemeral'] = opt node = self._create_test_node(id=_id, uuid=utils.generate_uuid(), driver_info=info) data = pxe._parse_driver_info(node) self.assertFalse(data.get('preserve_ephemeral')) def test__parse_driver_info_invalid_preserve_ephemeral(self): info = dict(INFO_DICT) info['pxe_preserve_ephemeral'] = 'foobar' node = self._create_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, pxe._parse_driver_info, node) def test__parse_driver_info_swap_defaults_to_1mb(self): info = dict(INFO_DICT) info['pxe_swap_mb'] = 0 node = self._create_test_node(driver_info=info) data = pxe._parse_driver_info(node) self.assertEqual(1, data.get('swap_mb')) def test__get_pxe_mac_path(self): mac = '00:11:22:33:44:55:66' self.assertEqual('/tftpboot/pxelinux.cfg/01-00-11-22-33-44-55-66', pxe._get_pxe_mac_path(mac)) def test__link_master_image(self): temp_dir = tempfile.mkdtemp() orig_path = os.path.join(temp_dir, 'orig_path') dest_path = os.path.join(temp_dir, 'dest_path') open(orig_path, 'w').close() pxe._link_master_image(orig_path, dest_path) self.assertIsNotNone(os.path.exists(dest_path)) self.assertEqual(2, os.stat(dest_path).st_nlink) def test__unlink_master_image(self): temp_dir = tempfile.mkdtemp() orig_path = os.path.join(temp_dir, 'orig_path') open(orig_path, 'w').close() pxe._unlink_master_image(orig_path) self.assertFalse(os.path.exists(orig_path)) def test__create_master_image(self): temp_dir = tempfile.mkdtemp() master_path = os.path.join(temp_dir, 'master_path') instance_path = os.path.join(temp_dir, 'instance_path') tmp_path = os.path.join(temp_dir, 'tmp_path') open(tmp_path, 'w').close() pxe._create_master_image(tmp_path, master_path, instance_path) self.assertTrue(os.path.exists(master_path)) self.assertTrue(os.path.exists(instance_path)) self.assertFalse(os.path.exists(tmp_path)) self.assertEqual(2, os.stat(master_path).st_nlink) def test__download_in_progress(self): temp_dir = tempfile.mkdtemp() lock_file = os.path.join(temp_dir, 'lock_file') self.assertFalse(pxe._download_in_progress(lock_file)) self.assertTrue(os.path.exists(lock_file)) def test__download_in_progress_wait(self): try: self.config(auth_strategy='keystone') except Exception: opts = [ cfg.StrOpt('auth_strategy', default='keystone'), ] CONF.register_opts(opts) ctx = context.RequestContext(auth_token=True) uuid = 'node_uuid' temp_dir = tempfile.mkdtemp() master_path = os.path.join(temp_dir, 'master_path') instance_path = os.path.join(temp_dir, 'instance_path') os.mkdir(master_path) os.mkdir(instance_path) lock_file = os.path.join(master_path, 'node_uuid.lock') open(lock_file, 'w').close() class handler_deploying(threading.Thread): def __init__(self, lock_file): threading.Thread.__init__(self) self.lock_file = lock_file def run(self): time.sleep(0.2) open(os.path.join(master_path, 'node_uuid'), 'w').close() pxe._remove_download_in_progress_lock(self.lock_file) handler = handler_deploying(lock_file) handler.start() pxe._get_image(ctx, os.path.join(instance_path, 'node_uuid'), uuid, master_path) self.assertFalse(os.path.exists(lock_file)) self.assertTrue(os.path.exists(os.path.join(instance_path, 'node_uuid'))) self.assertEqual(2, os.stat(os.path.join(master_path, 'node_uuid')). st_nlink) class PXEPrivateMethodsTestCase(db_base.DbTestCase): def setUp(self): super(PXEPrivateMethodsTestCase, self).setUp() n = { 'driver': 'fake_pxe', 'driver_info': INFO_DICT } mgr_utils.mock_the_extension_manager(driver="fake_pxe") self.dbapi = dbapi.get_instance() self.node = self._create_test_node(**n) self.context = context.get_admin_context() def _create_test_node(self, **kwargs): n = db_utils.get_test_node(**kwargs) return self.dbapi.create_node(n) def _create_test_port(self, **kwargs): p = db_utils.get_test_port(**kwargs) return self.dbapi.create_port(p) def test__get_tftp_image_info(self): properties = {'properties': {u'kernel_id': u'instance_kernel_uuid', u'ramdisk_id': u'instance_ramdisk_uuid'}} expected_info = {'ramdisk': ['instance_ramdisk_uuid', os.path.join(CONF.pxe.tftp_root, self.node.uuid, 'ramdisk')], 'kernel': ['instance_kernel_uuid', os.path.join(CONF.pxe.tftp_root, self.node.uuid, 'kernel')], 'deploy_ramdisk': ['deploy_ramdisk_uuid', os.path.join(CONF.pxe.tftp_root, self.node.uuid, 'deploy_ramdisk')], 'deploy_kernel': ['deploy_kernel_uuid', os.path.join(CONF.pxe.tftp_root, self.node.uuid, 'deploy_kernel')]} with mock.patch.object(base_image_service.BaseImageService, '_show') \ as show_mock: show_mock.return_value = properties image_info = pxe._get_tftp_image_info(self.node, self.context) show_mock.assert_called_once_with('glance://image_uuid', method='get') self.assertEqual(expected_info, image_info) def test__build_pxe_config(self): self.config(pxe_append_params='test_param', group='pxe') # NOTE: right '/' should be removed from url string self.config(api_url='http://192.168.122.184:6385/', group='conductor') template = 'ironic/tests/drivers/pxe_config.template' pxe_config_template = open(template, 'r').read() fake_key = '0123456789ABCDEFGHIJKLMNOPQRSTUV' with mock.patch.object(utils, 'random_alnum') as random_alnum_mock: random_alnum_mock.return_value = fake_key image_info = {'deploy_kernel': ['deploy_kernel', os.path.join(CONF.pxe.tftp_root, self.node.uuid, 'deploy_kernel')], 'deploy_ramdisk': ['deploy_ramdisk', os.path.join(CONF.pxe.tftp_root, self.node.uuid, 'deploy_ramdisk')], 'kernel': ['kernel_id', os.path.join(CONF.pxe.tftp_root, self.node.uuid, 'kernel')], 'ramdisk': ['ramdisk_id', os.path.join(CONF.pxe.tftp_root, self.node.uuid, 'ramdisk')] } pxe_config = pxe._build_pxe_config(self.node, image_info, self.context) random_alnum_mock.assert_called_once_with(32) self.assertEqual(pxe_config_template, pxe_config) # test that deploy_key saved db_node = self.dbapi.get_node(self.node['uuid']) db_key = db_node['driver_info'].get('pxe_deploy_key') self.assertEqual(fake_key, db_key) def test__get_nodes_mac_addresses(self): self._create_test_port(node_id=self.node.id, address='aa:bb:cc', uuid=utils.generate_uuid(), id=6) self._create_test_port(node_id=self.node.id, address='dd:ee:ff', uuid=utils.generate_uuid(), id=7) expected = ['aa:bb:cc', 'dd:ee:ff'] with task_manager.acquire(self.context, self.node.uuid) as task: node_macs = pxe._get_node_mac_addresses(task, self.node) self.assertEqual(expected, node_macs) def test__get_node_vif_ids_no_ports(self): expected = {} with task_manager.acquire(self.context, self.node.uuid) as task: result = pxe._get_node_vif_ids(task) self.assertEqual(expected, result) def test__get_node_vif_ids_one_port(self): port1 = self._create_test_port(node_id=self.node.id, id=6, address='aa:bb:cc', uuid=utils.generate_uuid(), extra={'vif_port_id': 'test-vif-A'}) expected = {port1.uuid: 'test-vif-A'} with task_manager.acquire(self.context, self.node.uuid) as task: result = pxe._get_node_vif_ids(task) self.assertEqual(expected, result) def test__get_node_vif_ids_two_ports(self): port1 = self._create_test_port(node_id=self.node.id, id=6, address='aa:bb:cc', uuid=utils.generate_uuid(), extra={'vif_port_id': 'test-vif-A'}) port2 = self._create_test_port(node_id=self.node.id, id=7, address='dd:ee:ff', uuid=utils.generate_uuid(), extra={'vif_port_id': 'test-vif-B'}) expected = {port1.uuid: 'test-vif-A', port2.uuid: 'test-vif-B'} with task_manager.acquire(self.context, self.node.uuid) as task: result = pxe._get_node_vif_ids(task) self.assertEqual(expected, result) def test__update_neutron(self): opts = pxe._dhcp_options_for_instance() with mock.patch.object(pxe, '_get_node_vif_ids') as mock_gnvi: mock_gnvi.return_value = {'port-uuid': 'vif-uuid'} with mock.patch.object(neutron.NeutronAPI, 'update_port_dhcp_opts') as mock_updo: with task_manager.acquire(self.context, self.node.uuid) as task: pxe._update_neutron(task, self.node) mock_updo.assertCalleOnceWith('vif-uuid', opts) def test__update_neutron_no_vif_data(self): with mock.patch.object(pxe, '_get_node_vif_ids') as mock_gnvi: mock_gnvi.return_value = {} with mock.patch.object(neutron.NeutronAPI, '__init__') as mock_init: with task_manager.acquire(self.context, self.node.uuid) as task: pxe._update_neutron(task, self.node) mock_init.assert_not_called() def test__update_neutron_some_failures(self): # confirm update is called twice, one fails, but no exception raised with mock.patch.object(pxe, '_get_node_vif_ids') as mock_gnvi: mock_gnvi.return_value = {'p1': 'v1', 'p2': 'v2'} with mock.patch.object(neutron.NeutronAPI, 'update_port_dhcp_opts') as mock_updo: exc = exception.FailedToUpdateDHCPOptOnPort('fake exception') mock_updo.side_effect = [None, exc] with task_manager.acquire(self.context, self.node.uuid) as task: pxe._update_neutron(task, self.node) self.assertEqual(2, mock_updo.call_count) def test__update_neutron_fails(self): # confirm update is called twice, both fail, and exception is raised with mock.patch.object(pxe, '_get_node_vif_ids') as mock_gnvi: mock_gnvi.return_value = {'p1': 'v1', 'p2': 'v2'} with mock.patch.object(neutron.NeutronAPI, 'update_port_dhcp_opts') as mock_updo: exc = exception.FailedToUpdateDHCPOptOnPort('fake exception') mock_updo.side_effect = [exc, exc] with task_manager.acquire(self.context, self.node.uuid) as task: self.assertRaises(exception.FailedToUpdateDHCPOptOnPort, pxe._update_neutron, task, self.node) self.assertEqual(2, mock_updo.call_count) def test__dhcp_options_for_instance(self): self.config(pxe_bootfile_name='test_pxe_bootfile', group='pxe') self.config(tftp_server='192.0.2.1', group='pxe') expected_info = [{'opt_name': 'bootfile-name', 'opt_value': 'test_pxe_bootfile'}, {'opt_name': 'server-ip-address', 'opt_value': '192.0.2.1'}, {'opt_name': 'tftp-server', 'opt_value': '192.0.2.1'} ] self.assertEqual(expected_info, pxe._dhcp_options_for_instance()) def test__get_pxe_config_file_path(self): self.assertEqual(os.path.join(CONF.pxe.tftp_root, self.node.uuid, 'config'), pxe._get_pxe_config_file_path(self.node.uuid)) def test__get_image_dir_path(self): self.assertEqual(os.path.join(CONF.pxe.images_path, self.node.uuid), pxe._get_image_dir_path(self.node.uuid)) def test__get_image_file_path(self): self.assertEqual(os.path.join(CONF.pxe.images_path, self.node.uuid, 'disk'), pxe._get_image_file_path(self.node.uuid)) def test_get_token_file_path(self): node_uuid = self.node['uuid'] self.assertEqual('/tftpboot/token-' + node_uuid, pxe._get_token_file_path(node_uuid)) def test__cache_tftp_images_master_path(self): temp_dir = tempfile.mkdtemp() self.config(tftp_root=temp_dir, group='pxe') self.config(tftp_master_path=os.path.join(temp_dir, 'tftp_master_path'), group='pxe') image_info = {'deploy_kernel': ['deploy_kernel', os.path.join(temp_dir, self.node.uuid, 'deploy_kernel')]} fileutils.ensure_tree(CONF.pxe.tftp_master_path) fd, tmp_master_image = tempfile.mkstemp(dir=CONF.pxe.tftp_master_path) with mock.patch.object(images, 'fetch_to_raw') as fetch_to_raw_mock: with mock.patch.object(tempfile, 'mkstemp') as mkstemp_mock: fetch_to_raw_mock.return_value = None mkstemp_mock.return_value = (fd, tmp_master_image) pxe._cache_tftp_images(None, self.node, image_info) fetch_to_raw_mock.assert_called_once_with(None, 'deploy_kernel', tmp_master_image, None) mkstemp_mock.assert_called_once_with( dir=CONF.pxe.tftp_master_path) def test__cache_tftp_images_no_master_path(self): temp_dir = tempfile.mkdtemp() self.config(tftp_root=temp_dir, group='pxe') self.config(tftp_master_path=None, group='pxe') image_info = {'deploy_kernel': ['deploy_kernel', os.path.join(temp_dir, self.node.uuid, 'deploy_kernel')]} with mock.patch.object(images, 'fetch_to_raw') as fetch_to_raw_mock: fetch_to_raw_mock.return_value = None pxe._cache_tftp_images(None, self.node, image_info) fetch_to_raw_mock.assert_called_once_with(None, 'deploy_kernel', os.path.join(temp_dir, self.node.uuid, 'deploy_kernel'), None) def test__cache_instance_images_no_master_path(self): temp_dir = tempfile.mkdtemp() self.config(images_path=temp_dir, group='pxe') self.config(instance_master_path=None, group='pxe') with mock.patch.object(images, 'fetch_to_raw') as fetch_to_raw_mock: fetch_to_raw_mock.return_value = None (uuid, image_path) = pxe._cache_instance_image(None, self.node) fetch_to_raw_mock.assert_called_once_with(None, 'glance://image_uuid', os.path.join(temp_dir, self.node.uuid, 'disk'), None) self.assertEqual('glance://image_uuid', uuid) self.assertEqual(os.path.join(temp_dir, self.node.uuid, 'disk'), image_path) def test__cache_instance_images_master_path(self): temp_dir = tempfile.mkdtemp() self.config(images_path=temp_dir, group='pxe') self.config(instance_master_path=os.path.join(temp_dir, 'instance_master_path'), group='pxe') fileutils.ensure_tree(CONF.pxe.instance_master_path) fd, tmp_master_image = tempfile.mkstemp( dir=CONF.pxe.instance_master_path) with mock.patch.object(images, 'fetch_to_raw') as fetch_to_raw_mock: with mock.patch.object(tempfile, 'mkstemp') as mkstemp_mock: with mock.patch.object(service_utils, 'parse_image_ref') \ as parse_image_ref_mock: mkstemp_mock.return_value = (fd, tmp_master_image) fetch_to_raw_mock.return_value = None parse_image_ref_mock.return_value = ('image_uuid', None, None, None) (uuid, image_path) = pxe._cache_instance_image(None, self.node) mkstemp_mock.assert_called_once_with( dir=CONF.pxe.instance_master_path) fetch_to_raw_mock.assert_called_once_with(None, 'glance://image_uuid', tmp_master_image, None) parse_image_ref_mock.assert_called_once_with( 'glance://image_uuid') self.assertEqual('glance://image_uuid', uuid) self.assertEqual(os.path.join(temp_dir, self.node.uuid, 'disk'), image_path) def test__get_image_download_in_progress(self): def _create_instance_path(*args): open(master_path, 'w').close() return True temp_dir = tempfile.mkdtemp() instance_path = os.path.join(temp_dir, 'instance_path') fileutils.ensure_tree(temp_dir) master_path = os.path.join(temp_dir, self.node.uuid) lock_file = os.path.join(temp_dir, self.node.uuid + '.lock') with mock.patch.object(pxe, '_download_in_progress') \ as download_in_progress_mock: download_in_progress_mock.side_effect = _create_instance_path pxe._get_image(None, instance_path, self.node.uuid, temp_dir) download_in_progress_mock.assert_called_once_with(lock_file) self.assertTrue(os.path.exists(instance_path)) class PXEDriverTestCase(db_base.DbTestCase): def setUp(self): super(PXEDriverTestCase, self).setUp() self.context = context.get_admin_context() self.context.auth_token = '4562138218392831' self.temp_dir = tempfile.mkdtemp() self.config(tftp_root=self.temp_dir, group='pxe') self.temp_dir = tempfile.mkdtemp() self.config(images_path=self.temp_dir, group='pxe') mgr_utils.mock_the_extension_manager(driver="fake_pxe") driver_info = INFO_DICT driver_info['pxe_deploy_key'] = 'fake-56789' n = db_utils.get_test_node( driver='fake_pxe', driver_info=driver_info) self.dbapi = dbapi.get_instance() self.node = self.dbapi.create_node(n) self.port = self.dbapi.create_port(db_utils.get_test_port( node_id=self.node.id)) self.config(group='conductor', api_url='http://127.0.0.1:1234/') def _create_token_file(self): token_path = pxe._get_token_file_path(self.node['uuid']) open(token_path, 'w').close() return token_path def test_validate_good(self): with task_manager.acquire(self.context, [self.node['uuid']], shared=True) as task: task.resources[0].driver.deploy.validate(task, self.node) def test_validate_fail(self): info = dict(INFO_DICT) del info['pxe_image_source'] self.node['driver_info'] = json.dumps(info) with task_manager.acquire(self.context, [self.node['uuid']], shared=True) as task: self.assertRaises(exception.InvalidParameterValue, task.resources[0].driver.deploy.validate, task, self.node) def test_validate_fail_no_port(self): new_node = self.dbapi.create_node(db_utils.get_test_node(id=321, uuid='aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee', driver='fake_pxe', driver_info=INFO_DICT)) with task_manager.acquire(self.context, [new_node.uuid], shared=True) as task: self.assertRaises(exception.InvalidParameterValue, task.resources[0].driver.deploy.validate, task, new_node) @mock.patch.object(keystone, 'get_service_url') def test_validate_good_api_url_from_config_file(self, mock_ks): # not present in the keystone catalog mock_ks.side_effect = exception.CatalogFailure with task_manager.acquire(self.context, [self.node.uuid], shared=True) as task: task.resources[0].driver.deploy.validate(task, self.node) self.assertFalse(mock_ks.called) @mock.patch.object(keystone, 'get_service_url') def test_validate_good_api_url_from_keystone(self, mock_ks): # present in the keystone catalog mock_ks.return_value = 'http://127.0.0.1:1234' # not present in the config file self.config(group='conductor', api_url=None) with task_manager.acquire(self.context, [self.node.uuid], shared=True) as task: task.resources[0].driver.deploy.validate(task, self.node) mock_ks.assert_called_once_with() @mock.patch.object(keystone, 'get_service_url') def test_validate_fail_no_api_url(self, mock_ks): # not present in the keystone catalog mock_ks.side_effect = exception.CatalogFailure # not present in the config file self.config(group='conductor', api_url=None) with task_manager.acquire(self.context, [self.node.uuid], shared=True) as task: self.assertRaises(exception.InvalidParameterValue, task.resources[0].driver.deploy.validate, task, self.node) mock_ks.assert_called_once_with() def test__get_nodes_mac_addresses(self): ports = [] ports.append(self.port) ports.append( self.dbapi.create_port( db_utils.get_test_port( id=6, address='aa:bb:cc', uuid='bb43dc0b-03f2-4d2e-ae87-c02d7f33cc53', node_id='123'))) ports.append( self.dbapi.create_port( db_utils.get_test_port( id=7, address='dd:ee:ff', uuid='4fc26c0b-03f2-4d2e-ae87-c02d7f33c234', node_id='123'))) with task_manager.acquire(self.context, [self.node['uuid']]) as task: node_macs = pxe._get_node_mac_addresses(task, self.node) self.assertEqual(sorted([p.address for p in ports]), sorted(node_macs)) def test_vendor_passthru_validate_good(self): with task_manager.acquire(self.context, [self.node['uuid']], shared=True) as task: task.resources[0].driver.vendor.validate(task, self.node, method='pass_deploy_info', address='123456', iqn='aaa-bbb', key='fake-56789') def test_vendor_passthru_validate_fail(self): with task_manager.acquire(self.context, [self.node['uuid']], shared=True) as task: self.assertRaises(exception.InvalidParameterValue, task.resources[0].driver.vendor.validate, task, self.node, method='pass_deploy_info', key='fake-56789') def test_vendor_passthru_validate_key_notmatch(self): with task_manager.acquire(self.context, [self.node['uuid']], shared=True) as task: self.assertRaises(exception.InvalidParameterValue, task.resources[0].driver.vendor.validate, task, self.node, method='pass_deploy_info', address='123456', iqn='aaa-bbb', key='fake-12345') def test_prepare(self): with mock.patch.object(pxe, '_create_pxe_config') as create_pxe_config_mock: with mock.patch.object(pxe, '_cache_images') as cache_images_mock: with mock.patch.object(pxe, '_get_tftp_image_info') as get_tftp_image_info_mock: get_tftp_image_info_mock.return_value = None create_pxe_config_mock.return_value = None cache_images_mock.return_value = None with task_manager.acquire(self.context, self.node['uuid'], shared=True) as task: task.driver.deploy.prepare(task, self.node) get_tftp_image_info_mock.assert_called_once_with( self.node, self.context) create_pxe_config_mock.assert_called_once_with(task, self.node, None) cache_images_mock.assert_called_once_with(self.node, None, self.context) def test_deploy(self): with mock.patch.object(pxe, '_update_neutron') as update_neutron_mock: with mock.patch.object(manager_utils, 'node_power_action') as node_power_mock: with mock.patch.object(manager_utils, 'node_set_boot_device') as node_set_boot_mock: with task_manager.acquire(self.context, self.node['uuid'], shared=False) as task: state = task.driver.deploy.deploy(task, self.node) self.assertEqual(state, states.DEPLOYWAIT) update_neutron_mock.assert_called_once_with(task, self.node) node_set_boot_mock.assert_called_once_with(task, self.node, 'pxe', persistent=True) node_power_mock.assert_called_once_with(task, self.node, states.REBOOT) # ensure token file created t_path = pxe._get_token_file_path(self.node['uuid']) token = open(t_path, 'r').read() self.assertEqual(self.context.auth_token, token) def test_tear_down(self): with mock.patch.object(manager_utils, 'node_power_action') as node_power_mock: with task_manager.acquire(self.context, self.node['uuid']) as task: state = task.driver.deploy.tear_down(task, self.node) self.assertEqual(states.DELETED, state) node_power_mock.assert_called_once_with(task, self.node, states.POWER_OFF) @mock.patch.object(manager_utils, 'node_power_action') def test_tear_down_removes_pxe_deploy_key(self, mock_npa): self.assertIn('pxe_deploy_key', self.node.driver_info) with task_manager.acquire(self.context, self.node.uuid) as task: task.driver.deploy.tear_down(task, self.node) self.node.refresh(self.context) self.assertNotIn('pxe_deploy_key', self.node.driver_info) mock_npa.assert_called_once_with(task, self.node, states.POWER_OFF) def test_take_over(self): with mock.patch.object(pxe, '_update_neutron') as update_neutron_mock: with task_manager.acquire( self.context, self.node['uuid'], shared=True) as task: task.driver.deploy.take_over(task, self.node) update_neutron_mock.assert_called_once_with(task, self.node) def test_continue_deploy_good(self): token_path = self._create_token_file() self.node.power_state = states.POWER_ON self.node.provision_state = states.DEPLOYWAIT self.node.save(self.context) def fake_deploy(**kwargs): pass self.useFixture(fixtures.MonkeyPatch( 'ironic.drivers.modules.deploy_utils.deploy', fake_deploy)) with task_manager.acquire(self.context, self.node.uuid) as task: task.resources[0].driver.vendor.vendor_passthru(task, self.node, method='pass_deploy_info', address='123456', iqn='aaa-bbb', key='fake-56789') self.assertEqual(states.ACTIVE, self.node.provision_state) self.assertEqual(states.POWER_ON, self.node.power_state) self.assertIsNone(self.node.last_error) self.assertFalse(os.path.exists(token_path)) def test_continue_deploy_fail(self): token_path = self._create_token_file() self.node.power_state = states.POWER_ON self.node.provision_state = states.DEPLOYWAIT self.node.save(self.context) def fake_deploy(**kwargs): raise exception.InstanceDeployFailure("test deploy error") self.useFixture(fixtures.MonkeyPatch( 'ironic.drivers.modules.deploy_utils.deploy', fake_deploy)) with task_manager.acquire(self.context, [self.node.uuid]) as task: task.resources[0].driver.vendor.vendor_passthru(task, self.node, method='pass_deploy_info', address='123456', iqn='aaa-bbb', key='fake-56789') self.assertEqual(states.DEPLOYFAIL, self.node.provision_state) self.assertEqual(states.POWER_OFF, self.node.power_state) self.assertIsNotNone(self.node.last_error) self.assertFalse(os.path.exists(token_path)) def test_continue_deploy_ramdisk_fails(self): token_path = self._create_token_file() self.node.power_state = states.POWER_ON self.node.provision_state = states.DEPLOYWAIT self.node.save(self.context) def fake_deploy(**kwargs): pass self.useFixture(fixtures.MonkeyPatch( 'ironic.drivers.modules.deploy_utils.deploy', fake_deploy)) with task_manager.acquire(self.context, [self.node.uuid]) as task: task.resources[0].driver.vendor.vendor_passthru(task, self.node, method='pass_deploy_info', address='123456', iqn='aaa-bbb', key='fake-56789', error='test ramdisk error') self.assertEqual(states.DEPLOYFAIL, self.node.provision_state) self.assertEqual(states.POWER_OFF, self.node.power_state) self.assertIsNotNone(self.node.last_error) self.assertFalse(os.path.exists(token_path)) def test_continue_deploy_invalid(self): self.node.power_state = states.POWER_ON self.node.provision_state = 'FAKE' self.node.save(self.context) with task_manager.acquire(self.context, [self.node.uuid]) as task: task.resources[0].driver.vendor.vendor_passthru(task, self.node, method='pass_deploy_info', address='123456', iqn='aaa-bbb', key='fake-56789', error='test ramdisk error') self.assertEqual('FAKE', self.node.provision_state) self.assertEqual(states.POWER_ON, self.node.power_state) def test_lock_elevated(self): with task_manager.acquire(self.context, [self.node['uuid']]) as task: with mock.patch.object(task.driver.vendor, '_continue_deploy') \ as _continue_deploy_mock: task.driver.vendor.vendor_passthru(task, self.node, method='pass_deploy_info', address='123456', iqn='aaa-bbb', key='fake-56789') # lock elevated w/o exception self.assertEqual(1, _continue_deploy_mock.call_count, "_continue_deploy was not called once.") def clean_up_config(self, master=None): ports = [] ports.append( self.dbapi.create_port( db_utils.get_test_port( id=6, address='aa:bb:cc', uuid='bb43dc0b-03f2-4d2e-ae87-c02d7f33cc53', node_id='123'))) d_kernel_path = os.path.join(CONF.pxe.tftp_root, self.node.uuid, 'deploy_kernel') image_info = {'deploy_kernel': ['deploy_kernel_uuid', d_kernel_path]} with mock.patch.object(pxe, '_get_tftp_image_info') \ as get_tftp_image_info_mock: get_tftp_image_info_mock.return_value = image_info pxecfg_dir = os.path.join(CONF.pxe.tftp_root, 'pxelinux.cfg') os.makedirs(pxecfg_dir) instance_dir = os.path.join(CONF.pxe.tftp_root, self.node.uuid) image_dir = os.path.join(CONF.pxe.images_path, self.node.uuid) os.makedirs(instance_dir) os.makedirs(image_dir) config_path = os.path.join(instance_dir, 'config') deploy_kernel_path = os.path.join(instance_dir, 'deploy_kernel') pxe_mac_path = os.path.join(pxecfg_dir, '01-aa-bb-cc') image_path = os.path.join(image_dir, 'disk') open(config_path, 'w').close() os.link(config_path, pxe_mac_path) if master: tftp_master_dir = os.path.join(CONF.pxe.tftp_root, 'tftp_master') instance_master_dir = os.path.join(CONF.pxe.images_path, 'instance_master') self.config(tftp_master_path=tftp_master_dir, group='pxe') self.config(instance_master_path=instance_master_dir, group='pxe') os.makedirs(tftp_master_dir) os.makedirs(instance_master_dir) master_deploy_kernel_path = os.path.join(tftp_master_dir, 'deploy_kernel_uuid') master_instance_path = os.path.join(instance_master_dir, 'image_uuid') open(master_deploy_kernel_path, 'w').close() open(master_instance_path, 'w').close() os.link(master_deploy_kernel_path, deploy_kernel_path) os.link(master_instance_path, image_path) if master == 'in_use': deploy_kernel_link = os.path.join(CONF.pxe.tftp_root, 'deploy_kernel_link') image_link = os.path.join(CONF.pxe.images_path, 'image_link') os.link(master_deploy_kernel_path, deploy_kernel_link) os.link(master_instance_path, image_link) else: self.config(tftp_master_path='', group='pxe') self.config(instance_master_path='', group='pxe') open(deploy_kernel_path, 'w').close() open(image_path, 'w').close() with task_manager.acquire(self.context, [self.node['uuid']], shared=True) as task: task.resources[0].driver.deploy.clean_up(task, self.node) get_tftp_image_info_mock.called_once_with(self.node) assert_false_path = [config_path, deploy_kernel_path, image_path, pxe_mac_path, image_dir, instance_dir] for path in assert_false_path: self.assertFalse(os.path.exists(path)) def test_clean_up_removes_token_file(self): token_path = self._create_token_file() self.clean_up_config(master=None) self.assertFalse(os.path.exists(token_path)) def test_clean_up_no_master_images(self): self.clean_up_config(master=None) def test_clean_up_master_images_not_in_use(self): self.clean_up_config(master='not_in_use') master_d_kernel_path = os.path.join(CONF.pxe.tftp_master_path, 'deploy_kernel_uuid') master_instance_path = os.path.join(CONF.pxe.instance_master_path, 'image_uuid') self.assertFalse(os.path.exists(master_d_kernel_path)) self.assertFalse(os.path.exists(master_instance_path)) def test_clean_up_master_images_in_use(self): self.clean_up_config(master='in_use') master_d_kernel_path = os.path.join(CONF.pxe.tftp_master_path, 'deploy_kernel_uuid') master_instance_path = os.path.join(CONF.pxe.instance_master_path, 'image_uuid') self.assertTrue(os.path.exists(master_d_kernel_path)) self.assertTrue(os.path.exists(master_instance_path)) ironic-2014.1.rc1/ironic/tests/drivers/test_deploy_utils.py0000664000175300017540000004057212316614116025146 0ustar jenkinsjenkins00000000000000# Copyright (c) 2012 NTT DOCOMO, INC. # Copyright 2011 OpenStack Foundation # Copyright 2011 Ilya Alekseyev # # 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 fixtures import mock import os import tempfile from ironic.common import exception from ironic.drivers.modules import deploy_utils as utils from ironic.tests import base as tests_base _PXECONF_DEPLOY = """ default deploy label deploy kernel deploy_kernel append initrd=deploy_ramdisk ipappend 3 label boot kernel kernel append initrd=ramdisk root={{ ROOT }} """ _PXECONF_BOOT = """ default boot label deploy kernel deploy_kernel append initrd=deploy_ramdisk ipappend 3 label boot kernel kernel append initrd=ramdisk root=UUID=12345678-1234-1234-1234-1234567890abcdef """ class PhysicalWorkTestCase(tests_base.TestCase): def setUp(self): super(PhysicalWorkTestCase, self).setUp() def noop(*args, **kwargs): pass self.useFixture(fixtures.MonkeyPatch('time.sleep', noop)) def _mock_calls(self, name_list): patch_list = [mock.patch.object(utils, name) for name in name_list] mock_list = [patcher.start() for patcher in patch_list] for patcher in patch_list: self.addCleanup(patcher.stop) parent_mock = mock.MagicMock() for mocker, name in zip(mock_list, name_list): parent_mock.attach_mock(mocker, name) return parent_mock def test_deploy(self): """Check loosely all functions are called with right args.""" address = '127.0.0.1' port = 3306 iqn = 'iqn.xyz' lun = 1 image_path = '/tmp/xyz/image' pxe_config_path = '/tmp/abc/pxeconfig' root_mb = 128 swap_mb = 64 ephemeral_mb = 0 ephemeral_format = None dev = '/dev/fake' root_part = '/dev/fake-part1' swap_part = '/dev/fake-part2' root_uuid = '12345678-1234-1234-12345678-12345678abcdef' name_list = ['get_dev', 'get_image_mb', 'discovery', 'login_iscsi', 'logout_iscsi', 'delete_iscsi', 'make_partitions', 'is_block_device', 'dd', 'mkswap', 'block_uuid', 'switch_pxe_config', 'notify'] parent_mock = self._mock_calls(name_list) parent_mock.get_dev.return_value = dev parent_mock.get_image_mb.return_value = 1 parent_mock.is_block_device.return_value = True parent_mock.block_uuid.return_value = root_uuid calls_expected = [mock.call.get_dev(address, port, iqn, lun), mock.call.get_image_mb(image_path), mock.call.discovery(address, port), mock.call.login_iscsi(address, port, iqn), mock.call.is_block_device(dev), mock.call.make_partitions(dev, root_mb, swap_mb, ephemeral_mb), mock.call.is_block_device(root_part), mock.call.is_block_device(swap_part), mock.call.dd(image_path, root_part), mock.call.mkswap(swap_part), mock.call.block_uuid(root_part), mock.call.logout_iscsi(address, port, iqn), mock.call.delete_iscsi(address, port, iqn), mock.call.switch_pxe_config(pxe_config_path, root_uuid), mock.call.notify(address, 10000)] utils.deploy(address, port, iqn, lun, image_path, pxe_config_path, root_mb, swap_mb, ephemeral_mb, ephemeral_format) self.assertEqual(calls_expected, parent_mock.mock_calls) def test_deploy_with_ephemeral(self): """Check loosely all functions are called with right args.""" address = '127.0.0.1' port = 3306 iqn = 'iqn.xyz' lun = 1 image_path = '/tmp/xyz/image' pxe_config_path = '/tmp/abc/pxeconfig' root_mb = 128 swap_mb = 64 ephemeral_mb = 256 ephemeral_format = 'exttest' dev = '/dev/fake' ephemeral_part = '/dev/fake-part1' swap_part = '/dev/fake-part2' root_part = '/dev/fake-part3' root_uuid = '12345678-1234-1234-12345678-12345678abcdef' name_list = ['get_dev', 'get_image_mb', 'discovery', 'login_iscsi', 'logout_iscsi', 'delete_iscsi', 'make_partitions', 'is_block_device', 'dd', 'mkswap', 'block_uuid', 'switch_pxe_config', 'notify', 'mkfs_ephemeral'] parent_mock = self._mock_calls(name_list) parent_mock.get_dev.return_value = dev parent_mock.get_image_mb.return_value = 1 parent_mock.is_block_device.return_value = True parent_mock.block_uuid.return_value = root_uuid calls_expected = [mock.call.get_dev(address, port, iqn, lun), mock.call.get_image_mb(image_path), mock.call.discovery(address, port), mock.call.login_iscsi(address, port, iqn), mock.call.is_block_device(dev), mock.call.make_partitions(dev, root_mb, swap_mb, ephemeral_mb), mock.call.is_block_device(root_part), mock.call.is_block_device(swap_part), mock.call.is_block_device(ephemeral_part), mock.call.dd(image_path, root_part), mock.call.mkswap(swap_part), mock.call.mkfs_ephemeral(ephemeral_part, ephemeral_format), mock.call.block_uuid(root_part), mock.call.logout_iscsi(address, port, iqn), mock.call.delete_iscsi(address, port, iqn), mock.call.switch_pxe_config(pxe_config_path, root_uuid), mock.call.notify(address, 10000)] utils.deploy(address, port, iqn, lun, image_path, pxe_config_path, root_mb, swap_mb, ephemeral_mb, ephemeral_format) self.assertEqual(calls_expected, parent_mock.mock_calls) def test_deploy_preserve_ephemeral(self): """Check if all functions are called with right args.""" address = '127.0.0.1' port = 3306 iqn = 'iqn.xyz' lun = 1 image_path = '/tmp/xyz/image' pxe_config_path = '/tmp/abc/pxeconfig' root_mb = 128 swap_mb = 64 ephemeral_mb = 256 ephemeral_format = 'exttest' dev = '/dev/fake' ephemeral_part = '/dev/fake-part1' swap_part = '/dev/fake-part2' root_part = '/dev/fake-part3' root_uuid = '12345678-1234-1234-12345678-12345678abcdef' mock_mkfs_eph = mock.patch.object(utils, 'mkfs_ephemeral').start() self.addCleanup(mock_mkfs_eph.stop) name_list = ['get_dev', 'get_image_mb', 'discovery', 'login_iscsi', 'logout_iscsi', 'delete_iscsi', 'make_partitions', 'is_block_device', 'dd', 'mkswap', 'block_uuid', 'switch_pxe_config', 'notify'] parent_mock = self._mock_calls(name_list) parent_mock.get_dev.return_value = dev parent_mock.get_image_mb.return_value = 1 parent_mock.is_block_device.return_value = True parent_mock.block_uuid.return_value = root_uuid calls_expected = [mock.call.get_dev(address, port, iqn, lun), mock.call.get_image_mb(image_path), mock.call.discovery(address, port), mock.call.login_iscsi(address, port, iqn), mock.call.is_block_device(dev), mock.call.make_partitions(dev, root_mb, swap_mb, ephemeral_mb), mock.call.is_block_device(root_part), mock.call.is_block_device(swap_part), mock.call.is_block_device(ephemeral_part), mock.call.dd(image_path, root_part), mock.call.mkswap(swap_part), mock.call.block_uuid(root_part), mock.call.logout_iscsi(address, port, iqn), mock.call.delete_iscsi(address, port, iqn), mock.call.switch_pxe_config(pxe_config_path, root_uuid), mock.call.notify(address, 10000)] utils.deploy(address, port, iqn, lun, image_path, pxe_config_path, root_mb, swap_mb, ephemeral_mb, ephemeral_format, preserve_ephemeral=True) self.assertEqual(calls_expected, parent_mock.mock_calls) # mkfs_ephemeral should not be called self.assertFalse(mock_mkfs_eph.called) def test_always_logout_and_delete_iscsi(self): """Check if logout_iscsi() and delete_iscsi() are called. Make sure that logout_iscsi() and delete_iscsi() are called once login_iscsi() is invoked. """ address = '127.0.0.1' port = 3306 iqn = 'iqn.xyz' lun = 1 image_path = '/tmp/xyz/image' pxe_config_path = '/tmp/abc/pxeconfig' root_mb = 128 swap_mb = 64 ephemeral_mb = 256 ephemeral_format = 'exttest' dev = '/dev/fake' class TestException(Exception): pass name_list = ['get_dev', 'get_image_mb', 'discovery', 'login_iscsi', 'logout_iscsi', 'delete_iscsi', 'work_on_disk'] patch_list = [mock.patch.object(utils, name) for name in name_list] mock_list = [patcher.start() for patcher in patch_list] for patcher in patch_list: self.addCleanup(patcher.stop) parent_mock = mock.MagicMock() for mocker, name in zip(mock_list, name_list): parent_mock.attach_mock(mocker, name) parent_mock.get_dev.return_value = dev parent_mock.get_image_mb.return_value = 1 parent_mock.work_on_disk.side_effect = TestException calls_expected = [mock.call.get_dev(address, port, iqn, lun), mock.call.get_image_mb(image_path), mock.call.discovery(address, port), mock.call.login_iscsi(address, port, iqn), mock.call.work_on_disk(dev, root_mb, swap_mb, ephemeral_mb, ephemeral_format, image_path, False), mock.call.logout_iscsi(address, port, iqn), mock.call.delete_iscsi(address, port, iqn)] self.assertRaises(TestException, utils.deploy, address, port, iqn, lun, image_path, pxe_config_path, root_mb, swap_mb, ephemeral_mb, ephemeral_format) self.assertEqual(calls_expected, parent_mock.mock_calls) class SwitchPxeConfigTestCase(tests_base.TestCase): def setUp(self): super(SwitchPxeConfigTestCase, self).setUp() (fd, self.fname) = tempfile.mkstemp() os.write(fd, _PXECONF_DEPLOY) os.close(fd) self.addCleanup(os.unlink, self.fname) def test_switch_pxe_config(self): utils.switch_pxe_config(self.fname, '12345678-1234-1234-1234-1234567890abcdef') with open(self.fname, 'r') as f: pxeconf = f.read() self.assertEqual(_PXECONF_BOOT, pxeconf) class OtherFunctionTestCase(tests_base.TestCase): def test_get_dev(self): expected = '/dev/disk/by-path/ip-1.2.3.4:5678-iscsi-iqn.fake-lun-9' actual = utils.get_dev('1.2.3.4', 5678, 'iqn.fake', 9) self.assertEqual(expected, actual) def test_get_image_mb(self): mb = 1024 * 1024 size = None def fake_getsize(path): return size self.useFixture(fixtures.MonkeyPatch('os.path.getsize', fake_getsize)) size = 0 self.assertEqual(0, utils.get_image_mb('x')) size = 1 self.assertEqual(1, utils.get_image_mb('x')) size = mb self.assertEqual(1, utils.get_image_mb('x')) size = mb + 1 self.assertEqual(2, utils.get_image_mb('x')) class WorkOnDiskTestCase(tests_base.TestCase): def setUp(self): super(WorkOnDiskTestCase, self).setUp() self.image_path = '/tmp/xyz/image' self.root_mb = 128 self.swap_mb = 64 self.ephemeral_mb = 0 self.ephemeral_format = None self.dev = '/dev/fake' self.root_part = '/dev/fake-part1' self.swap_part = '/dev/fake-part2' self.mock_ibd = mock.patch.object(utils, 'is_block_device').start() self.mock_mp = mock.patch.object(utils, 'make_partitions').start() self.addCleanup(self.mock_ibd.stop) self.addCleanup(self.mock_mp.stop) def test_no_parent_device(self): self.mock_ibd.return_value = False self.assertRaises(exception.InstanceDeployFailure, utils.work_on_disk, self.dev, self.root_mb, self.swap_mb, self.ephemeral_mb, self.ephemeral_format, self.image_path, False) self.mock_ibd.assert_called_once_with(self.dev) self.assertFalse(self.mock_mp.called, "make_partitions mock was unexpectedly called.") def test_no_root_partition(self): self.mock_ibd.side_effect = [True, False] calls = [mock.call(self.dev), mock.call(self.root_part)] self.assertRaises(exception.InstanceDeployFailure, utils.work_on_disk, self.dev, self.root_mb, self.swap_mb, self.ephemeral_mb, self.ephemeral_format, self.image_path, False) self.assertEqual(self.mock_ibd.call_args_list, calls) self.mock_mp.assert_called_once_with(self.dev, self.root_mb, self.swap_mb, self.ephemeral_mb) def test_no_swap_partition(self): self.mock_ibd.side_effect = [True, True, False] calls = [mock.call(self.dev), mock.call(self.root_part), mock.call(self.swap_part)] self.assertRaises(exception.InstanceDeployFailure, utils.work_on_disk, self.dev, self.root_mb, self.swap_mb, self.ephemeral_mb, self.ephemeral_format, self.image_path, False) self.assertEqual(self.mock_ibd.call_args_list, calls) self.mock_mp.assert_called_once_with(self.dev, self.root_mb, self.swap_mb, self.ephemeral_mb) def test_no_ephemeral_partition(self): ephemeral_part = '/dev/fake-part1' swap_part = '/dev/fake-part2' root_part = '/dev/fake-part3' ephemeral_mb = 256 ephemeral_format = 'exttest' self.mock_ibd.side_effect = [True, True, True, False] calls = [mock.call(self.dev), mock.call(root_part), mock.call(swap_part), mock.call(ephemeral_part)] self.assertRaises(exception.InstanceDeployFailure, utils.work_on_disk, self.dev, self.root_mb, self.swap_mb, ephemeral_mb, ephemeral_format, self.image_path, False) self.assertEqual(self.mock_ibd.call_args_list, calls) self.mock_mp.assert_called_once_with(self.dev, self.root_mb, self.swap_mb, ephemeral_mb) ironic-2014.1.rc1/ironic/tests/drivers/__init__.py0000664000175300017540000000000012316614116023110 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/tests/drivers/test_utils.py0000664000175300017540000000626212316614116023570 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 mock from ironic.common import driver_factory from ironic.common import exception from ironic.db import api as db_api from ironic.drivers.modules import fake from ironic.openstack.common import context from ironic.tests import base from ironic.tests.conductor import utils as mgr_utils from ironic.tests.db import utils as db_utils class UtilsTestCase(base.TestCase): def setUp(self): super(UtilsTestCase, self).setUp() self.context = context.get_admin_context() self.dbapi = db_api.get_instance() mgr_utils.mock_the_extension_manager() self.driver = driver_factory.get_driver("fake") self.node = db_utils.get_test_node() self.dbapi.create_node(self.node) @mock.patch.object(fake.FakeVendorA, 'validate') def test_vendor_interface_validate_valid_methods(self, mock_fakea_validate): self.driver.vendor.validate(method='first_method') mock_fakea_validate.assert_called_once_with(method='first_method') def test_vendor_interface_validate_bad_method(self): self.assertRaises(exception.UnsupportedDriverExtension, self.driver.vendor.validate, method='fake_method') def test_vendor_interface_validate_none_method(self): self.assertRaises(exception.InvalidParameterValue, self.driver.vendor.validate) @mock.patch.object(fake.FakeVendorA, 'vendor_passthru') @mock.patch.object(fake.FakeVendorB, 'vendor_passthru') def test_vendor_interface_route_valid_method(self, mock_fakeb_vendor, mock_fakea_vendor): self.driver.vendor.vendor_passthru('task', 'node', method='first_method', param1='fake1', param2='fake2') mock_fakea_vendor.assert_called_once_with('task', 'node', method='first_method', param1='fake1', param2='fake2') self.driver.vendor.vendor_passthru('task', 'node', method='second_method', param1='fake1', param2='fake2') mock_fakeb_vendor.assert_called_once_with('task', 'node', method='second_method', param1='fake1', param2='fake2') ironic-2014.1.rc1/ironic/tests/drivers/test_seamicro.py0000664000175300017540000005574012316614116024237 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. """Test class for Ironic SeaMicro driver.""" import uuid import mock from ironic.common import driver_factory from ironic.common import exception from ironic.common import states from ironic.conductor import task_manager from ironic.db import api as dbapi from ironic.drivers.modules import seamicro from ironic.openstack.common import importutils from ironic.tests import base from ironic.tests.conductor import utils as mgr_utils from ironic.tests.db import base as db_base from ironic.tests.db import utils as db_utils INFO_DICT = db_utils.get_test_seamicro_info() seamicroclient = importutils.try_import("seamicroclient") if seamicroclient: from seamicroclient import exceptions as seamicro_client_exception class Fake_Server(): def __init__(self, active=False, *args, **kwargs): self.active = active self.nic = {'0': {'untaggedVlan': ''}} def power_on(self): self.active = True def power_off(self, force=False): self.active = False def reset(self): self.active = True def set_untagged_vlan(self, vlan_id): return def attach_volume(self, volume_id): return def detach_volume(self): return def set_boot_order(self, boot_order): return def refresh(self, wait=0): return self class Fake_Volume(): def __init__(self, id=None, *args, **kwargs): if id is None: self.id = "%s/%s/%s" % ("0", "ironic-p6-6", str(uuid.uuid4())) else: self.id = id class Fake_Pool(): def __init__(self, freeSize=None, *args, **kwargs): self.freeSize = freeSize class SeaMicroValidateParametersTestCase(base.TestCase): def test__parse_driver_info_good(self): # make sure we get back the expected things node = db_utils.get_test_node(driver='fake_seamicro', driver_info=INFO_DICT) info = seamicro._parse_driver_info(node) self.assertIsNotNone(info.get('api_endpoint')) self.assertIsNotNone(info.get('username')) self.assertIsNotNone(info.get('password')) self.assertIsNotNone(info.get('server_id')) self.assertIsNotNone(info.get('uuid')) def test__parse_driver_info_missing_api_endpoint(self): # make sure error is raised when info is missing info = dict(INFO_DICT) del info['seamicro_api_endpoint'] node = db_utils.get_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, seamicro._parse_driver_info, node) def test__parse_driver_info_missing_username(self): # make sure error is raised when info is missing info = dict(INFO_DICT) del info['seamicro_username'] node = db_utils.get_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, seamicro._parse_driver_info, node) def test__parse_driver_info_missing_password(self): # make sure error is raised when info is missing info = dict(INFO_DICT) del info['seamicro_password'] node = db_utils.get_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, seamicro._parse_driver_info, node) def test__parse_driver_info_missing_server_id(self): # make sure error is raised when info is missing info = dict(INFO_DICT) del info['seamicro_server_id'] node = db_utils.get_test_node(driver_info=info) self.assertRaises(exception.InvalidParameterValue, seamicro._parse_driver_info, node) class SeaMicroPrivateMethodsTestCase(base.TestCase): def setUp(self): super(SeaMicroPrivateMethodsTestCase, self).setUp() n = { 'driver': 'fake_seamicro', 'driver_info': INFO_DICT } self.dbapi = dbapi.get_instance() self.node = self._create_test_node(**n) self.Server = Fake_Server self.Volume = Fake_Volume self.Pool = Fake_Pool self.config(action_timeout=0, group='seamicro') self.config(max_retry=2, group='seamicro') self.patcher = mock.patch('eventlet.greenthread.sleep') self.mock_sleep = self.patcher.start() def _create_test_node(self, **kwargs): n = db_utils.get_test_node(**kwargs) return self.dbapi.create_node(n) @mock.patch.object(seamicro, "_get_server") def test__get_power_status_on(self, mock_get_server): mock_get_server.return_value = self.Server(active=True) pstate = seamicro._get_power_status(self.node) self.assertEqual(states.POWER_ON, pstate) @mock.patch.object(seamicro, "_get_server") def test__get_power_status_off(self, mock_get_server): mock_get_server.return_value = self.Server(active=False) pstate = seamicro._get_power_status(self.node) self.assertEqual(states.POWER_OFF, pstate) @mock.patch.object(seamicro, "_get_server") def test__get_power_status_error(self, mock_get_server): mock_get_server.return_value = self.Server(active=None) pstate = seamicro._get_power_status(self.node) self.assertEqual(states.ERROR, pstate) @mock.patch.object(seamicro, "_get_server") def test__power_on_good(self, mock_get_server): mock_get_server.return_value = self.Server(active=False) pstate = seamicro._power_on(self.node) self.assertEqual(states.POWER_ON, pstate) @mock.patch.object(seamicro, "_get_server") def test__power_on_fail(self, mock_get_server): def fake_power_on(): return server = self.Server(active=False) server.power_on = fake_power_on mock_get_server.return_value = server pstate = seamicro._power_on(self.node) self.assertEqual(states.ERROR, pstate) @mock.patch.object(seamicro, "_get_server") def test__power_off_good(self, mock_get_server): mock_get_server.return_value = self.Server(active=True) pstate = seamicro._power_off(self.node) self.assertEqual(states.POWER_OFF, pstate) @mock.patch.object(seamicro, "_get_server") def test__power_off_fail(self, mock_get_server): def fake_power_off(): return server = self.Server(active=True) server.power_off = fake_power_off mock_get_server.return_value = server pstate = seamicro._power_off(self.node) self.assertEqual(states.ERROR, pstate) @mock.patch.object(seamicro, "_get_server") def test__reboot_good(self, mock_get_server): mock_get_server.return_value = self.Server(active=True) pstate = seamicro._reboot(self.node) self.assertEqual(states.POWER_ON, pstate) @mock.patch.object(seamicro, "_get_server") def test__reboot_fail(self, mock_get_server): def fake_reboot(): return server = self.Server(active=False) server.reset = fake_reboot mock_get_server.return_value = server pstate = seamicro._reboot(self.node) self.assertEqual(states.ERROR, pstate) @mock.patch.object(seamicro, "_get_volume") def test__validate_fail(self, mock_get_volume): info = seamicro._parse_driver_info(self.node) volume_id = "0/p6-6/vol1" volume = self.Volume() volume.id = volume_id mock_get_volume.return_value = volume self.assertRaises(exception.InvalidParameterValue, seamicro._validate_volume, info, volume_id) @mock.patch.object(seamicro, "_get_volume") def test__validate_good(self, mock_get_volume): info = seamicro._parse_driver_info(self.node) volume = self.Volume() mock_get_volume.return_value = volume valid = seamicro._validate_volume(info, volume.id) self.assertEqual(valid, True) @mock.patch.object(seamicro, "_get_pools") def test__create_volume_fail(self, mock_get_pools): info = seamicro._parse_driver_info(self.node) mock_get_pools.return_value = None self.assertRaises(exception.IronicException, seamicro._create_volume, info, 2) @mock.patch.object(seamicro, "_get_pools") @mock.patch.object(seamicro, "_get_client") def test__create_volume_good(self, mock_get_client, mock_get_pools): info = seamicro._parse_driver_info(self.node) pools = [self.Pool(1), self.Pool(6), self.Pool(5)] get_pools_patcher = mock.patch.object(mock_get_client, "volume.create") get_pools_patcher.start() mock_get_pools.return_value = pools seamicro._create_volume(info, 2) get_pools_patcher.stop() class SeaMicroPowerDriverTestCase(db_base.DbTestCase): def setUp(self): super(SeaMicroPowerDriverTestCase, self).setUp() if not seamicroclient: self.skipTest("Seamicroclient library not found") mgr_utils.mock_the_extension_manager(driver='fake_seamicro') self.driver = driver_factory.get_driver('fake_seamicro') self.node = db_utils.get_test_node(driver='fake_seamicro', driver_info=INFO_DICT) self.dbapi = dbapi.get_instance() self.node = self.dbapi.create_node(self.node) self.parse_drv_info_patcher = mock.patch.object(seamicro, '_parse_driver_info') self.parse_drv_info_mock = None self.get_server_patcher = mock.patch.object(seamicro, '_get_server') self.get_server_mock = None self.Server = Fake_Server self.Volume = Fake_Volume @mock.patch.object(seamicro, '_reboot') def test_reboot(self, mock_reboot): info = seamicro._parse_driver_info(self.node) mock_reboot.return_value = states.POWER_ON with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: task.resources[0].driver.power.reboot(task, self.node) mock_reboot.assert_called_once_with(self.node) def test_set_power_state_bad_state(self): info = seamicro ._parse_driver_info(self.node) self.get_server_mock = self.get_server_patcher.start() self.get_server_mock.return_value = self.Server() with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: self.assertRaises(exception.IronicException, task.resources[0].driver.power.set_power_state, task, self.node, "BAD_PSTATE") self.get_server_patcher.stop() @mock.patch.object(seamicro, '_power_on') def test_set_power_state_on_good(self, mock_power_on): info = seamicro._parse_driver_info(self.node) mock_power_on.return_value = states.POWER_ON with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: task.resources[0].driver.power.set_power_state(task, self.node, states.POWER_ON) mock_power_on.assert_called_once_with(self.node) @mock.patch.object(seamicro, '_power_on') def test_set_power_state_on_fail(self, mock_power_on): info = seamicro._parse_driver_info(self.node) mock_power_on.return_value = states.POWER_OFF with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: self.assertRaises(exception.PowerStateFailure, task.resources[0] .driver.power.set_power_state, task, self.node, states.POWER_ON) mock_power_on.assert_called_once_with(self.node) @mock.patch.object(seamicro, '_power_off') def test_set_power_state_off_good(self, mock_power_off): info = seamicro._parse_driver_info(self.node) mock_power_off.return_value = states.POWER_OFF with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: task.resources[0].driver.power.\ set_power_state(task, self.node, states.POWER_OFF) mock_power_off.assert_called_once_with(self.node) @mock.patch.object(seamicro, '_power_off') def test_set_power_state_off_fail(self, mock_power_off): info = seamicro._parse_driver_info(self.node) mock_power_off.return_value = states.POWER_ON with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: self.assertRaises(exception.PowerStateFailure, task.resources[0] .driver.power.set_power_state, task, self.node, states.POWER_OFF) mock_power_off.assert_called_once_with(self.node) def test_vendor_passthru_validate_good(self): with task_manager.acquire(self.context, [self.node['uuid']], shared=True) as task: for method in seamicro.VENDOR_PASSTHRU_METHODS: task.resources[0].driver.vendor.validate( task, self.node, **{'method': method}) def test_vendor_passthru_validate_fail(self): with task_manager.acquire(self.context, [self.node['uuid']], shared=True) as task: self.assertRaises(exception.InvalidParameterValue, task.resources[0].driver.vendor.validate, task, self.node, **{'method': 'invalid_method'}) @mock.patch.object(seamicro, '_get_server') def test_set_node_vlan_id_good(self, mock_get_server): info = seamicro._parse_driver_info(self.node) vlan_id = "12" mock_get_server.return_value = self.Server(active="true") with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: kwargs = {'vlan_id': vlan_id, 'method': 'set_node_vlan_id'} task.resources[0].driver.vendor.\ vendor_passthru(task, self.node, **kwargs) mock_get_server.assert_called_once_with(info) def test_set_node_vlan_id_no_input(self): info = seamicro._parse_driver_info(self.node) with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: self.assertRaises(exception.InvalidParameterValue, task.resources[0].driver.vendor. vendor_passthru, task, self.node, **{'method': 'set_node_vlan_id'}) @mock.patch.object(seamicro, '_get_server') def test_set_node_vlan_id_fail(self, mock_get_server): def fake_set_untagged_vlan(self, **kwargs): raise seamicro_client_exception.ClientException(500) info = seamicro._parse_driver_info(self.node) vlan_id = "12" server = self.Server(active="true") server.set_untagged_vlan = fake_set_untagged_vlan mock_get_server.return_value = server with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: kwargs = {'vlan_id': vlan_id, 'method': 'set_node_vlan_id'} self.assertRaises(exception.IronicException, task.resources[0].driver.vendor. vendor_passthru, task, self.node, **kwargs) mock_get_server.assert_called_once_with(info) @mock.patch.object(seamicro, '_get_server') @mock.patch.object(seamicro, '_validate_volume') def test_attach_volume_with_volume_id_good(self, mock_validate_volume, mock_get_server): info = seamicro._parse_driver_info(self.node) volume_id = '0/ironic-p6-1/vol1' mock_validate_volume.return_value = True mock_get_server.return_value = self.Server(active="true") with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: kwargs = {'volume_id': volume_id, 'method': 'attach_volume'} task.resources[0].driver.vendor.\ vendor_passthru(task, self.node, **kwargs) mock_get_server.assert_called_once_with(info) @mock.patch.object(seamicro, '_get_server') @mock.patch.object(seamicro, '_get_volume') def test_attach_volume_with_invalid_volume_id_fail(self, mock_get_volume, mock_get_server): info = seamicro._parse_driver_info(self.node) volume_id = '0/p6-1/vol1' mock_get_volume.return_value = self.Volume(volume_id) mock_get_server.return_value = self.Server(active="true") with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: kwargs = {'volume_id': volume_id, 'method': 'attach_volume'} self.assertRaises(exception.InvalidParameterValue, task.resources[0].driver.vendor. vendor_passthru, task, self.node, **kwargs) @mock.patch.object(seamicro, '_get_server') @mock.patch.object(seamicro, '_validate_volume') def test_attach_volume_fail(self, mock_validate_volume, mock_get_server): def fake_attach_volume(self, **kwargs): raise seamicro_client_exception.ClientException(500) info = seamicro._parse_driver_info(self.node) volume_id = '0/p6-1/vol1' mock_validate_volume.return_value = True server = self.Server(active="true") server.attach_volume = fake_attach_volume mock_get_server.return_value = server with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: kwargs = {'volume_id': volume_id, 'method': 'attach_volume'} self.assertRaises(exception.IronicException, task.resources[0].driver.vendor. vendor_passthru, task, self.node, **kwargs) mock_get_server.assert_called_once_with(info) @mock.patch.object(seamicro, '_get_server') @mock.patch.object(seamicro, '_validate_volume') @mock.patch.object(seamicro, '_create_volume') def test_attach_volume_with_volume_size_good(self, mock_create_volume, mock_validate_volume, mock_get_server): info = seamicro._parse_driver_info(self.node) volume_id = '0/ironic-p6-1/vol1' volume_size = 2 mock_create_volume.return_value = volume_id mock_validate_volume.return_value = True mock_get_server.return_value = self.Server(active="true") with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: kwargs = {'volume_size': volume_size, 'method': "attach_volume"} task.resources[0].driver.vendor.\ vendor_passthru(task, self.node, **kwargs) mock_get_server.assert_called_once_with(info) mock_create_volume.assert_called_once_with(info, volume_size) def test_attach_volume_with_no_input_fail(self): info = seamicro._parse_driver_info(self.node) with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: self.assertRaises(exception.InvalidParameterValue, task.resources[0].driver.vendor. vendor_passthru, task, self.node, **{'method': 'attach_volume'}) @mock.patch.object(seamicro, '_get_server') def test_set_boot_device_good(self, mock_get_server): info = seamicro._parse_driver_info(self.node) boot_device = "disk" mock_get_server.return_value = self.Server(active="true") with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: kwargs = {'device': boot_device, 'method': 'set_boot_device'} task.resources[0].driver.vendor.\ vendor_passthru(task, self.node, **kwargs) mock_get_server.assert_called_once_with(info) def test_set_boot_device_no_input(self): info = seamicro._parse_driver_info(self.node) with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: self.assertRaises(exception.InvalidParameterValue, task.resources[0].driver.vendor. vendor_passthru, task, self.node, **{'method': 'set_boot_device'}) @mock.patch.object(seamicro, '_get_server') def test_set_boot_device_invalid_device_fail(self, mock_get_server): info = seamicro._parse_driver_info(self.node) boot_device = "invalid_device" mock_get_server.return_value = self.Server(active="true") with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: kwargs = {'device': boot_device, 'method': 'set_boot_device'} self.assertRaises(exception.InvalidParameterValue, task.resources[0].driver.vendor. vendor_passthru, task, self.node, **kwargs) @mock.patch.object(seamicro, '_get_server') def test_set_boot_device_fail(self, mock_get_server): def fake_set_boot_order(self, **kwargs): raise seamicro_client_exception.ClientException(500) info = seamicro._parse_driver_info(self.node) boot_device = "pxe" server = self.Server(active="true") server.set_boot_order = fake_set_boot_order mock_get_server.return_value = server with task_manager.acquire(self.context, [info['uuid']], shared=False) as task: kwargs = {'device': boot_device, 'method': 'set_boot_device'} self.assertRaises(exception.IronicException, task.resources[0].driver.vendor. vendor_passthru, task, self.node, **kwargs) mock_get_server.assert_called_once_with(info) ironic-2014.1.rc1/ironic/tests/drivers/test_fake.py0000664000175300017540000000560712316614116023340 0ustar jenkinsjenkins00000000000000# coding=utf-8 # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """Test class for Fake driver.""" from ironic.common import driver_factory from ironic.common import exception from ironic.common import states from ironic.conductor import task_manager from ironic.db import api as db_api from ironic.drivers import base as driver_base from ironic.openstack.common import context from ironic.tests import base from ironic.tests.conductor import utils as mgr_utils from ironic.tests.db import utils as db_utils class FakeDriverTestCase(base.TestCase): def setUp(self): super(FakeDriverTestCase, self).setUp() self.context = context.get_admin_context() self.dbapi = db_api.get_instance() mgr_utils.mock_the_extension_manager() self.driver = driver_factory.get_driver("fake") self.node = db_utils.get_test_node() self.dbapi.create_node(self.node) def test_driver_interfaces(self): # fake driver implements only 3 out of 5 interfaces self.assertIsInstance(self.driver.power, driver_base.PowerInterface) self.assertIsInstance(self.driver.deploy, driver_base.DeployInterface) self.assertIsInstance(self.driver.vendor, driver_base.VendorInterface) self.assertIsInstance(self.driver.console, driver_base.ConsoleInterface) self.assertIsNone(self.driver.rescue) def test_power_interface(self): with task_manager.acquire(self.context, [self.node['uuid']]) as task: self.driver.power.validate(task, self.node) self.driver.power.get_power_state(task, self.node) self.assertRaises(exception.InvalidParameterValue, self.driver.power.set_power_state, task, self.node, states.NOSTATE) self.driver.power.set_power_state(task, self.node, states.POWER_ON) self.driver.power.reboot(task, self.node) def test_deploy_interface(self): self.driver.deploy.validate(None, self.node) self.driver.deploy.prepare(None, None) self.driver.deploy.deploy(None, None) self.driver.deploy.take_over(None, None) self.driver.deploy.clean_up(None, None) self.driver.deploy.tear_down(None, None) ironic-2014.1.rc1/ironic/tests/stubs.py0000664000175300017540000000751112316614116021051 0ustar jenkinsjenkins00000000000000# Copyright (c) 2011 Citrix Systems, Inc. # # 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.common import exception NOW_GLANCE_FORMAT = "2010-10-11T10:30:22" class StubGlanceClient(object): def __init__(self, images=None): self._images = [] _images = images or [] map(lambda image: self.create(**image), _images) #NOTE(bcwaldon): HACK to get client.images.* to work self.images = lambda: None for fn in ('list', 'get', 'data', 'create', 'update', 'delete'): setattr(self.images, fn, getattr(self, fn)) #TODO(bcwaldon): implement filters def list(self, filters=None, marker=None, limit=30): if marker is None: index = 0 else: for index, image in enumerate(self._images): if image.id == str(marker): index += 1 break else: raise exception.BadRequest('Marker not found') return self._images[index:index + limit] def get(self, image_id): for image in self._images: if image.id == str(image_id): return image raise exception.ImageNotFound(image_id) def data(self, image_id): self.get(image_id) return [] def create(self, **metadata): metadata['created_at'] = NOW_GLANCE_FORMAT metadata['updated_at'] = NOW_GLANCE_FORMAT self._images.append(FakeImage(metadata)) try: image_id = str(metadata['id']) except KeyError: # auto-generate an id if one wasn't provided image_id = str(len(self._images)) self._images[-1].id = image_id return self._images[-1] def update(self, image_id, **metadata): for i, image in enumerate(self._images): if image.id == str(image_id): for k, v in metadata.items(): setattr(self._images[i], k, v) return self._images[i] raise exception.NotFound(image_id) def delete(self, image_id): for i, image in enumerate(self._images): if image.id == image_id: # When you delete an image from glance, it sets the status to # DELETED. If you try to delete a DELETED image, it raises # HTTPForbidden. image_data = self._images[i] if image_data.deleted: raise exception.Forbidden() image_data.deleted = True return raise exception.NotFound(image_id) class FakeImage(object): def __init__(self, metadata): IMAGE_ATTRIBUTES = ['size', 'disk_format', 'owner', 'container_format', 'checksum', 'id', 'name', 'created_at', 'updated_at', 'deleted', 'status', 'min_disk', 'min_ram', 'is_public'] raw = dict.fromkeys(IMAGE_ATTRIBUTES) raw.update(metadata) self.__dict__['raw'] = raw def __getattr__(self, key): try: return self.__dict__['raw'][key] except KeyError: raise AttributeError(key) def __setattr__(self, key, value): try: self.__dict__['raw'][key] = value except KeyError: raise AttributeError(key) ironic-2014.1.rc1/ironic/tests/policy_fixture.py0000664000175300017540000000307512316614116022757 0ustar jenkinsjenkins00000000000000# Copyright 2012 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. import os import fixtures from oslo.config import cfg from ironic.common import policy as ironic_policy from ironic.openstack.common import policy as common_policy from ironic.tests import fake_policy CONF = cfg.CONF class PolicyFixture(fixtures.Fixture): def setUp(self): super(PolicyFixture, self).setUp() self.policy_dir = self.useFixture(fixtures.TempDir()) self.policy_file_name = os.path.join(self.policy_dir.path, 'policy.json') with open(self.policy_file_name, 'w') as policy_file: policy_file.write(fake_policy.policy_data) CONF.set_override('policy_file', self.policy_file_name) ironic_policy.reset() ironic_policy.init() self.addCleanup(ironic_policy.reset) def set_rules(self, rules): common_policy.set_rules(common_policy.Rules( dict((k, common_policy.parse_rule(v)) for k, v in rules.items()))) ironic-2014.1.rc1/ironic/tests/test_keystone.py0000664000175300017540000001070512316614116022610 0ustar jenkinsjenkins00000000000000# -*- encoding: 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. from keystoneclient import exceptions as ksexception import mock from ironic.common import exception from ironic.common import keystone from ironic.tests import base class FakeCatalog: def url_for(self, **kwargs): return 'fake-url' class FakeClient: def __init__(self, **kwargs): self.service_catalog = FakeCatalog() def has_service_catalog(self): return True class KeystoneTestCase(base.TestCase): def setUp(self): super(KeystoneTestCase, self).setUp() self.config(group='keystone_authtoken', auth_uri='http://127.0.0.1:9898/', admin_user='fake', admin_password='fake', admin_tenant_name='fake') def test_failure_authorization(self): self.assertRaises(exception.CatalogFailure, keystone.get_service_url) @mock.patch.object(FakeCatalog, 'url_for') @mock.patch('keystoneclient.v2_0.client.Client') def test_get_url(self, mock_ks, mock_uf): fake_url = 'http://127.0.0.1:6385' mock_uf.return_value = fake_url mock_ks.return_value = FakeClient() res = keystone.get_service_url() self.assertEqual(fake_url, res) @mock.patch.object(FakeCatalog, 'url_for') @mock.patch('keystoneclient.v2_0.client.Client') def test_url_not_found(self, mock_ks, mock_uf): mock_uf.side_effect = ksexception.EndpointNotFound mock_ks.return_value = FakeClient() self.assertRaises(exception.CatalogNotFound, keystone.get_service_url) @mock.patch.object(FakeClient, 'has_service_catalog') @mock.patch('keystoneclient.v2_0.client.Client') def test_no_catalog(self, mock_ks, mock_hsc): mock_hsc.return_value = False mock_ks.return_value = FakeClient() self.assertRaises(exception.CatalogFailure, keystone.get_service_url) @mock.patch('keystoneclient.v2_0.client.Client') def test_unauthorized(self, mock_ks): mock_ks.side_effect = ksexception.Unauthorized self.assertRaises(exception.CatalogUnauthorized, keystone.get_service_url) def test_get_service_url_fail_missing_auth_uri(self): self.config(group='keystone_authtoken', auth_uri=None) self.assertRaises(exception.CatalogFailure, keystone.get_service_url) @mock.patch('keystoneclient.v2_0.client.Client') def test_get_service_url_versionless_v2(self, mock_ks): mock_ks.return_value = FakeClient() self.config(group='keystone_authtoken', auth_uri='http://127.0.0.1') expected_url = 'http://127.0.0.1/v2.0' keystone.get_service_url() mock_ks.assert_called_once_with(username='fake', password='fake', tenant_name='fake', auth_url=expected_url) @mock.patch('keystoneclient.v3.client.Client') def test_get_service_url_versionless_v3(self, mock_ks): mock_ks.return_value = FakeClient() self.config(group='keystone_authtoken', auth_version='v3.0', auth_uri='http://127.0.0.1') expected_url = 'http://127.0.0.1/v3' keystone.get_service_url() mock_ks.assert_called_once_with(username='fake', password='fake', tenant_name='fake', auth_url=expected_url) @mock.patch('keystoneclient.v2_0.client.Client') def test_get_service_url_version_override(self, mock_ks): mock_ks.return_value = FakeClient() self.config(group='keystone_authtoken', auth_uri='http://127.0.0.1/v2.0/') expected_url = 'http://127.0.0.1/v2.0' keystone.get_service_url() mock_ks.assert_called_once_with(username='fake', password='fake', tenant_name='fake', auth_url=expected_url) ironic-2014.1.rc1/ironic/tests/__init__.py0000664000175300017540000000230212316614116021441 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # 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. """ :mod:`Ironic.tests` -- ironic Unittests ===================================================== .. automodule:: ironic.tests :platform: Unix """ # TODO(deva): move eventlet imports to ironic.__init__ once we move to PBR import eventlet eventlet.monkey_patch(os=False) # See http://code.google.com/p/python-nose/issues/detail?id=373 # The code below enables nosetests to work with i18n _() blocks import six.moves.builtins as __builtin__ setattr(__builtin__, '_', lambda x: x) ironic-2014.1.rc1/ironic/tests/test_utils.py0000664000175300017540000004160012316614116022105 0ustar jenkinsjenkins00000000000000# Copyright 2011 Justin Santa Barbara # Copyright 2012 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. import errno import hashlib import os import os.path import tempfile import uuid import mock import netaddr from oslo.config import cfg import six import six.moves.builtins as __builtin__ from ironic.common import exception from ironic.common import utils from ironic.openstack.common import processutils from ironic.tests import base CONF = cfg.CONF class BareMetalUtilsTestCase(base.TestCase): def test_random_alnum(self): s = utils.random_alnum(10) self.assertEqual(10, len(s)) s = utils.random_alnum(100) self.assertEqual(100, len(s)) def test_unlink(self): with mock.patch.object(os, "unlink") as unlink_mock: unlink_mock.return_value = None utils.unlink_without_raise("/fake/path") unlink_mock.assert_called_once_with("/fake/path") def test_unlink_ENOENT(self): with mock.patch.object(os, "unlink") as unlink_mock: unlink_mock.side_effect = OSError(errno.ENOENT) utils.unlink_without_raise("/fake/path") unlink_mock.assert_called_once_with("/fake/path") def test_create_link(self): with mock.patch.object(os, "symlink") as symlink_mock: symlink_mock.return_value = None utils.create_link_without_raise("/fake/source", "/fake/link") symlink_mock.assert_called_once_with("/fake/source", "/fake/link") def test_create_link_EEXIST(self): with mock.patch.object(os, "symlink") as symlink_mock: symlink_mock.side_effect = OSError(errno.EEXIST) utils.create_link_without_raise("/fake/source", "/fake/link") symlink_mock.assert_called_once_with("/fake/source", "/fake/link") class ExecuteTestCase(base.TestCase): def test_retry_on_failure(self): fd, tmpfilename = tempfile.mkstemp() _, tmpfilename2 = tempfile.mkstemp() try: fp = os.fdopen(fd, 'w+') fp.write('''#!/bin/sh # If stdin fails to get passed during one of the runs, make a note. if ! grep -q foo then echo 'failure' > "$1" fi # If stdin has failed to get passed during this or a previous run, exit early. if grep failure "$1" then exit 1 fi runs="$(cat $1)" if [ -z "$runs" ] then runs=0 fi runs=$(($runs + 1)) echo $runs > "$1" exit 1 ''') fp.close() os.chmod(tmpfilename, 0o755) self.assertRaises(processutils.ProcessExecutionError, utils.execute, tmpfilename, tmpfilename2, attempts=10, process_input='foo', delay_on_retry=False) fp = open(tmpfilename2, 'r') runs = fp.read() fp.close() self.assertNotEqual(runs.strip(), 'failure', 'stdin did not ' 'always get passed ' 'correctly') runs = int(runs.strip()) self.assertEqual(10, runs, 'Ran %d times instead of 10.' % (runs,)) finally: os.unlink(tmpfilename) os.unlink(tmpfilename2) def test_unknown_kwargs_raises_error(self): self.assertRaises(processutils.UnknownArgumentError, utils.execute, '/usr/bin/env', 'true', this_is_not_a_valid_kwarg=True) def test_check_exit_code_boolean(self): utils.execute('/usr/bin/env', 'false', check_exit_code=False) self.assertRaises(processutils.ProcessExecutionError, utils.execute, '/usr/bin/env', 'false', check_exit_code=True) def test_no_retry_on_success(self): fd, tmpfilename = tempfile.mkstemp() _, tmpfilename2 = tempfile.mkstemp() try: fp = os.fdopen(fd, 'w+') fp.write('''#!/bin/sh # If we've already run, bail out. grep -q foo "$1" && exit 1 # Mark that we've run before. echo foo > "$1" # Check that stdin gets passed correctly. grep foo ''') fp.close() os.chmod(tmpfilename, 0o755) utils.execute(tmpfilename, tmpfilename2, process_input='foo', attempts=2) finally: os.unlink(tmpfilename) os.unlink(tmpfilename2) def test_execute_get_root_helper(self): with mock.patch.object(processutils, 'execute') as execute_mock: helper = utils._get_root_helper() utils.execute('foo', run_as_root=True) execute_mock.assert_called_once_with('foo', run_as_root=True, root_helper=helper) def test_execute_without_root_helper(self): with mock.patch.object(processutils, 'execute') as execute_mock: utils.execute('foo', run_as_root=False) execute_mock.assert_called_once_with('foo', run_as_root=False) class GenericUtilsTestCase(base.TestCase): def test_hostname_unicode_sanitization(self): hostname = u"\u7684.test.example.com" self.assertEqual("test.example.com", utils.sanitize_hostname(hostname)) def test_hostname_sanitize_periods(self): hostname = "....test.example.com..." self.assertEqual("test.example.com", utils.sanitize_hostname(hostname)) def test_hostname_sanitize_dashes(self): hostname = "----test.example.com---" self.assertEqual("test.example.com", utils.sanitize_hostname(hostname)) def test_hostname_sanitize_characters(self): hostname = "(#@&$!(@*--#&91)(__=+--test-host.example!!.com-0+" self.assertEqual("91----test-host.example.com-0", utils.sanitize_hostname(hostname)) def test_hostname_translate(self): hostname = "<}\x1fh\x10e\x08l\x02l\x05o\x12!{>" self.assertEqual("hello", utils.sanitize_hostname(hostname)) def test_read_cached_file(self): with mock.patch.object(os.path, "getmtime") as getmtime_mock: getmtime_mock.return_value = 1 cache_data = {"data": 1123, "mtime": 1} data = utils.read_cached_file("/this/is/a/fake", cache_data) self.assertEqual(cache_data["data"], data) getmtime_mock.assert_called_once_with(mock.ANY) def test_read_modified_cached_file(self): with mock.patch.object(os.path, "getmtime") as getmtime_mock: with mock.patch.object(__builtin__, 'open') as open_mock: getmtime_mock.return_value = 2 fake_contents = "lorem ipsum" fake_file = mock.Mock() fake_file.read.return_value = fake_contents fake_context_manager = mock.MagicMock() fake_context_manager.__enter__.return_value = fake_file fake_context_manager.__exit__.return_value = None open_mock.return_value = fake_context_manager cache_data = {"data": 1123, "mtime": 1} self.reload_called = False def test_reload(reloaded_data): self.assertEqual(fake_contents, reloaded_data) self.reload_called = True data = utils.read_cached_file("/this/is/a/fake", cache_data, reload_func=test_reload) self.assertEqual(fake_contents, data) self.assertTrue(self.reload_called) getmtime_mock.assert_called_once_with(mock.ANY) open_mock.assert_called_once_with(mock.ANY) fake_file.read.called_once_with() fake_context_manager.__exit__.assert_called_once_with(mock.ANY, mock.ANY, mock.ANY) fake_context_manager.__enter__.assert_called_once_with() def test_hash_file(self): data = 'Mary had a little lamb, its fleece as white as snow' flo = six.StringIO(data) h1 = utils.hash_file(flo) h2 = hashlib.sha1(data).hexdigest() self.assertEqual(h1, h2) def test_is_valid_boolstr(self): self.assertTrue(utils.is_valid_boolstr('true')) self.assertTrue(utils.is_valid_boolstr('false')) self.assertTrue(utils.is_valid_boolstr('yes')) self.assertTrue(utils.is_valid_boolstr('no')) self.assertTrue(utils.is_valid_boolstr('y')) self.assertTrue(utils.is_valid_boolstr('n')) self.assertTrue(utils.is_valid_boolstr('1')) self.assertTrue(utils.is_valid_boolstr('0')) self.assertFalse(utils.is_valid_boolstr('maybe')) self.assertFalse(utils.is_valid_boolstr('only on tuesdays')) def test_is_valid_ipv4(self): self.assertTrue(utils.is_valid_ipv4('127.0.0.1')) self.assertFalse(utils.is_valid_ipv4('::1')) self.assertFalse(utils.is_valid_ipv4('bacon')) self.assertFalse(utils.is_valid_ipv4("")) self.assertFalse(utils.is_valid_ipv4(10)) def test_is_valid_ipv6(self): self.assertTrue(utils.is_valid_ipv6("::1")) self.assertTrue(utils.is_valid_ipv6( "abcd:ef01:2345:6789:abcd:ef01:192.168.254.254")) self.assertTrue(utils.is_valid_ipv6( "0000:0000:0000:0000:0000:0000:0000:0001")) self.assertFalse(utils.is_valid_ipv6("foo")) self.assertFalse(utils.is_valid_ipv6("127.0.0.1")) self.assertFalse(utils.is_valid_ipv6("")) self.assertFalse(utils.is_valid_ipv6(10)) def test_is_valid_ipv6_cidr(self): self.assertTrue(utils.is_valid_ipv6_cidr("2600::/64")) self.assertTrue(utils.is_valid_ipv6_cidr( "abcd:ef01:2345:6789:abcd:ef01:192.168.254.254/48")) self.assertTrue(utils.is_valid_ipv6_cidr( "0000:0000:0000:0000:0000:0000:0000:0001/32")) self.assertTrue(utils.is_valid_ipv6_cidr( "0000:0000:0000:0000:0000:0000:0000:0001")) self.assertFalse(utils.is_valid_ipv6_cidr("foo")) self.assertFalse(utils.is_valid_ipv6_cidr("127.0.0.1")) def test_get_shortened_ipv6(self): self.assertEqual("abcd:ef01:2345:6789:abcd:ef01:c0a8:fefe", utils.get_shortened_ipv6( "abcd:ef01:2345:6789:abcd:ef01:192.168.254.254")) self.assertEqual("::1", utils.get_shortened_ipv6( "0000:0000:0000:0000:0000:0000:0000:0001")) self.assertEqual("caca::caca:0:babe:201:102", utils.get_shortened_ipv6( "caca:0000:0000:caca:0000:babe:0201:0102")) self.assertRaises(netaddr.AddrFormatError, utils.get_shortened_ipv6, "127.0.0.1") self.assertRaises(netaddr.AddrFormatError, utils.get_shortened_ipv6, "failure") def test_get_shortened_ipv6_cidr(self): self.assertEqual("2600::/64", utils.get_shortened_ipv6_cidr( "2600:0000:0000:0000:0000:0000:0000:0000/64")) self.assertEqual("2600::/64", utils.get_shortened_ipv6_cidr( "2600::1/64")) self.assertRaises(netaddr.AddrFormatError, utils.get_shortened_ipv6_cidr, "127.0.0.1") self.assertRaises(netaddr.AddrFormatError, utils.get_shortened_ipv6_cidr, "failure") def test_is_valid_mac(self): self.assertTrue(utils.is_valid_mac("52:54:00:cf:2d:31")) self.assertTrue(utils.is_valid_mac(u"52:54:00:cf:2d:31")) self.assertFalse(utils.is_valid_mac("127.0.0.1")) self.assertFalse(utils.is_valid_mac("not:a:mac:address")) self.assertFalse(utils.is_valid_mac("52-54-00-cf-2d-31")) self.assertFalse(utils.is_valid_mac("aa bb cc dd ee ff")) self.assertTrue(utils.is_valid_mac("AA:BB:CC:DD:EE:FF")) self.assertFalse(utils.is_valid_mac("AA BB CC DD EE FF")) self.assertFalse(utils.is_valid_mac("AA-BB-CC-DD-EE-FF")) def test_validate_and_normalize_mac(self): mac = 'AA:BB:CC:DD:EE:FF' with mock.patch.object(utils, 'is_valid_mac') as m_mock: m_mock.return_value = True self.assertEqual(mac.lower(), utils.validate_and_normalize_mac(mac)) def test_validate_and_normalize_mac_invalid_format(self): with mock.patch.object(utils, 'is_valid_mac') as m_mock: m_mock.return_value = False self.assertRaises(exception.InvalidMAC, utils.validate_and_normalize_mac, 'invalid-mac') def test_safe_rstrip(self): value = '/test/' rstripped_value = '/test' not_rstripped = '/' self.assertEqual(rstripped_value, utils.safe_rstrip(value, '/')) self.assertEqual(not_rstripped, utils.safe_rstrip(not_rstripped, '/')) def test_safe_rstrip_not_raises_exceptions(self): # Supplying an integer should normally raise an exception because it # does not save the rstrip() method. value = 10 # In the case of raising an exception safe_rstrip() should return the # original value. self.assertEqual(value, utils.safe_rstrip(value)) class MkfsTestCase(base.TestCase): def test_mkfs(self): with mock.patch.object(utils, 'execute') as execute_mock: utils.mkfs('ext4', '/my/block/dev') utils.mkfs('msdos', '/my/msdos/block/dev') utils.mkfs('swap', '/my/swap/block/dev') expected = [mock.call('mkfs', '-t', 'ext4', '-F', '/my/block/dev', run_as_root=True), mock.call('mkfs', '-t', 'msdos', '/my/msdos/block/dev', run_as_root=True), mock.call('mkswap', '/my/swap/block/dev', run_as_root=True)] self.assertEqual(expected, execute_mock.call_args_list) def test_mkfs_with_label(self): with mock.patch.object(utils, 'execute') as execute_mock: utils.mkfs('ext4', '/my/block/dev', 'ext4-vol') utils.mkfs('msdos', '/my/msdos/block/dev', 'msdos-vol') utils.mkfs('swap', '/my/swap/block/dev', 'swap-vol') expected = [mock.call('mkfs', '-t', 'ext4', '-F', '-L', 'ext4-vol', '/my/block/dev', run_as_root=True), mock.call('mkfs', '-t', 'msdos', '-n', 'msdos-vol', '/my/msdos/block/dev', run_as_root=True), mock.call('mkswap', '-L', 'swap-vol', '/my/swap/block/dev', run_as_root=True)] self.assertEqual(expected, execute_mock.call_args_list) class IntLikeTestCase(base.TestCase): def test_is_int_like(self): self.assertTrue(utils.is_int_like(1)) self.assertTrue(utils.is_int_like("1")) self.assertTrue(utils.is_int_like("514")) self.assertTrue(utils.is_int_like("0")) self.assertFalse(utils.is_int_like(1.1)) self.assertFalse(utils.is_int_like("1.1")) self.assertFalse(utils.is_int_like("1.1.1")) self.assertFalse(utils.is_int_like(None)) self.assertFalse(utils.is_int_like("0.")) self.assertFalse(utils.is_int_like("aaaaaa")) self.assertFalse(utils.is_int_like("....")) self.assertFalse(utils.is_int_like("1g")) self.assertFalse( utils.is_int_like("0cc3346e-9fef-4445-abe6-5d2b2690ec64")) self.assertFalse(utils.is_int_like("a1")) class UUIDTestCase(base.TestCase): def test_generate_uuid(self): uuid_string = utils.generate_uuid() self.assertIsInstance(uuid_string, str) self.assertEqual(36, len(uuid_string)) # make sure there are 4 dashes self.assertEqual(32, len(uuid_string.replace('-', ''))) def test_is_uuid_like(self): self.assertTrue(utils.is_uuid_like(str(uuid.uuid4()))) def test_id_is_uuid_like(self): self.assertFalse(utils.is_uuid_like(1234567)) def test_name_is_uuid_like(self): self.assertFalse(utils.is_uuid_like('zhongyueluo')) ironic-2014.1.rc1/ironic/tests/test_images.py0000664000175300017540000000771312316614116022221 0ustar jenkinsjenkins00000000000000# Vim: tabstop=4 shiftwidth=4 softtabstop=4 # coding=utf-8 # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 contextlib import fixtures from ironic.common import exception from ironic.common import images from ironic.openstack.common import excutils from ironic.tests import base class IronicImagesTestCase(base.TestCase): def test_fetch_raw_image(self): def fake_execute(*cmd, **kwargs): self.executes.append(cmd) return None, None def fake_rename(old, new): self.executes.append(('mv', old, new)) def fake_unlink(path): self.executes.append(('rm', path)) @contextlib.contextmanager def fake_rm_on_error(path): try: yield except Exception: with excutils.save_and_reraise_exception(): fake_del_if_exists(path) def fake_del_if_exists(path): self.executes.append(('rm', '-f', path)) def fake_qemu_img_info(path): class FakeImgInfo(object): pass file_format = path.split('.')[-1] if file_format == 'part': file_format = path.split('.')[-2] elif file_format == 'converted': file_format = 'raw' if 'backing' in path: backing_file = 'backing' else: backing_file = None FakeImgInfo.file_format = file_format FakeImgInfo.backing_file = backing_file return FakeImgInfo() self.useFixture(fixtures.MonkeyPatch( 'ironic.common.utils.execute', fake_execute)) self.useFixture(fixtures.MonkeyPatch('os.rename', fake_rename)) self.useFixture(fixtures.MonkeyPatch('os.unlink', fake_unlink)) self.useFixture(fixtures.MonkeyPatch( 'ironic.common.images.fetch', lambda *_: None)) self.useFixture(fixtures.MonkeyPatch( 'ironic.common.images.qemu_img_info', fake_qemu_img_info)) self.useFixture(fixtures.MonkeyPatch( 'ironic.openstack.common.fileutils.remove_path_on_error', fake_rm_on_error)) self.useFixture(fixtures.MonkeyPatch( 'ironic.openstack.common.fileutils.delete_if_exists', fake_del_if_exists)) context = 'opaque context' image_id = '4' target = 't.qcow2' self.executes = [] expected_commands = [('qemu-img', 'convert', '-O', 'raw', 't.qcow2.part', 't.qcow2.converted'), ('rm', 't.qcow2.part'), ('mv', 't.qcow2.converted', 't.qcow2')] images.fetch_to_raw(context, image_id, target) self.assertEqual(expected_commands, self.executes) target = 't.raw' self.executes = [] expected_commands = [('mv', 't.raw.part', 't.raw')] images.fetch_to_raw(context, image_id, target) self.assertEqual(expected_commands, self.executes) target = 'backing.qcow2' self.executes = [] expected_commands = [('rm', '-f', 'backing.qcow2.part')] self.assertRaises(exception.ImageUnacceptable, images.fetch_to_raw, context, image_id, target) self.assertEqual(expected_commands, self.executes) del self.executes ironic-2014.1.rc1/ironic/tests/test_hash_ring.py0000664000175300017540000001142712316614116022713 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 ironic.common import exception from ironic.common import hash_ring as hash from ironic.tests import base CONF = cfg.CONF class HashRingTestCase(base.TestCase): # NOTE(deva): the mapping used in these tests is as follows: # if hosts = [foo, bar]: # fake -> foo, bar # if hosts = [foo, bar, baz]: # fake -> foo, bar, baz # fake-again -> bar, baz, foo def test_create_ring(self): hosts = ['foo', 'bar'] replicas = 2 ring = hash.HashRing(hosts, replicas=replicas) self.assertEqual(hosts, ring.hosts) self.assertEqual(replicas, ring.replicas) def test_create_with_different_partition_counts(self): hosts = ['foo', 'bar'] CONF.set_override('hash_partition_exponent', 2) ring = hash.HashRing(hosts) self.assertEqual(2 ** 2, len(ring.part2host)) CONF.set_override('hash_partition_exponent', 8) ring = hash.HashRing(hosts) self.assertEqual(2 ** 8, len(ring.part2host)) CONF.set_override('hash_partition_exponent', 16) ring = hash.HashRing(hosts) self.assertEqual(2 ** 16, len(ring.part2host)) def test_distribution_one_replica(self): hosts = ['foo', 'bar', 'baz'] ring = hash.HashRing(hosts, replicas=1) self.assertEqual(['foo'], ring.get_hosts('fake')) self.assertEqual(['bar'], ring.get_hosts('fake-again')) def test_distribution_two_replicas(self): hosts = ['foo', 'bar', 'baz'] ring = hash.HashRing(hosts, replicas=2) self.assertEqual(['foo', 'bar'], ring.get_hosts('fake')) self.assertEqual(['bar', 'baz'], ring.get_hosts('fake-again')) def test_distribution_three_replicas(self): hosts = ['foo', 'bar', 'baz'] ring = hash.HashRing(hosts, replicas=3) self.assertEqual(['foo', 'bar', 'baz'], ring.get_hosts('fake')) self.assertEqual(['bar', 'baz', 'foo'], ring.get_hosts('fake-again')) def test_ignore_hosts(self): hosts = ['foo', 'bar', 'baz'] ring = hash.HashRing(hosts, replicas=1) self.assertEqual(['bar'], ring.get_hosts('fake', ignore_hosts=['foo'])) self.assertEqual(['baz'], ring.get_hosts('fake', ignore_hosts=['foo', 'bar'])) self.assertEqual([], ring.get_hosts('fake', ignore_hosts=hosts)) def test_ignore_hosts_with_replicas(self): hosts = ['foo', 'bar', 'baz'] ring = hash.HashRing(hosts, replicas=2) self.assertEqual(['bar', 'baz'], ring.get_hosts('fake', ignore_hosts=['foo'])) self.assertEqual(['baz'], ring.get_hosts('fake', ignore_hosts=['foo', 'bar'])) self.assertEqual(['baz', 'foo'], ring.get_hosts('fake-again', ignore_hosts=['bar'])) self.assertEqual(['foo'], ring.get_hosts('fake-again', ignore_hosts=['bar', 'baz'])) self.assertEqual([], ring.get_hosts('fake', ignore_hosts=hosts)) def test_more_replicas_than_hosts(self): hosts = ['foo', 'bar'] ring = hash.HashRing(hosts, replicas=10) self.assertEqual(hosts, ring.get_hosts('fake')) def test_ignore_non_existent_host(self): hosts = ['foo', 'bar'] ring = hash.HashRing(hosts, replicas=1) self.assertEqual(['foo'], ring.get_hosts('fake', ignore_hosts=['baz'])) def test_create_ring_invalid_data(self): hosts = None self.assertRaises(exception.Invalid, hash.HashRing, hosts) def test_get_hosts_invalid_data(self): hosts = ['foo', 'bar'] ring = hash.HashRing(hosts) self.assertRaises(exception.Invalid, ring.get_hosts, None) ironic-2014.1.rc1/ironic/tests/db/0000775000175300017540000000000012316614636017727 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/tests/db/test_nodes.py0000664000175300017540000004102212316614116022440 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """Tests for manipulating Nodes via the DB API""" import datetime import mock import six from ironic.common import exception from ironic.common import utils as ironic_utils from ironic.db import api as dbapi from ironic.openstack.common import timeutils from ironic.tests.db import base from ironic.tests.db import utils class DbNodeTestCase(base.DbTestCase): def setUp(self): super(DbNodeTestCase, self).setUp() self.dbapi = dbapi.get_instance() def _create_test_node(self, **kwargs): n = utils.get_test_node(**kwargs) self.dbapi.create_node(n) return n def _create_many_test_nodes(self): uuids = [] for i in range(1, 6): n = self._create_test_node(id=i, uuid=ironic_utils.generate_uuid()) uuids.append(n['uuid']) uuids.sort() return uuids def _create_associated_nodes(self): uuids = [] uuids_with_instance = [] for i in range(1, 5): uuid = ironic_utils.generate_uuid() uuids.append(six.text_type(uuid)) if i < 3: instance_uuid = ironic_utils.generate_uuid() uuids_with_instance.append(six.text_type(uuid)) else: instance_uuid = None n = utils.get_test_node(id=i, uuid=uuid, instance_uuid=instance_uuid) self.dbapi.create_node(n) uuids.sort() uuids_with_instance.sort() return (uuids, uuids_with_instance) def test_create_node(self): self._create_test_node() def test_create_node_nullable_chassis_id(self): n = utils.get_test_node() del n['chassis_id'] self.dbapi.create_node(n) def test_get_node_by_id(self): n = self._create_test_node() res = self.dbapi.get_node(n['id']) self.assertEqual(n['uuid'], res.uuid) def test_get_node_by_uuid(self): n = self._create_test_node() res = self.dbapi.get_node(n['uuid']) self.assertEqual(n['id'], res.id) def test_get_node_that_does_not_exist(self): self.assertRaises(exception.NodeNotFound, self.dbapi.get_node, 99) self.assertRaises(exception.NodeNotFound, self.dbapi.get_node, '12345678-9999-0000-aaaa-123456789012') self.assertRaises(exception.InvalidIdentity, self.dbapi.get_node, 'not-a-uuid') def test_get_nodeinfo_list_defaults(self): for i in range(1, 6): n = utils.get_test_node(id=i, uuid=ironic_utils.generate_uuid()) self.dbapi.create_node(n) res = [i[0] for i in self.dbapi.get_nodeinfo_list()] self.assertEqual(sorted(res), sorted(range(1, 6))) def test_get_nodeinfo_list_with_cols(self): uuids = {} extras = {} for i in range(1, 6): uuid = ironic_utils.generate_uuid() extra = {'foo': i} uuids[i] = uuid extras[i] = extra n = utils.get_test_node(id=i, extra=extra, uuid=uuid) self.dbapi.create_node(n) res = self.dbapi.get_nodeinfo_list(columns=['id', 'extra', 'uuid']) self.assertEqual(extras, dict((r[0], r[1]) for r in res)) self.assertEqual(uuids, dict((r[0], r[2]) for r in res)) def test_get_nodeinfo_list_with_filters(self): n1 = utils.get_test_node(id=1, driver='driver-one', instance_uuid=ironic_utils.generate_uuid(), reservation='fake-host', uuid=ironic_utils.generate_uuid()) n2 = utils.get_test_node(id=2, driver='driver-two', uuid=ironic_utils.generate_uuid(), maintenance=True) self.dbapi.create_node(n1) self.dbapi.create_node(n2) res = self.dbapi.get_nodeinfo_list(filters={'driver': 'driver-one'}) self.assertEqual([1], [r[0] for r in res]) res = self.dbapi.get_nodeinfo_list(filters={'driver': 'bad-driver'}) self.assertEqual([], [r[0] for r in res]) res = self.dbapi.get_nodeinfo_list(filters={'associated': True}) self.assertEqual([1], [r[0] for r in res]) res = self.dbapi.get_nodeinfo_list(filters={'associated': False}) self.assertEqual([2], [r[0] for r in res]) res = self.dbapi.get_nodeinfo_list(filters={'reserved': True}) self.assertEqual([1], [r[0] for r in res]) res = self.dbapi.get_nodeinfo_list(filters={'reserved': False}) self.assertEqual([2], [r[0] for r in res]) res = self.dbapi.get_node_list(filters={'maintenance': True}) self.assertEqual([2], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'maintenance': False}) self.assertEqual([1], [r.id for r in res]) def test_get_node_list(self): uuids = [] for i in range(1, 6): n = utils.get_test_node(id=i, uuid=ironic_utils.generate_uuid()) self.dbapi.create_node(n) uuids.append(six.text_type(n['uuid'])) res = self.dbapi.get_node_list() res_uuids = [r.uuid for r in res] self.assertEqual(uuids.sort(), res_uuids.sort()) def test_get_node_list_with_filters(self): ch1 = utils.get_test_chassis(id=1, uuid=ironic_utils.generate_uuid()) ch2 = utils.get_test_chassis(id=2, uuid=ironic_utils.generate_uuid()) self.dbapi.create_chassis(ch1) self.dbapi.create_chassis(ch2) n1 = utils.get_test_node(id=1, driver='driver-one', instance_uuid=ironic_utils.generate_uuid(), reservation='fake-host', uuid=ironic_utils.generate_uuid(), chassis_id=ch1['id']) n2 = utils.get_test_node(id=2, driver='driver-two', uuid=ironic_utils.generate_uuid(), chassis_id=ch2['id'], maintenance=True) self.dbapi.create_node(n1) self.dbapi.create_node(n2) res = self.dbapi.get_node_list(filters={'chassis_uuid': ch1['uuid']}) self.assertEqual([1], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'chassis_uuid': ch2['uuid']}) self.assertEqual([2], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'driver': 'driver-one'}) self.assertEqual([1], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'driver': 'bad-driver'}) self.assertEqual([], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'associated': True}) self.assertEqual([1], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'associated': False}) self.assertEqual([2], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'reserved': True}) self.assertEqual([1], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'reserved': False}) self.assertEqual([2], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'maintenance': True}) self.assertEqual([2], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'maintenance': False}) self.assertEqual([1], [r.id for r in res]) def test_get_node_list_chassis_not_found(self): self.assertRaises(exception.ChassisNotFound, self.dbapi.get_node_list, {'chassis_uuid': ironic_utils.generate_uuid()}) def test_get_node_by_instance(self): n = self._create_test_node( instance_uuid='12345678-9999-0000-aaaa-123456789012') res = self.dbapi.get_node_by_instance(n['instance_uuid']) self.assertEqual(n['uuid'], res.uuid) def test_get_node_by_instance_wrong_uuid(self): self._create_test_node( instance_uuid='12345678-9999-0000-aaaa-123456789012') self.assertRaises(exception.InstanceNotFound, self.dbapi.get_node_by_instance, '12345678-9999-0000-bbbb-123456789012') def test_get_node_by_instance_invalid_uuid(self): self.assertRaises(exception.InvalidUUID, self.dbapi.get_node_by_instance, 'fake_uuid') def test_destroy_node(self): n = self._create_test_node() self.dbapi.destroy_node(n['id']) self.assertRaises(exception.NodeNotFound, self.dbapi.get_node, n['id']) def test_destroy_node_by_uuid(self): n = self._create_test_node() self.dbapi.destroy_node(n['uuid']) self.assertRaises(exception.NodeNotFound, self.dbapi.get_node, n['uuid']) def test_destroy_node_that_does_not_exist(self): self.assertRaises(exception.NodeNotFound, self.dbapi.destroy_node, '12345678-9999-0000-aaaa-123456789012') def test_ports_get_destroyed_after_destroying_a_node(self): n = self._create_test_node() node_id = n['id'] p = utils.get_test_port(node_id=node_id) p = self.dbapi.create_port(p) self.dbapi.destroy_node(node_id) self.assertRaises(exception.PortNotFound, self.dbapi.get_port, p.id) def test_ports_get_destroyed_after_destroying_a_node_by_uuid(self): n = self._create_test_node() node_id = n['id'] p = utils.get_test_port(node_id=node_id) p = self.dbapi.create_port(p) self.dbapi.destroy_node(n['uuid']) self.assertRaises(exception.PortNotFound, self.dbapi.get_port, p.id) def test_update_node(self): n = self._create_test_node() old_extra = n['extra'] new_extra = {'foo': 'bar'} self.assertNotEqual(old_extra, new_extra) res = self.dbapi.update_node(n['id'], {'extra': new_extra}) self.assertEqual(new_extra, res.extra) def test_update_node_not_found(self): node_uuid = ironic_utils.generate_uuid() new_extra = {'foo': 'bar'} self.assertRaises(exception.NodeNotFound, self.dbapi.update_node, node_uuid, {'extra': new_extra}) def test_update_node_associate_and_disassociate(self): n = self._create_test_node() new_i_uuid = ironic_utils.generate_uuid() res = self.dbapi.update_node(n['id'], {'instance_uuid': new_i_uuid}) self.assertEqual(new_i_uuid, res.instance_uuid) res = self.dbapi.update_node(n['id'], {'instance_uuid': None}) self.assertIsNone(res.instance_uuid) def test_update_node_already_assosicated(self): n = self._create_test_node() new_i_uuid_one = ironic_utils.generate_uuid() self.dbapi.update_node(n['id'], {'instance_uuid': new_i_uuid_one}) new_i_uuid_two = ironic_utils.generate_uuid() self.assertRaises(exception.NodeAssociated, self.dbapi.update_node, n['id'], {'instance_uuid': new_i_uuid_two}) @mock.patch.object(timeutils, 'utcnow') def test_update_node_provision(self, mock_utcnow): mocked_time = datetime.datetime(2000, 1, 1, 0, 0) mock_utcnow.return_value = mocked_time n = self._create_test_node() res = self.dbapi.update_node(n['id'], {'provision_state': 'fake'}) self.assertEqual(mocked_time, timeutils.normalize_time(res['provision_updated_at'])) def test_update_node_no_provision(self): n = self._create_test_node() res = self.dbapi.update_node(n['id'], {'extra': {'foo': 'bar'}}) self.assertIsNone(res['provision_updated_at']) def test_reserve_one_node(self): n = self._create_test_node() uuid = n['uuid'] r1 = 'fake-reservation' # reserve the node self.dbapi.reserve_nodes(r1, [uuid]) # check reservation res = self.dbapi.get_node(uuid) self.assertEqual(r1, res.reservation) def test_release_reservation(self): n = self._create_test_node() uuid = n['uuid'] r1 = 'fake-reservation' self.dbapi.reserve_nodes(r1, [uuid]) # release reservation self.dbapi.release_nodes(r1, [uuid]) res = self.dbapi.get_node(uuid) self.assertIsNone(res.reservation) def test_reservation_of_reserved_node_fails(self): n = self._create_test_node() uuid = n['uuid'] r1 = 'fake-reservation' r2 = 'another-reservation' # reserve the node self.dbapi.reserve_nodes(r1, [uuid]) # another host fails to reserve or release self.assertRaises(exception.NodeLocked, self.dbapi.reserve_nodes, r2, [uuid]) self.assertRaises(exception.NodeLocked, self.dbapi.release_nodes, r2, [uuid]) def test_reservation_after_release(self): n = self._create_test_node() uuid = n['uuid'] r1 = 'fake-reservation' r2 = 'another-reservation' self.dbapi.reserve_nodes(r1, [uuid]) self.dbapi.release_nodes(r1, [uuid]) # another host succeeds self.dbapi.reserve_nodes(r2, [uuid]) res = self.dbapi.get_node(uuid) self.assertEqual(r2, res.reservation) def test_reserve_many_nodes(self): uuids = self._create_many_test_nodes() r1 = 'first-reservation' self.dbapi.reserve_nodes(r1, uuids) for uuid in uuids: res = self.dbapi.get_node(uuid) self.assertEqual(r1, res.reservation) def test_reserve_overlaping_ranges_fails(self): uuids = self._create_many_test_nodes() r1 = 'first-reservation' r2 = 'second-reservation' self.dbapi.reserve_nodes(r1, uuids[:3]) self.assertRaises(exception.NodeLocked, self.dbapi.reserve_nodes, r2, uuids) self.assertRaises(exception.NodeLocked, self.dbapi.reserve_nodes, r2, uuids[2:]) def test_reserve_non_overlaping_ranges(self): uuids = self._create_many_test_nodes() r1 = 'first-reservation' r2 = 'second-reservation' self.dbapi.reserve_nodes(r1, uuids[:3]) self.dbapi.reserve_nodes(r2, uuids[3:]) for i in range(0, len(uuids)): res = self.dbapi.get_node(uuids[i]) reservation = r1 if i < 3 else r2 self.assertEqual(reservation, res.reservation) def test_reserve_empty(self): self.assertRaises(exception.InvalidIdentity, self.dbapi.reserve_nodes, 'reserv1', []) def test_reservation_in_exception_message(self): n = self._create_test_node() uuid = n['uuid'] r = 'fake-reservation' self.dbapi.reserve_nodes(r, [uuid]) try: self.dbapi.reserve_nodes('another', [uuid]) except exception.NodeLocked as e: self.assertIn(r, str(e)) def test_release_overlaping_ranges_fails(self): uuids = self._create_many_test_nodes() r1 = 'first-reservation' r2 = 'second-reservation' self.dbapi.reserve_nodes(r1, uuids[:3]) self.dbapi.reserve_nodes(r2, uuids[3:]) self.assertRaises(exception.NodeLocked, self.dbapi.release_nodes, r1, uuids) def test_release_non_ranges(self): uuids = self._create_many_test_nodes() r1 = 'first-reservation' r2 = 'second-reservation' self.dbapi.reserve_nodes(r1, uuids[:3]) self.dbapi.reserve_nodes(r2, uuids[3:]) self.dbapi.release_nodes(r1, uuids[:3]) self.dbapi.release_nodes(r2, uuids[3:]) for uuid in uuids: res = self.dbapi.get_node(uuid) self.assertIsNone(res.reservation) ironic-2014.1.rc1/ironic/tests/db/base.py0000664000175300017540000000162512316614116021210 0ustar jenkinsjenkins00000000000000# Copyright (c) 2012 NTT DOCOMO, INC. # 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. """Ironic DB test base class.""" from ironic.openstack.common import context as ironic_context from ironic.tests import base class DbTestCase(base.TestCase): def setUp(self): super(DbTestCase, self).setUp() self.context = ironic_context.get_admin_context() ironic-2014.1.rc1/ironic/tests/db/utils.py0000664000175300017540000001032112316614116021427 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """Ironic test utilities.""" from ironic.common import states def get_test_ipmi_info(): return { "ipmi_address": "1.2.3.4", "ipmi_username": "admin", "ipmi_password": "fake", } def get_test_ssh_info(auth_type='password'): result = { "ssh_address": "1.2.3.4", "ssh_username": "admin", "ssh_port": 22, "ssh_virt_type": "vbox", } if 'password' == auth_type: result['ssh_password'] = 'fake' elif 'file' == auth_type: result['ssh_key_filename'] = '/not/real/file' elif 'key' == auth_type: result['ssh_key_contents'] = '--BEGIN PRIVATE ...blah' elif 'too_many' == auth_type: result['ssh_password'] = 'fake' result['ssh_key_filename'] = '/not/real/file' else: # No auth details (is invalid) pass return result def get_test_pxe_info(): return { "pxe_image_source": "glance://image_uuid", "pxe_deploy_kernel": "glance://deploy_kernel_uuid", "pxe_deploy_ramdisk": "glance://deploy_ramdisk_uuid", "pxe_root_gb": 100, } def get_test_seamicro_info(): return { "seamicro_api_endpoint": "http://1.2.3.4", "seamicro_username": "admin", "seamicro_password": "fake", "seamicro_server_id": "0/0", } def get_test_node(**kw): properties = { "cpu_arch": "x86_64", "cpu_num": "8", "storage": "1024", "memory": "4096", } fake_info = {"foo": "bar"} return { 'id': kw.get('id', 123), 'uuid': kw.get('uuid', '1be26c0b-03f2-4d2e-ae87-c02d7f33c123'), 'chassis_id': kw.get('chassis_id', 42), 'power_state': kw.get('power_state', states.NOSTATE), 'target_power_state': kw.get('target_power_state', states.NOSTATE), 'provision_state': kw.get('provision_state', states.NOSTATE), 'target_provision_state': kw.get('target_provision_state', states.NOSTATE), 'provision_updated_at': kw.get('provision_updated_at'), 'last_error': kw.get('last_error'), 'instance_uuid': kw.get('instance_uuid'), 'driver': kw.get('driver', 'fake'), 'driver_info': kw.get('driver_info', fake_info), 'properties': kw.get('properties', properties), 'reservation': kw.get('reservation'), 'maintenance': kw.get('maintenance', False), 'console_enabled': kw.get('console_enabled', False), 'extra': kw.get('extra', {}), 'updated_at': kw.get('created_at'), 'created_at': kw.get('updated_at'), } def get_test_port(**kw): return { 'id': kw.get('id', 987), 'uuid': kw.get('uuid', '1be26c0b-03f2-4d2e-ae87-c02d7f33c781'), 'node_id': kw.get('node_id', 123), 'address': kw.get('address', '52:54:00:cf:2d:31'), 'extra': kw.get('extra', {}), 'created_at': kw.get('created_at'), 'updated_at': kw.get('updated_at'), } def get_test_chassis(**kw): return { 'id': kw.get('id', 42), 'uuid': kw.get('uuid', 'e74c40e0-d825-11e2-a28f-0800200c9a66'), 'extra': kw.get('extra', {}), 'description': kw.get('description', 'data-center-1-chassis'), 'created_at': kw.get('created_at'), 'updated_at': kw.get('updated_at'), } def get_test_conductor(**kw): return { 'id': kw.get('id', 6), 'hostname': kw.get('hostname', 'test-conductor-node'), 'drivers': kw.get('drivers', ['fake-driver', 'null-driver']), 'created_at': kw.get('created_at'), 'updated_at': kw.get('updated_at'), } ironic-2014.1.rc1/ironic/tests/db/test_conductor.py0000664000175300017540000001452412316614116023337 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """Tests for manipulating Conductors via the DB API""" import datetime import mock from ironic.common import exception from ironic.db import api as dbapi from ironic.openstack.common import timeutils from ironic.tests.db import base from ironic.tests.db import utils class DbConductorTestCase(base.DbTestCase): def setUp(self): super(DbConductorTestCase, self).setUp() self.dbapi = dbapi.get_instance() def _create_test_cdr(self, **kwargs): c = utils.get_test_conductor(**kwargs) return self.dbapi.register_conductor(c) def test_register_conductor(self): self._create_test_cdr(id=1) self.assertRaises( exception.ConductorAlreadyRegistered, self._create_test_cdr, id=2) def test_get_conductor(self): c1 = self._create_test_cdr() c2 = self.dbapi.get_conductor(c1.hostname) self.assertEqual(c1.id, c2.id) def test_get_conductor_not_found(self): self._create_test_cdr() self.assertRaises( exception.ConductorNotFound, self.dbapi.get_conductor, 'bad-hostname') def test_unregister_conductor(self): c = self._create_test_cdr() self.dbapi.unregister_conductor(c.hostname) self.assertRaises( exception.ConductorNotFound, self.dbapi.unregister_conductor, c.hostname) @mock.patch.object(timeutils, 'utcnow') def test_touch_conductor(self, mock_utcnow): test_time = datetime.datetime(2000, 1, 1, 0, 0) mock_utcnow.return_value = test_time c = self._create_test_cdr(updated_at=test_time) self.assertEqual(test_time, timeutils.normalize_time(c.updated_at)) test_time = datetime.datetime(2000, 1, 1, 0, 1) mock_utcnow.return_value = test_time self.dbapi.touch_conductor(c.hostname) c = self.dbapi.get_conductor(c.hostname) self.assertEqual(test_time, timeutils.normalize_time(c.updated_at)) def test_touch_conductor_not_found(self): self._create_test_cdr() self.assertRaises( exception.ConductorNotFound, self.dbapi.touch_conductor, 'bad-hostname') @mock.patch.object(timeutils, 'utcnow') def test_get_active_driver_dict_one_host_no_driver(self, mock_utcnow): h = 'fake-host' expected = {} mock_utcnow.return_value = datetime.datetime.utcnow() self._create_test_cdr(hostname=h, drivers=[]) result = self.dbapi.get_active_driver_dict() self.assertEqual(expected, result) @mock.patch.object(timeutils, 'utcnow') def test_get_active_driver_dict_one_host_one_driver(self, mock_utcnow): h = 'fake-host' d = 'fake-driver' expected = {d: set([h])} mock_utcnow.return_value = datetime.datetime.utcnow() self._create_test_cdr(hostname=h, drivers=[d]) result = self.dbapi.get_active_driver_dict() self.assertEqual(expected, result) @mock.patch.object(timeutils, 'utcnow') def test_get_active_driver_dict_one_host_many_drivers(self, mock_utcnow): h = 'fake-host' d1 = 'driver-one' d2 = 'driver-two' expected = {d1: set([h]), d2: set([h])} mock_utcnow.return_value = datetime.datetime.utcnow() self._create_test_cdr(hostname=h, drivers=[d1, d2]) result = self.dbapi.get_active_driver_dict() self.assertEqual(expected, result) @mock.patch.object(timeutils, 'utcnow') def test_get_active_driver_dict_many_hosts_one_driver(self, mock_utcnow): h1 = 'host-one' h2 = 'host-two' d = 'fake-driver' expected = {d: set([h1, h2])} mock_utcnow.return_value = datetime.datetime.utcnow() self._create_test_cdr(id=1, hostname=h1, drivers=[d]) self._create_test_cdr(id=2, hostname=h2, drivers=[d]) result = self.dbapi.get_active_driver_dict() self.assertEqual(expected, result) @mock.patch.object(timeutils, 'utcnow') def test_get_active_driver_dict_many_hosts_and_drivers(self, mock_utcnow): h1 = 'host-one' h2 = 'host-two' h3 = 'host-three' d1 = 'driver-one' d2 = 'driver-two' expected = {d1: set([h1, h2]), d2: set([h2, h3])} mock_utcnow.return_value = datetime.datetime.utcnow() self._create_test_cdr(id=1, hostname=h1, drivers=[d1]) self._create_test_cdr(id=2, hostname=h2, drivers=[d1, d2]) self._create_test_cdr(id=3, hostname=h3, drivers=[d2]) result = self.dbapi.get_active_driver_dict() self.assertEqual(expected, result) @mock.patch.object(timeutils, 'utcnow') def test_get_active_driver_dict_with_old_conductor(self, mock_utcnow): past = datetime.datetime(2000, 1, 1, 0, 0) present = past + datetime.timedelta(minutes=2) d = 'common-driver' h1 = 'old-host' d1 = 'old-driver' mock_utcnow.return_value = past self._create_test_cdr(id=1, hostname=h1, drivers=[d, d1]) h2 = 'new-host' d2 = 'new-driver' mock_utcnow.return_value = present self._create_test_cdr(id=2, hostname=h2, drivers=[d, d2]) # verify that old-host does not show up in current list one_minute = 60 expected = {d: set([h2]), d2: set([h2])} result = self.dbapi.get_active_driver_dict(interval=one_minute) self.assertEqual(expected, result) # change the interval, and verify that old-host appears two_minute = one_minute * 2 expected = {d: set([h1, h2]), d1: set([h1]), d2: set([h2])} result = self.dbapi.get_active_driver_dict(interval=two_minute) self.assertEqual(expected, result) ironic-2014.1.rc1/ironic/tests/db/test_chassis.py0000664000175300017540000000657012316614116022776 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """Tests for manipulating Chassis via the DB API""" import six from ironic.common import exception from ironic.common import utils as ironic_utils from ironic.db import api as dbapi from ironic.tests.db import base from ironic.tests.db import utils class DbChassisTestCase(base.DbTestCase): def setUp(self): super(DbChassisTestCase, self).setUp() self.dbapi = dbapi.get_instance() def _create_test_chassis(self, **kwargs): ch = utils.get_test_chassis(**kwargs) self.dbapi.create_chassis(ch) return ch def _create_test_node(self, **kwargs): node = utils.get_test_node(**kwargs) return self.dbapi.create_node(node) def test_get_chassis_list(self): uuids = [] for i in range(1, 6): n = utils.get_test_chassis(id=i, uuid=ironic_utils.generate_uuid()) self.dbapi.create_chassis(n) uuids.append(six.text_type(n['uuid'])) res = self.dbapi.get_chassis_list() res_uuids = [r.uuid for r in res] self.assertEqual(uuids.sort(), res_uuids.sort()) def test_get_chassis_by_id(self): ch = self._create_test_chassis() chassis = self.dbapi.get_chassis(ch['id']) self.assertEqual(ch['uuid'], chassis.uuid) def test_get_chassis_by_uuid(self): ch = self._create_test_chassis() chassis = self.dbapi.get_chassis(ch['uuid']) self.assertEqual(ch['id'], chassis.id) def test_get_chassis_that_does_not_exist(self): self.assertRaises(exception.ChassisNotFound, self.dbapi.get_chassis, 666) def test_update_chassis(self): ch = self._create_test_chassis() new_uuid = ironic_utils.generate_uuid() ch['uuid'] = new_uuid res = self.dbapi.update_chassis(ch['id'], {'uuid': new_uuid}) self.assertEqual(new_uuid, res.uuid) def test_update_chassis_that_does_not_exist(self): new_uuid = ironic_utils.generate_uuid() self.assertRaises(exception.ChassisNotFound, self.dbapi.update_chassis, 666, {'uuid': new_uuid}) def test_destroy_chassis(self): ch = self._create_test_chassis() self.dbapi.destroy_chassis(ch['id']) self.assertRaises(exception.ChassisNotFound, self.dbapi.get_chassis, ch['id']) def test_destroy_chassis_that_does_not_exist(self): self.assertRaises(exception.ChassisNotFound, self.dbapi.destroy_chassis, 666) def test_destroy_chassis_with_nodes(self): ch = self._create_test_chassis() self._create_test_node(chassis_id=ch['id']) self.assertRaises(exception.ChassisNotEmpty, self.dbapi.destroy_chassis, ch['id']) ironic-2014.1.rc1/ironic/tests/db/__init__.py0000664000175300017540000000125012316614116022027 0ustar jenkinsjenkins00000000000000# Copyright (c) 2012 NTT DOCOMO, INC. # All Rights Reserved. # flake8: noqa # # 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.tests.db import * ironic-2014.1.rc1/ironic/tests/db/test_ports.py0000664000175300017540000001232112316614116022477 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """Tests for manipulating Ports via the DB API""" import six from ironic.common import exception from ironic.common import utils as ironic_utils from ironic.db import api as dbapi from ironic.tests.db import base from ironic.tests.db import utils as db_utils class DbPortTestCase(base.DbTestCase): def setUp(self): # This method creates a port for every test and # replaces a test for creating a port. super(DbPortTestCase, self).setUp() self.dbapi = dbapi.get_instance() ndict = db_utils.get_test_node() self.n = self.dbapi.create_node(ndict) self.p = db_utils.get_test_port() def test_get_port_by_id(self): self.dbapi.create_port(self.p) res = self.dbapi.get_port(self.p['id']) self.assertEqual(self.p['address'], res.address) def test_get_port_by_uuid(self): self.dbapi.create_port(self.p) res = self.dbapi.get_port(self.p['uuid']) self.assertEqual(self.p['id'], res.id) def test_get_port_list(self): uuids = [] for i in range(1, 6): n = db_utils.get_test_port(id=i, uuid=ironic_utils.generate_uuid(), address='52:54:00:cf:2d:3%s' % i) self.dbapi.create_port(n) uuids.append(six.text_type(n['uuid'])) res = self.dbapi.get_port_list() res_uuids = [r.uuid for r in res] self.assertEqual(uuids.sort(), res_uuids.sort()) def test_get_port_by_address(self): self.dbapi.create_port(self.p) res = self.dbapi.get_port(self.p['address']) self.assertEqual(self.p['id'], res.id) self.assertRaises(exception.PortNotFound, self.dbapi.get_port, 99) self.assertRaises(exception.PortNotFound, self.dbapi.get_port, 'aa:bb:cc:dd:ee:ff') self.assertRaises(exception.InvalidIdentity, self.dbapi.get_port, 'not-a-mac') def test_get_ports_by_node_id(self): p = db_utils.get_test_port(node_id=self.n.id) self.dbapi.create_port(p) res = self.dbapi.get_ports_by_node(self.n.id) self.assertEqual(self.p['address'], res[0].address) def test_get_ports_by_node_uuid(self): p = db_utils.get_test_port(node_id=self.n.id) self.dbapi.create_port(p) res = self.dbapi.get_ports_by_node(self.n.uuid) self.assertEqual(self.p['address'], res[0].address) def test_get_ports_by_node_that_does_not_exist(self): self.dbapi.create_port(self.p) self.assertRaises(exception.NodeNotFound, self.dbapi.get_ports_by_node, 99) self.assertRaises(exception.NodeNotFound, self.dbapi.get_ports_by_node, '12345678-9999-0000-aaaa-123456789012') def test_destroy_port(self): self.dbapi.create_port(self.p) self.dbapi.destroy_port(self.p['id']) self.assertRaises(exception.PortNotFound, self.dbapi.destroy_port, self.p['id']) def test_update_port(self): self.dbapi.create_port(self.p) old_address = self.p['address'] new_address = 'ff.ee.dd.cc.bb.aa' self.assertNotEqual(old_address, new_address) res = self.dbapi.update_port(self.p['id'], {'address': new_address}) self.assertEqual(new_address, res.address) def test_destroy_port_on_reserved_node(self): p = self.dbapi.create_port(db_utils.get_test_port(node_id=self.n.id)) uuid = self.n.uuid self.dbapi.reserve_nodes('fake-reservation', [uuid]) self.assertRaises(exception.NodeLocked, self.dbapi.destroy_port, p.id) def test_update_port_duplicated_address(self): self.dbapi.create_port(self.p) address1 = self.p['address'] address2 = 'aa-bb-cc-11-22-33' p2 = db_utils.get_test_port(id=123, uuid=ironic_utils.generate_uuid(), node_id=self.n.id, address=address2) self.dbapi.create_port(p2) self.assertRaises(exception.MACAlreadyExists, self.dbapi.update_port, p2['id'], {'address': address1}) def test_create_port_duplicated_address(self): self.dbapi.create_port(self.p) dup_address = self.p['address'] p2 = db_utils.get_test_port(id=123, uuid=ironic_utils.generate_uuid(), node_id=self.n.id, address=dup_address) self.assertRaises(exception.MACAlreadyExists, self.dbapi.create_port, p2) ironic-2014.1.rc1/ironic/tests/db/sqlalchemy/0000775000175300017540000000000012316614636022071 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/tests/db/sqlalchemy/test_types.py0000664000175300017540000000666612316614116024655 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. """Tests for custom SQLAlchemy types via Ironic DB.""" from ironic.openstack.common.db import exception as db_exc from ironic.common import utils as ironic_utils from ironic.db import api as dbapi import ironic.db.sqlalchemy.api as sa_api from ironic.db.sqlalchemy import models from ironic.tests.db import base class SqlAlchemyCustomTypesTestCase(base.DbTestCase): def setUp(self): super(SqlAlchemyCustomTypesTestCase, self).setUp() self.dbapi = dbapi.get_instance() # NOTE(max_lobur): Since it's not straightforward to check this in # isolation these tests use existing db models. def test_JSONEncodedDict_default_value(self): # Create chassis w/o extra specified. ch1_id = ironic_utils.generate_uuid() self.dbapi.create_chassis({'uuid': ch1_id}) # Get chassis manually to test SA types in isolation from UOM. ch1 = sa_api.model_query(models.Chassis).filter_by(uuid=ch1_id).one() self.assertEqual({}, ch1.extra) # Create chassis with extra specified. ch2_id = ironic_utils.generate_uuid() extra = {'foo1': 'test', 'foo2': 'other extra'} self.dbapi.create_chassis({'uuid': ch2_id, 'extra': extra}) # Get chassis manually to test SA types in isolation from UOM. ch2 = sa_api.model_query(models.Chassis).filter_by(uuid=ch2_id).one() self.assertEqual(extra, ch2.extra) def test_JSONEncodedDict_type_check(self): self.assertRaises(db_exc.DBError, self.dbapi.create_chassis, {'extra': ['this is not a dict']}) def test_JSONEncodedLict_default_value(self): # Create conductor w/o extra specified. cdr1_id = 321321 self.dbapi.register_conductor({'hostname': 'test_host1', 'drivers': None, 'id': cdr1_id}) # Get conductor manually to test SA types in isolation from UOM. cdr1 = sa_api.model_query(models.Conductor).filter_by(id=cdr1_id)\ .one() self.assertEqual([], cdr1.drivers) # Create conductor with drivers specified. cdr2_id = 623623 drivers = ['foo1', 'other driver'] self.dbapi.register_conductor({'hostname': 'test_host2', 'drivers': drivers, 'id': cdr2_id}) # Get conductor manually to test SA types in isolation from UOM. cdr2 = sa_api.model_query(models.Conductor).filter_by(id=cdr2_id)\ .one() self.assertEqual(drivers, cdr2.drivers) def test_JSONEncodedList_type_check(self): self.assertRaises(db_exc.DBError, self.dbapi.register_conductor, {'drivers': {'this is not a list': 'test'}}) ironic-2014.1.rc1/ironic/tests/db/sqlalchemy/test_migrations.py0000664000175300017540000005101412316614116025650 0ustar jenkinsjenkins00000000000000# Copyright 2010-2011 OpenStack Foundation # Copyright 2012-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. """ Tests for database migrations. This test case reads the configuration file test_migrations.conf for database connection settings to use in the tests. For each connection found in the config file, the test case runs a series of test cases to ensure that migrations work properly. There are also "opportunistic" tests for both mysql and postgresql in here, which allows testing against all 3 databases (sqlite in memory, mysql, pg) in a properly configured unit test environment. For the opportunistic testing you need to set up a db named 'openstack_citest' with user 'openstack_citest' and password 'openstack_citest' on localhost. The test will then use that db and u/p combo to run the tests. For postgres on Ubuntu this can be done with the following commands: sudo -u postgres psql postgres=# create user openstack_citest with createdb login password 'openstack_citest'; postgres=# create database openstack_citest with owner openstack_citest; """ import ConfigParser import contextlib import fixtures import os import subprocess from alembic import script import mock import six.moves.urllib.parse as urlparse import sqlalchemy import sqlalchemy.exc from ironic.db.sqlalchemy import api as sqla_api from ironic.db.sqlalchemy import migration from ironic.openstack.common.db.sqlalchemy import utils as db_utils from ironic.openstack.common import lockutils from ironic.openstack.common import log as logging from ironic.tests import base LOG = logging.getLogger(__name__) def _get_connect_string(backend, user, passwd, database): """Get database connection Try to get a connection with a very specific set of values, if we get these then we'll run the tests, otherwise they are skipped """ if backend == "postgres": backend = "postgresql+psycopg2" elif backend == "mysql": backend = "mysql+mysqldb" else: raise Exception("Unrecognized backend: '%s'" % backend) return ("%(backend)s://%(user)s:%(passwd)s@localhost/%(database)s" % {'backend': backend, 'user': user, 'passwd': passwd, 'database': database}) def _is_backend_avail(backend, user, passwd, database): try: connect_uri = _get_connect_string(backend, user, passwd, database) engine = sqlalchemy.create_engine(connect_uri) connection = engine.connect() except Exception: # intentionally catch all to handle exceptions even if we don't # have any backend code loaded. return False else: connection.close() engine.dispose() return True def _have_mysql(user, passwd, database): present = os.environ.get('TEST_MYSQL_PRESENT') if present is None: return _is_backend_avail('mysql', user, passwd, database) return present.lower() in ('', 'true') def _have_postgresql(user, passwd, database): present = os.environ.get('TEST_POSTGRESQL_PRESENT') if present is None: return _is_backend_avail('postgres', user, passwd, database) return present.lower() in ('', 'true') def get_db_connection_info(conn_pieces): database = conn_pieces.path.strip('/') loc_pieces = conn_pieces.netloc.split('@') host = loc_pieces[1] auth_pieces = loc_pieces[0].split(':') user = auth_pieces[0] password = "" if len(auth_pieces) > 1: password = auth_pieces[1].strip() return (user, password, database, host) @contextlib.contextmanager def patch_with_engine(engine): with mock.patch(('ironic.db' '.sqlalchemy.api.get_engine')) as patch_migration: patch_migration.return_value = engine yield class BaseMigrationTestCase(base.TestCase): """Base class fort testing of migration utils.""" def __init__(self, *args, **kwargs): super(BaseMigrationTestCase, self).__init__(*args, **kwargs) self.DEFAULT_CONFIG_FILE = os.path.join(os.path.dirname(__file__), 'test_migrations.conf') # Test machines can set the TEST_MIGRATIONS_CONF variable # to override the location of the config file for migration testing self.CONFIG_FILE_PATH = os.environ.get('TEST_MIGRATIONS_CONF', self.DEFAULT_CONFIG_FILE) self.test_databases = {} self.migration_api = None def setUp(self): super(BaseMigrationTestCase, self).setUp() # Load test databases from the config file. Only do this # once. No need to re-run this on each test... if os.path.exists(self.CONFIG_FILE_PATH): cp = ConfigParser.RawConfigParser() try: cp.read(self.CONFIG_FILE_PATH) defaults = cp.defaults() for key, value in defaults.items(): self.test_databases[key] = value except ConfigParser.ParsingError as e: self.fail("Failed to read test_migrations.conf config " "file. Got error: %s" % e) else: self.fail("Failed to find test_migrations.conf config " "file.") self.engines = {} for key, value in self.test_databases.items(): self.engines[key] = sqla_api.create_engine(value) # We start each test case with a completely blank slate. self.temp_dir = self.useFixture(fixtures.TempDir()) self._reset_databases() # We also want to clean up, eg. in case of a failing test self.addCleanup(self._reset_databases) def execute_cmd(self, cmd=None): proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) output = proc.communicate()[0] LOG.debug(output) self.assertEqual(0, proc.returncode, "Failed to run: %s\n%s" % (cmd, output)) def _reset_pg(self, conn_pieces): @lockutils.synchronized('pgadmin', 'tests-', external=True, lock_path=self.temp_dir.path) def _reset_pg_inner(): (user, password, database, host) = \ get_db_connection_info(conn_pieces) os.environ['PGPASSWORD'] = password os.environ['PGUSER'] = user # note(boris-42): We must create and drop database, we can't # drop database which we have connected to, so for such # operations there is a special database template1. sqlcmd = ("psql -w -U %(user)s -h %(host)s -c" " '%(sql)s' -d template1") sql = ("drop database if exists %s;") % database droptable = sqlcmd % {'user': user, 'host': host, 'sql': sql} self.execute_cmd(droptable) sql = ("create database %s;") % database createtable = sqlcmd % {'user': user, 'host': host, 'sql': sql} self.execute_cmd(createtable) os.unsetenv('PGPASSWORD') os.unsetenv('PGUSER') _reset_pg_inner() def _reset_databases(self): for key, engine in self.engines.items(): conn_string = self.test_databases[key] conn_pieces = urlparse.urlparse(conn_string) engine.dispose() if conn_string.startswith('sqlite'): # We can just delete the SQLite database, which is # the easiest and cleanest solution db_path = conn_pieces.path.strip('/') if os.path.exists(db_path): os.unlink(db_path) # No need to recreate the SQLite DB. SQLite will # create it for us if it's not there... elif conn_string.startswith('mysql'): # We can execute the MySQL client to destroy and re-create # the MYSQL database, which is easier and less error-prone # than using SQLAlchemy to do this via MetaData...trust me. (user, password, database, host) = \ get_db_connection_info(conn_pieces) sql = ("drop database if exists %(database)s; " "create database %(database)s;") % \ {'database': database} cmd = ("mysql -u \"%(user)s\" -p\"%(password)s\" -h %(host)s " "-e \"%(sql)s\"") % {'user': user, 'password': password, 'host': host, 'sql': sql} self.execute_cmd(cmd) elif conn_string.startswith('postgresql'): self._reset_pg(conn_pieces) class WalkVersionsMixin(object): def _walk_versions(self, engine=None, alembic_cfg=None, downgrade=True): # Determine latest version script from the repo, then # upgrade from 1 through to the latest, with no data # in the databases. This just checks that the schema itself # upgrades successfully. # Place the database under version control with patch_with_engine(engine): script_directory = script.ScriptDirectory.from_config(alembic_cfg) self.assertIsNone(self.migration_api.version(alembic_cfg)) versions = [ver for ver in script_directory.walk_revisions()] for version in reversed(versions): self._migrate_up(engine, alembic_cfg, version.revision, with_data=True) if downgrade: for version in versions: self._migrate_down(engine, alembic_cfg, version.revision) def _migrate_down(self, engine, config, version, with_data=False): try: self.migration_api.downgrade(version, config=config) except NotImplementedError: # NOTE(sirp): some migrations, namely release-level # migrations, don't support a downgrade. return False self.assertEqual(version, self.migration_api.version(config)) # NOTE(sirp): `version` is what we're downgrading to (i.e. the 'target' # version). So if we have any downgrade checks, they need to be run for # the previous (higher numbered) migration. if with_data: post_downgrade = getattr( self, "_post_downgrade_%s" % (version), None) if post_downgrade: post_downgrade(engine) return True def _migrate_up(self, engine, config, version, with_data=False): """migrate up to a new version of the db. We allow for data insertion and post checks at every migration version with special _pre_upgrade_### and _check_### functions in the main test. """ # NOTE(sdague): try block is here because it's impossible to debug # where a failed data migration happens otherwise try: if with_data: data = None pre_upgrade = getattr( self, "_pre_upgrade_%s" % version, None) if pre_upgrade: data = pre_upgrade(engine) self.migration_api.upgrade(version, config=config) self.assertEqual(version, self.migration_api.version(config)) if with_data: check = getattr(self, "_check_%s" % version, None) if check: check(engine, data) except Exception: LOG.error(_("Failed to migrate to version %(version)s on engine " "%(engine)s") % {'version': version, 'engine': engine}) raise class TestWalkVersions(base.TestCase, WalkVersionsMixin): def setUp(self): super(TestWalkVersions, self).setUp() self.migration_api = mock.MagicMock() self.engine = mock.MagicMock() self.config = mock.MagicMock() self.versions = [mock.Mock(revision='2b2'), mock.Mock(revision='1a1')] def test_migrate_up(self): self.migration_api.version.return_value = 'dsa123' self._migrate_up(self.engine, self.config, 'dsa123') self.migration_api.upgrade.assert_called_with('dsa123', config=self.config) self.migration_api.version.assert_called_with(self.config) def test_migrate_up_with_data(self): test_value = {"a": 1, "b": 2} self.migration_api.version.return_value = '141' self._pre_upgrade_141 = mock.MagicMock() self._pre_upgrade_141.return_value = test_value self._check_141 = mock.MagicMock() self._migrate_up(self.engine, self.config, '141', True) self._pre_upgrade_141.assert_called_with(self.engine) self._check_141.assert_called_with(self.engine, test_value) def test_migrate_down(self): self.migration_api.version.return_value = '42' self.assertTrue(self._migrate_down(self.engine, self.config, '42')) self.migration_api.version.assert_called_with(self.config) def test_migrate_down_not_implemented(self): self.migration_api.downgrade.side_effect = NotImplementedError self.assertFalse(self._migrate_down(self.engine, self.config, '42')) def test_migrate_down_with_data(self): self._post_downgrade_043 = mock.MagicMock() self.migration_api.version.return_value = '043' self._migrate_down(self.engine, self.config, '043', True) self._post_downgrade_043.assert_called_with(self.engine) @mock.patch.object(script, 'ScriptDirectory') @mock.patch.object(WalkVersionsMixin, '_migrate_up') @mock.patch.object(WalkVersionsMixin, '_migrate_down') def test_walk_versions_all_default(self, _migrate_up, _migrate_down, script_directory): script_directory.from_config().\ walk_revisions.return_value = self.versions self.migration_api.version.return_value = None self._walk_versions(self.engine, self.config) self.migration_api.version.assert_called_with(self.config) upgraded = [mock.call(self.engine, self.config, v.revision, with_data=True) for v in reversed(self.versions)] self.assertEqual(self._migrate_up.call_args_list, upgraded) downgraded = [mock.call(self.engine, self.config, v.revision) for v in self.versions] self.assertEqual(self._migrate_down.call_args_list, downgraded) @mock.patch.object(script, 'ScriptDirectory') @mock.patch.object(WalkVersionsMixin, '_migrate_up') @mock.patch.object(WalkVersionsMixin, '_migrate_down') def test_walk_versions_all_false(self, _migrate_up, _migrate_down, script_directory): script_directory.from_config().\ walk_revisions.return_value = self.versions self.migration_api.version.return_value = None self._walk_versions(self.engine, self.config, downgrade=False) upgraded = [mock.call(self.engine, self.config, v.revision, with_data=True) for v in reversed(self.versions)] self.assertEqual(upgraded, self._migrate_up.call_args_list) class TestMigrations(BaseMigrationTestCase, WalkVersionsMixin): USER = "openstack_citest" PASSWD = "openstack_citest" DATABASE = "openstack_citest" def __init__(self, *args, **kwargs): super(TestMigrations, self).__init__(*args, **kwargs) def setUp(self): super(TestMigrations, self).setUp() self.config = migration._alembic_config() if self.migration_api is None: self.migration_api = migration def _test_mysql_opportunistically(self): # Test that table creation on mysql only builds InnoDB tables if not _have_mysql(self.USER, self.PASSWD, self.DATABASE): self.skipTest("mysql not available") # add this to the global lists to make reset work with it, it's removed # automatically during Cleanup so no need to clean it up here. connect_string = _get_connect_string("mysql", self.USER, self.PASSWD, self.DATABASE) (user, password, database, host) = \ get_db_connection_info(urlparse.urlparse(connect_string)) engine = sqlalchemy.create_engine(connect_string) self.engines[database] = engine self.test_databases[database] = connect_string # build a fully populated mysql database with all the tables self._reset_databases() self._walk_versions(engine, self.config, downgrade=False) connection = engine.connect() # sanity check total = connection.execute("SELECT count(*) " "from information_schema.TABLES " "where TABLE_SCHEMA='%s'" % database) self.assertTrue(total.scalar() > 0, "No tables found. Wrong schema?") noninnodb = connection.execute("SELECT count(*) " "from information_schema.TABLES " "where TABLE_SCHEMA='%s' " "and ENGINE!='InnoDB' " "and TABLE_NAME!='alembic_version'" % database) count = noninnodb.scalar() self.assertEqual(0, count, "%d non InnoDB tables created" % count) connection.close() def _test_postgresql_opportunistically(self): # Test postgresql database migration walk if not _have_postgresql(self.USER, self.PASSWD, self.DATABASE): self.skipTest("postgresql not available") # add this to the global lists to make reset work with it, it's removed # automatically during Cleanup so no need to clean it up here. connect_string = _get_connect_string("postgres", self.USER, self.PASSWD, self.DATABASE) engine = sqlalchemy.create_engine(connect_string) (user, password, database, host) = \ get_db_connection_info(urlparse.urlparse(connect_string)) self.engines[database] = engine self.test_databases[database] = connect_string # build a fully populated postgresql database with all the tables self._reset_databases() self._walk_versions(engine, self.config, downgrade=False) def test_walk_versions(self): for engine in self.engines.values(): self._walk_versions(engine, self.config, downgrade=False) def test_mysql_opportunistically(self): self._test_mysql_opportunistically() def test_mysql_connect_fail(self): """Test that we can trigger a mysql connection failure Test that we can fail gracefully to ensure we don't break people without mysql """ if _is_backend_avail('mysql', "openstack_cifail", self.PASSWD, self.DATABASE): self.fail("Shouldn't have connected") def test_postgresql_opportunistically(self): self._test_postgresql_opportunistically() def test_postgresql_connect_fail(self): """Test that we can trigger a postgres connection failure Test that we can fail gracefully to ensure we don't break people without postgres """ if _is_backend_avail('postgres', "openstack_cifail", self.PASSWD, self.DATABASE): self.fail("Shouldn't have connected") def _check_21b331f883ef(self, engine, data): nodes = db_utils.get_table(engine, 'nodes') col_names = [column.name for column in nodes.c] self.assertIn('provision_updated_at', col_names) self.assertIsInstance(nodes.c.provision_updated_at.type, sqlalchemy.types.DateTime) def _check_3cb628139ea4(self, engine, data): nodes = db_utils.get_table(engine, 'nodes') col_names = [column.name for column in nodes.c] self.assertIn('console_enabled', col_names) # in some backends bool type is integer self.assertTrue(isinstance(nodes.c.console_enabled.type, sqlalchemy.types.Boolean) or isinstance(nodes.c.console_enabled.type, sqlalchemy.types.Integer)) ironic-2014.1.rc1/ironic/tests/db/sqlalchemy/__init__.py0000664000175300017540000000000012316614116024161 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/tests/db/sqlalchemy/test_migrations.conf0000664000175300017540000000043012316614116026141 0ustar jenkinsjenkins00000000000000[DEFAULT] # Set up any number of migration data stores you want, one # The "name" used in the test is the config variable key. # sqlite migrations not supported by alembic #mysql=mysql://root:@localhost/test_migrations #postgresql=postgresql://user:pass@localhost/test_migrations ironic-2014.1.rc1/ironic/tests/api/0000775000175300017540000000000012316614636020113 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/tests/api/base.py0000664000175300017540000002270212316614116021373 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright 2013 Hewlett-Packard Development Company, L.P. # 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. """Base classes for API tests.""" # NOTE: Ported from ceilometer/tests/api.py (subsequently moved to # ceilometer/tests/api/__init__.py). This should be oslo'ified: # https://bugs.launchpad.net/ironic/+bug/1255115. from oslo.config import cfg import pecan import pecan.testing from ironic.api import acl from ironic.db import api as dbapi from ironic.tests.db import base PATH_PREFIX = '/v1' class FunctionalTest(base.DbTestCase): """Used for functional tests of Pecan controllers where you need to test your literal application and its integration with the framework. """ SOURCE_DATA = {'test_source': {'somekey': '666'}} def setUp(self): super(FunctionalTest, self).setUp() cfg.CONF.set_override("auth_version", "v2.0", group=acl.OPT_GROUP_NAME) self.app = self._make_app() self.dbapi = dbapi.get_instance() def reset_pecan(): pecan.set_config({}, overwrite=True) self.addCleanup(reset_pecan) def _make_app(self, enable_acl=False): # Determine where we are so we can set up paths in the config root_dir = self.path_get() self.config = { 'app': { 'root': 'ironic.api.controllers.root.RootController', 'modules': ['ironic.api'], 'static_root': '%s/public' % root_dir, 'template_path': '%s/api/templates' % root_dir, 'enable_acl': enable_acl, 'acl_public_routes': ['/', '/v1'], }, } return pecan.testing.load_test_app(self.config) def _request_json(self, path, params, expect_errors=False, headers=None, method="post", extra_environ=None, status=None, path_prefix=PATH_PREFIX): """Sends simulated HTTP request to Pecan test app. :param path: url path of target service :param params: content for wsgi.input of request :param expect_errors: Boolean value; whether an error is expected based on request :param headers: a dictionary of headers to send along with the request :param method: Request method type. Appropriate method function call should be used rather than passing attribute in. :param extra_environ: a dictionary of environ variables to send along with the request :param status: expected status code of response :param path_prefix: prefix of the url path """ full_path = path_prefix + path print('%s: %s %s' % (method.upper(), full_path, params)) response = getattr(self.app, "%s_json" % method)( str(full_path), params=params, headers=headers, status=status, extra_environ=extra_environ, expect_errors=expect_errors ) print('GOT:%s' % response) return response def put_json(self, path, params, expect_errors=False, headers=None, extra_environ=None, status=None): """Sends simulated HTTP PUT request to Pecan test app. :param path: url path of target service :param params: content for wsgi.input of request :param expect_errors: Boolean value; whether an error is expected based on request :param headers: a dictionary of headers to send along with the request :param extra_environ: a dictionary of environ variables to send along with the request :param status: expected status code of response """ return self._request_json(path=path, params=params, expect_errors=expect_errors, headers=headers, extra_environ=extra_environ, status=status, method="put") def post_json(self, path, params, expect_errors=False, headers=None, extra_environ=None, status=None): """Sends simulated HTTP POST request to Pecan test app. :param path: url path of target service :param params: content for wsgi.input of request :param expect_errors: Boolean value; whether an error is expected based on request :param headers: a dictionary of headers to send along with the request :param extra_environ: a dictionary of environ variables to send along with the request :param status: expected status code of response """ return self._request_json(path=path, params=params, expect_errors=expect_errors, headers=headers, extra_environ=extra_environ, status=status, method="post") def patch_json(self, path, params, expect_errors=False, headers=None, extra_environ=None, status=None): """Sends simulated HTTP PATCH request to Pecan test app. :param path: url path of target service :param params: content for wsgi.input of request :param expect_errors: Boolean value; whether an error is expected based on request :param headers: a dictionary of headers to send along with the request :param extra_environ: a dictionary of environ variables to send along with the request :param status: expected status code of response """ return self._request_json(path=path, params=params, expect_errors=expect_errors, headers=headers, extra_environ=extra_environ, status=status, method="patch") def delete(self, path, expect_errors=False, headers=None, extra_environ=None, status=None, path_prefix=PATH_PREFIX): """Sends simulated HTTP DELETE request to Pecan test app. :param path: url path of target service :param expect_errors: Boolean value; whether an error is expected based on request :param headers: a dictionary of headers to send along with the request :param extra_environ: a dictionary of environ variables to send along with the request :param status: expected status code of response :param path_prefix: prefix of the url path """ full_path = path_prefix + path print('DELETE: %s' % (full_path)) response = self.app.delete(str(full_path), headers=headers, status=status, extra_environ=extra_environ, expect_errors=expect_errors) print('GOT:%s' % response) return response def get_json(self, path, expect_errors=False, headers=None, extra_environ=None, q=[], path_prefix=PATH_PREFIX, **params): """Sends simulated HTTP GET request to Pecan test app. :param path: url path of target service :param expect_errors: Boolean value;whether an error is expected based on request :param headers: a dictionary of headers to send along with the request :param extra_environ: a dictionary of environ variables to send along with the request :param q: list of queries consisting of: field, value, op, and type keys :param path_prefix: prefix of the url path :param params: content for wsgi.input of request """ full_path = path_prefix + path query_params = {'q.field': [], 'q.value': [], 'q.op': [], } for query in q: for name in ['field', 'op', 'value']: query_params['q.%s' % name].append(query.get(name, '')) all_params = {} all_params.update(params) if q: all_params.update(query_params) print('GET: %s %r' % (full_path, all_params)) response = self.app.get(full_path, params=all_params, headers=headers, extra_environ=extra_environ, expect_errors=expect_errors) if not expect_errors: response = response.json print('GOT:%s' % response) return response def validate_link(self, link): """Checks if the given link can get correct data.""" # removes 'http://loicalhost' part full_path = link.split('localhost', 1)[1] try: self.get_json(full_path, path_prefix='') return True except Exception: return False ironic-2014.1.rc1/ironic/tests/api/test_acl.py0000664000175300017540000000737412316614116022267 0ustar jenkinsjenkins00000000000000# -*- encoding: 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. """ Tests for ACL. Checks whether certain kinds of requests are blocked or allowed to be processed. """ import mock from oslo.config import cfg from ironic.api import acl from ironic.db import api as db_api from ironic.tests.api import base from ironic.tests.api import utils from ironic.tests.db import utils as db_utils class TestACL(base.FunctionalTest): def setUp(self): super(TestACL, self).setUp() self.environ = {'fake.cache': utils.FakeMemcache()} self.fake_node = db_utils.get_test_node(chassis_id=None) self.dbapi = db_api.get_instance() self.node_path = '/nodes/%s' % self.fake_node['uuid'] def get_json(self, path, expect_errors=False, headers=None, q=[], **param): return super(TestACL, self).get_json(path, expect_errors=expect_errors, headers=headers, q=q, extra_environ=self.environ, **param) def _make_app(self): cfg.CONF.set_override('cache', 'fake.cache', group=acl.OPT_GROUP_NAME) return super(TestACL, self)._make_app(enable_acl=True) def test_non_authenticated(self): response = self.get_json(self.node_path, expect_errors=True) self.assertEqual(401, response.status_int) def test_authenticated(self): with mock.patch.object(self.dbapi, 'get_node', autospec=True) as mock_get_node: mock_get_node.return_value = self.fake_node response = self.get_json(self.node_path, headers={'X-Auth-Token': utils.ADMIN_TOKEN}) self.assertEqual(self.fake_node['uuid'], response['uuid']) mock_get_node.assert_called_once_with(self.fake_node['uuid']) def test_non_admin(self): response = self.get_json(self.node_path, headers={'X-Auth-Token': utils.MEMBER_TOKEN}, expect_errors=True) self.assertEqual(403, response.status_int) def test_non_admin_with_admin_header(self): response = self.get_json(self.node_path, headers={'X-Auth-Token': utils.MEMBER_TOKEN, 'X-Roles': 'admin'}, expect_errors=True) self.assertEqual(403, response.status_int) def test_public_api(self): # expect_errors should be set to True: If expect_errors is set to False # the response gets converted to JSON and we cannot read the response # code so easy. for route in ('/', '/v1'): response = self.get_json(route, path_prefix='', expect_errors=True) self.assertEqual(200, response.status_int) def test_public_api_with_path_extensions(self): for route in ('/v1/', '/v1.json', '/v1.xml'): response = self.get_json(route, path_prefix='', expect_errors=True) self.assertEqual(200, response.status_int) ironic-2014.1.rc1/ironic/tests/api/test_base.py0000664000175300017540000000217612316614116022435 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 ironic.tests.api import base class TestBase(base.FunctionalTest): def test_api_setup(self): pass def test_bad_uri(self): response = self.get_json('/bad/path', expect_errors=True, headers={"Accept": "application/json"}) self.assertEqual(404, response.status_int) self.assertEqual("application/json", response.content_type) self.assertTrue(response.json['error_message']) ironic-2014.1.rc1/ironic/tests/api/utils.py0000664000175300017540000000576312316614116021631 0ustar jenkinsjenkins00000000000000# -*- encoding: 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. """ Utils for testing the API service. """ import datetime import json from ironic.api.controllers.v1 import chassis as chassis_controller from ironic.api.controllers.v1 import node as node_controller from ironic.api.controllers.v1 import port as port_controller from ironic.tests.db import utils ADMIN_TOKEN = '4562138218392831' MEMBER_TOKEN = '4562138218392832' class FakeMemcache(object): """Fake cache that is used for keystone tokens lookup.""" _cache = { 'tokens/%s' % ADMIN_TOKEN: { 'access': { 'token': {'id': ADMIN_TOKEN}, 'user': {'id': 'user_id1', 'name': 'user_name1', 'tenantId': '123i2910', 'tenantName': 'mytenant', 'roles': [{'name': 'admin'}] }, } }, 'tokens/%s' % MEMBER_TOKEN: { 'access': { 'token': {'id': MEMBER_TOKEN}, 'user': {'id': 'user_id2', 'name': 'user-good', 'tenantId': 'project-good', 'tenantName': 'goodies', 'roles': [{'name': 'Member'}] } } } } def __init__(self): self.set_key = None self.set_value = None self.token_expiration = None def get(self, key): dt = datetime.datetime.utcnow() + datetime.timedelta(minutes=5) return json.dumps((self._cache.get(key), dt.isoformat())) def set(self, key, value, timeout=None): self.set_value = value self.set_key = key def remove_internal(values, internal): # NOTE(yuriyz): internal attributes should not be posted, except uuid int_attr = [attr.lstrip('/') for attr in internal if attr != '/uuid'] return dict([(k, v) for (k, v) in values.iteritems() if k not in int_attr]) def node_post_data(**kw): node = utils.get_test_node(**kw) internal = node_controller.NodePatchType.internal_attrs() return remove_internal(node, internal) def port_post_data(**kw): port = utils.get_test_port(**kw) internal = port_controller.PortPatchType.internal_attrs() return remove_internal(port, internal) def chassis_post_data(**kw): chassis = utils.get_test_chassis(**kw) internal = chassis_controller.ChassisPatchType.internal_attrs() return remove_internal(chassis, internal) ironic-2014.1.rc1/ironic/tests/api/test_root.py0000664000175300017540000000325312316614116022503 0ustar jenkinsjenkins00000000000000# Copyright 2013 Red Hat, Inc. # 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 ironic.tests.api import base class TestRoot(base.FunctionalTest): def test_get_root(self): data = self.get_json('/', path_prefix='') self.assertEqual('v1', data['default_version']['id']) # Check fields are not empty [self.assertNotIn(f, ['', []]) for f in data.keys()] class TestV1Root(base.FunctionalTest): def test_get_v1_root(self): data = self.get_json('/') self.assertEqual('v1', data['id']) # Check fields are not empty for f in data.keys(): self.assertNotIn(f, ['', []]) # Check if all known resources are present and there are no extra ones. not_resources = ('id', 'links', 'media_types') actual_resources = tuple(set(data.keys()) - set(not_resources)) expected_resources = ('chassis', 'drivers', 'nodes', 'ports') self.assertEqual(sorted(expected_resources), sorted(actual_resources)) self.assertIn({'type': 'application/vnd.openstack.ironic.v1+json', 'base': 'application/json'}, data['media_types']) ironic-2014.1.rc1/ironic/tests/api/__init__.py0000664000175300017540000000000012316614116022203 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/tests/api/test_hooks.py0000664000175300017540000000775012316614116022651 0ustar jenkinsjenkins00000000000000# -*- encoding: 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. """Tests for the Pecan API hooks.""" import json import mock from oslo.config import cfg from ironic.api.controllers import root from ironic.openstack.common.rpc import common as rpc_common from ironic.tests.api import base class TestNoExceptionTracebackHook(base.FunctionalTest): TRACE = [u'Traceback (most recent call last):', u' File "/opt/stack/ironic/ironic/openstack/common/rpc/amqp.py",' ' line 434, in _process_data\\n **args)', u' File "/opt/stack/ironic/ironic/openstack/common/rpc/' 'dispatcher.py", line 172, in dispatch\\n result =' ' getattr(proxyobj, method)(ctxt, **kwargs)'] MSG_WITHOUT_TRACE = "Test exception message." MSG_WITH_TRACE = MSG_WITHOUT_TRACE + "\n" + "\n".join(TRACE) def setUp(self): super(TestNoExceptionTracebackHook, self).setUp() p = mock.patch.object(root.Root, 'convert') self.root_convert_mock = p.start() self.addCleanup(p.stop) def test_hook_exception_success(self): self.root_convert_mock.side_effect = Exception(self.MSG_WITH_TRACE) response = self.get_json('/', path_prefix='', expect_errors=True) actual_msg = json.loads(response.json['error_message'])['faultstring'] self.assertEqual(self.MSG_WITHOUT_TRACE, actual_msg) def test_hook_remote_error_success(self): test_exc_type = 'TestException' self.root_convert_mock.side_effect = rpc_common.RemoteError( test_exc_type, self.MSG_WITHOUT_TRACE, self.TRACE) response = self.get_json('/', path_prefix='', expect_errors=True) # NOTE(max_lobur): For RemoteError the client message will still have # some garbage because in RemoteError traceback is serialized as a list # instead of'\n'.join(trace). But since RemoteError is kind of very # rare thing (happens due to wrong deserialization settings etc.) # we don't care about this garbage. expected_msg = "Remote error: %s %s" \ % (test_exc_type, self.MSG_WITHOUT_TRACE) + "\n[u'" actual_msg = json.loads(response.json['error_message'])['faultstring'] self.assertEqual(expected_msg, actual_msg) def test_hook_without_traceback(self): msg = "Error message without traceback \n but \n multiline" self.root_convert_mock.side_effect = Exception(msg) response = self.get_json('/', path_prefix='', expect_errors=True) actual_msg = json.loads(response.json['error_message'])['faultstring'] self.assertEqual(msg, actual_msg) def test_hook_server_debug_on_serverfault(self): cfg.CONF.set_override('debug', True) self.root_convert_mock.side_effect = Exception(self.MSG_WITH_TRACE) response = self.get_json('/', path_prefix='', expect_errors=True) actual_msg = json.loads( response.json['error_message'])['faultstring'] self.assertEqual(self.MSG_WITHOUT_TRACE, actual_msg) def test_hook_server_debug_on_clientfault(self): cfg.CONF.set_override('debug', True) client_error = Exception(self.MSG_WITH_TRACE) client_error.code = 400 self.root_convert_mock.side_effect = client_error response = self.get_json('/', path_prefix='', expect_errors=True) actual_msg = json.loads( response.json['error_message'])['faultstring'] self.assertEqual(self.MSG_WITH_TRACE, actual_msg) ironic-2014.1.rc1/ironic/tests/api/v1/0000775000175300017540000000000012316614636020441 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/tests/api/v1/test_nodes.py0000664000175300017540000012626512316614116023167 0ustar jenkinsjenkins00000000000000# -*- encoding: 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. """ Tests for the API /nodes/ methods. """ import datetime import mock from oslo.config import cfg from testtools.matchers import HasLength from ironic.common import exception from ironic.common import states from ironic.common import utils from ironic.conductor import rpcapi from ironic import objects from ironic.openstack.common import timeutils from ironic.tests.api import base from ironic.tests.api import utils as apiutils from ironic.tests.db import utils as dbutils # NOTE(lucasagomes): When creating a node via API (POST) # we have to use chassis_uuid def post_get_test_node(**kw): node = apiutils.node_post_data(**kw) chassis = dbutils.get_test_chassis() node['chassis_id'] = None node['chassis_uuid'] = kw.get('chassis_uuid', chassis['uuid']) return node class TestListNodes(base.FunctionalTest): def setUp(self): super(TestListNodes, self).setUp() cdict = dbutils.get_test_chassis() self.chassis = self.dbapi.create_chassis(cdict) p = mock.patch.object(rpcapi.ConductorAPI, 'get_topic_for') self.mock_gtf = p.start() self.mock_gtf.return_value = 'test-topic' self.addCleanup(p.stop) def _create_association_test_nodes(self): #create some unassociated nodes unassociated_nodes = [] for id in range(3): ndict = dbutils.get_test_node(id=id, uuid=utils.generate_uuid()) node = self.dbapi.create_node(ndict) unassociated_nodes.append(node['uuid']) #created some associated nodes associated_nodes = [] for id in range(3, 7): ndict = dbutils.get_test_node( id=id, uuid=utils.generate_uuid(), instance_uuid=utils.generate_uuid()) node = self.dbapi.create_node(ndict) associated_nodes.append(node['uuid']) return {'associated': associated_nodes, 'unassociated': unassociated_nodes} def test_empty(self): data = self.get_json('/nodes') self.assertEqual([], data['nodes']) def test_one(self): ndict = dbutils.get_test_node() node = self.dbapi.create_node(ndict) data = self.get_json('/nodes') self.assertEqual(node['uuid'], data['nodes'][0]["uuid"]) self.assertNotIn('driver', data['nodes'][0]) self.assertNotIn('driver_info', data['nodes'][0]) self.assertNotIn('extra', data['nodes'][0]) self.assertNotIn('properties', data['nodes'][0]) self.assertNotIn('chassis_uuid', data['nodes'][0]) self.assertNotIn('reservation', data['nodes'][0]) self.assertNotIn('maintenance', data['nodes'][0]) self.assertNotIn('console_enabled', data['nodes'][0]) self.assertNotIn('target_power_state', data['nodes'][0]) self.assertNotIn('target_provision_state', data['nodes'][0]) self.assertNotIn('provision_updated_at', data['nodes'][0]) # never expose the chassis_id self.assertNotIn('chassis_id', data['nodes'][0]) def test_detail(self): ndict = dbutils.get_test_node() node = self.dbapi.create_node(ndict) data = self.get_json('/nodes/detail') self.assertEqual(node['uuid'], data['nodes'][0]["uuid"]) self.assertIn('driver', data['nodes'][0]) self.assertIn('driver_info', data['nodes'][0]) self.assertIn('extra', data['nodes'][0]) self.assertIn('properties', data['nodes'][0]) self.assertIn('chassis_uuid', data['nodes'][0]) self.assertIn('reservation', data['nodes'][0]) self.assertIn('maintenance', data['nodes'][0]) self.assertIn('console_enabled', data['nodes'][0]) self.assertIn('target_power_state', data['nodes'][0]) self.assertIn('target_provision_state', data['nodes'][0]) self.assertIn('provision_updated_at', data['nodes'][0]) # never expose the chassis_id self.assertNotIn('chassis_id', data['nodes'][0]) def test_detail_against_single(self): ndict = dbutils.get_test_node() node = self.dbapi.create_node(ndict) response = self.get_json('/nodes/%s/detail' % node['uuid'], expect_errors=True) self.assertEqual(404, response.status_int) def test_many(self): nodes = [] for id in range(5): ndict = dbutils.get_test_node(id=id, uuid=utils.generate_uuid()) node = self.dbapi.create_node(ndict) nodes.append(node['uuid']) data = self.get_json('/nodes') self.assertEqual(len(nodes), len(data['nodes'])) uuids = [n['uuid'] for n in data['nodes']] self.assertEqual(sorted(nodes), sorted(uuids)) def test_links(self): uuid = utils.generate_uuid() ndict = dbutils.get_test_node(id=1, uuid=uuid) self.dbapi.create_node(ndict) data = self.get_json('/nodes/%s' % uuid) self.assertIn('links', data.keys()) self.assertEqual(2, len(data['links'])) self.assertIn(uuid, data['links'][0]['href']) self.assertTrue(self.validate_link(data['links'][0]['href'])) self.assertTrue(self.validate_link(data['links'][1]['href'])) def test_collection_links(self): nodes = [] for id in range(5): ndict = dbutils.get_test_node(id=id, uuid=utils.generate_uuid()) node = self.dbapi.create_node(ndict) nodes.append(node['uuid']) data = self.get_json('/nodes/?limit=3') self.assertEqual(3, len(data['nodes'])) next_marker = data['nodes'][-1]['uuid'] self.assertIn(next_marker, data['next']) def test_collection_links_default_limit(self): cfg.CONF.set_override('max_limit', 3, 'api') nodes = [] for id in range(5): ndict = dbutils.get_test_node(id=id, uuid=utils.generate_uuid()) node = self.dbapi.create_node(ndict) nodes.append(node['uuid']) data = self.get_json('/nodes') self.assertEqual(3, len(data['nodes'])) next_marker = data['nodes'][-1]['uuid'] self.assertIn(next_marker, data['next']) def test_ports_subresource_link(self): ndict = dbutils.get_test_node() self.dbapi.create_node(ndict) data = self.get_json('/nodes/%s' % ndict['uuid']) self.assertIn('ports', data.keys()) def test_ports_subresource(self): ndict = dbutils.get_test_node() self.dbapi.create_node(ndict) for id in range(2): pdict = dbutils.get_test_port(id=id, node_id=ndict['id'], uuid=utils.generate_uuid(), address='52:54:00:cf:2d:3%s' % id) self.dbapi.create_port(pdict) data = self.get_json('/nodes/%s/ports' % ndict['uuid']) self.assertEqual(2, len(data['ports'])) self.assertNotIn('next', data.keys()) # Test collection pagination data = self.get_json('/nodes/%s/ports?limit=1' % ndict['uuid']) self.assertEqual(1, len(data['ports'])) self.assertIn('next', data.keys()) def test_ports_subresource_noid(self): ndict = dbutils.get_test_node() self.dbapi.create_node(ndict) pdict = dbutils.get_test_port(node_id=ndict['id']) self.dbapi.create_port(pdict) # No node id specified response = self.get_json('/nodes/ports', expect_errors=True) self.assertEqual(400, response.status_int) def test_ports_subresource_node_not_found(self): non_existent_uuid = 'eeeeeeee-cccc-aaaa-bbbb-cccccccccccc' response = self.get_json('/nodes/%s/ports' % non_existent_uuid, expect_errors=True) self.assertEqual(404, response.status_int) @mock.patch.object(timeutils, 'utcnow') def test_node_states(self, mock_utcnow): fake_state = 'fake-state' fake_error = 'fake-error' test_time = datetime.datetime(2000, 1, 1, 0, 0) mock_utcnow.return_value = test_time ndict = dbutils.get_test_node(power_state=fake_state, target_power_state=fake_state, provision_state=fake_state, target_provision_state=fake_state, provision_updated_at=test_time, last_error=fake_error) self.dbapi.create_node(ndict) data = self.get_json('/nodes/%s/states' % ndict['uuid']) self.assertEqual(fake_state, data['power_state']) self.assertEqual(fake_state, data['target_power_state']) self.assertEqual(fake_state, data['provision_state']) self.assertEqual(fake_state, data['target_provision_state']) prov_up_at = timeutils.parse_isotime( data['provision_updated_at']).replace(tzinfo=None) self.assertEqual(test_time, prov_up_at) self.assertEqual(fake_error, data['last_error']) self.assertFalse(data['console_enabled']) def test_node_by_instance_uuid(self): ndict = dbutils.get_test_node(uuid=utils.generate_uuid(), instance_uuid=utils.generate_uuid()) node = self.dbapi.create_node(ndict) instance_uuid = node['instance_uuid'] data = self.get_json('/nodes?instance_uuid=%s' % instance_uuid) self.assertThat(data['nodes'], HasLength(1)) self.assertEqual(node['instance_uuid'], data['nodes'][0]["instance_uuid"]) def test_node_by_instance_uuid_wrong_uuid(self): ndict = dbutils.get_test_node(uuid=utils.generate_uuid(), instance_uuid=utils.generate_uuid()) self.dbapi.create_node(ndict) wrong_uuid = utils.generate_uuid() data = self.get_json('/nodes?instance_uuid=%s' % wrong_uuid) self.assertThat(data['nodes'], HasLength(0)) def test_node_by_instance_uuid_invalid_uuid(self): response = self.get_json('/nodes?instance_uuid=fake', expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) def test_associated_nodes_insensitive(self): associated_nodes = self._create_association_test_nodes().\ get('associated') data = self.get_json('/nodes?associated=true') data1 = self.get_json('/nodes?associated=True') uuids = [n['uuid'] for n in data['nodes']] uuids1 = [n['uuid'] for n in data1['nodes']] self.assertEqual(sorted(associated_nodes), sorted(uuids1)) self.assertEqual(sorted(associated_nodes), sorted(uuids)) def test_associated_nodes_error(self): self._create_association_test_nodes() response = self.get_json('/nodes?associated=blah', expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_unassociated_nodes_insensitive(self): unassociated_nodes = self._create_association_test_nodes().\ get('unassociated') data = self.get_json('/nodes?associated=false') data1 = self.get_json('/nodes?associated=FALSE') uuids = [n['uuid'] for n in data['nodes']] uuids1 = [n['uuid'] for n in data1['nodes']] self.assertEqual(sorted(unassociated_nodes), sorted(uuids1)) self.assertEqual(sorted(unassociated_nodes), sorted(uuids)) def test_unassociated_nodes_with_limit(self): unassociated_nodes = self._create_association_test_nodes().\ get('unassociated') data = self.get_json('/nodes?associated=False&limit=2') self.assertThat(data['nodes'], HasLength(2)) self.assertTrue(data['nodes'][0]['uuid'] in unassociated_nodes) def test_next_link_with_association(self): self._create_association_test_nodes() data = self.get_json('/nodes/?limit=3&associated=True') self.assertThat(data['nodes'], HasLength(3)) self.assertIn('associated=True', data['next']) def test_detail_with_association_filter(self): associated_nodes = self._create_association_test_nodes().\ get('associated') data = self.get_json('/nodes/detail?associated=true') self.assertIn('driver', data['nodes'][0]) self.assertEqual(len(associated_nodes), len(data['nodes'])) def test_next_link_with_association_with_detail(self): self._create_association_test_nodes() data = self.get_json('/nodes/detail?limit=3&associated=true') self.assertThat(data['nodes'], HasLength(3)) self.assertIn('driver', data['nodes'][0]) self.assertIn('associated=True', data['next']) def test_detail_with_instance_uuid(self): ndict = dbutils.get_test_node(uuid=utils.generate_uuid(), instance_uuid=utils.generate_uuid()) node = self.dbapi.create_node(ndict) instance_uuid = node['instance_uuid'] data = self.get_json('/nodes/detail?instance_uuid=%s' % instance_uuid) self.assertEqual(node['instance_uuid'], data['nodes'][0]["instance_uuid"]) self.assertIn('driver', data['nodes'][0]) self.assertIn('driver_info', data['nodes'][0]) self.assertIn('extra', data['nodes'][0]) self.assertIn('properties', data['nodes'][0]) self.assertIn('chassis_uuid', data['nodes'][0]) # never expose the chassis_id self.assertNotIn('chassis_id', data['nodes'][0]) def test_maintenance_nodes(self): nodes = [] for id in range(5): ndict = dbutils.get_test_node(id=id, uuid=utils.generate_uuid(), maintenance=id % 2) node = self.dbapi.create_node(ndict) nodes.append(node) data = self.get_json('/nodes?maintenance=true') uuids = [n['uuid'] for n in data['nodes']] test_uuids_1 = [n.uuid for n in nodes if n.maintenance] self.assertEqual(sorted(test_uuids_1), sorted(uuids)) data = self.get_json('/nodes?maintenance=false') uuids = [n['uuid'] for n in data['nodes']] test_uuids_0 = [n.uuid for n in nodes if not n.maintenance] self.assertEqual(sorted(test_uuids_0), sorted(uuids)) def test_maintenance_nodes_error(self): response = self.get_json('/nodes?associated=true&maintenance=blah', expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_maintenance_nodes_associated(self): self._create_association_test_nodes() ndict = dbutils.get_test_node(instance_uuid=utils.generate_uuid(), maintenance=True) node = self.dbapi.create_node(ndict) data = self.get_json('/nodes?associated=true&maintenance=false') uuids = [n['uuid'] for n in data['nodes']] self.assertNotIn(node.uuid, uuids) data = self.get_json('/nodes?associated=true&maintenance=true') uuids = [n['uuid'] for n in data['nodes']] self.assertIn(node.uuid, uuids) data = self.get_json('/nodes?associated=true&maintenance=TruE') uuids = [n['uuid'] for n in data['nodes']] self.assertIn(node.uuid, uuids) def test_get_console_information(self): node = self.dbapi.create_node(dbutils.get_test_node()) expected_data = {'test': 'test-data'} with mock.patch.object(rpcapi.ConductorAPI, 'get_console_information') as mock_gci: mock_gci.return_value = expected_data data = self.get_json('/nodes/%s/states/console' % node.uuid) self.assertEqual(expected_data, data) mock_gci.assert_called_once_with(mock.ANY, node.uuid, 'test-topic') def test_get_console_information_not_supported(self): node = self.dbapi.create_node(dbutils.get_test_node()) with mock.patch.object(rpcapi.ConductorAPI, 'get_console_information') as mock_gci: mock_gci.side_effect = exception.UnsupportedDriverExtension( extension='console', driver='test-driver') ret = self.get_json('/nodes/%s/states/console' % node.uuid, expect_errors=True) self.assertEqual(400, ret.status_code) mock_gci.assert_called_once_with(mock.ANY, node.uuid, 'test-topic') class TestPatch(base.FunctionalTest): def setUp(self): super(TestPatch, self).setUp() cdict = dbutils.get_test_chassis() self.chassis = self.dbapi.create_chassis(cdict) ndict = dbutils.get_test_node() self.node = self.dbapi.create_node(ndict) p = mock.patch.object(rpcapi.ConductorAPI, 'get_topic_for') self.mock_gtf = p.start() self.mock_gtf.return_value = 'test-topic' self.addCleanup(p.stop) p = mock.patch.object(rpcapi.ConductorAPI, 'update_node') self.mock_update_node = p.start() self.addCleanup(p.stop) p = mock.patch.object(rpcapi.ConductorAPI, 'change_node_power_state') self.mock_cnps = p.start() self.addCleanup(p.stop) def test_update_ok(self): self.mock_update_node.return_value = self.node self.mock_update_node.return_value.updated_at = \ "2013-12-03T06:20:41.184720+00:00" response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'path': '/instance_uuid', 'value': 'aaaaaaaa-1111-bbbb-2222-cccccccccccc', 'op': 'replace'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) self.assertEqual(self.mock_update_node.return_value.updated_at, timeutils.parse_isotime(response.json['updated_at'])) self.mock_update_node.assert_called_once_with( mock.ANY, mock.ANY, 'test-topic') def test_update_state(self): response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'power_state': 'new state'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_update_fails_bad_driver_info(self): fake_err = 'Fake Error Message' self.mock_update_node.side_effect = exception.InvalidParameterValue( fake_err) response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'path': '/driver_info/this', 'value': 'foo', 'op': 'add'}, {'path': '/driver_info/that', 'value': 'bar', 'op': 'add'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.mock_update_node.assert_called_once_with( mock.ANY, mock.ANY, 'test-topic') def test_update_fails_bad_driver(self): self.mock_gtf.side_effect = exception.NoValidHost('Fake Error') response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'path': '/driver', 'value': 'bad-driver', 'op': 'replace'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) def test_update_fails_bad_state(self): fake_err = 'Fake Power State' self.mock_update_node.side_effect = exception.NodeInWrongPowerState( node=self.node['uuid'], pstate=fake_err) response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'path': '/instance_uuid', 'value': 'aaaaaaaa-1111-bbbb-2222-cccccccccccc', 'op': 'replace'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(409, response.status_code) self.mock_update_node.assert_called_once_with( mock.ANY, mock.ANY, 'test-topic') def test_add_ok(self): self.mock_update_node.return_value = self.node response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'path': '/extra/foo', 'value': 'bar', 'op': 'add'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) self.mock_update_node.assert_called_once_with( mock.ANY, mock.ANY, 'test-topic') def test_add_fail(self): response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'path': '/foo', 'value': 'bar', 'op': 'add'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_remove_ok(self): self.mock_update_node.return_value = self.node response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'path': '/extra', 'op': 'remove'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) self.mock_update_node.assert_called_once_with( mock.ANY, mock.ANY, 'test-topic') def test_remove_non_existent_property_fail(self): response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'path': '/extra/non-existent', 'op': 'remove'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_update_state_in_progress(self): ndict = dbutils.get_test_node(id=99, uuid=utils.generate_uuid(), target_power_state=states.POWER_OFF) node = self.dbapi.create_node(ndict) response = self.patch_json('/nodes/%s' % node['uuid'], [{'path': '/extra/foo', 'value': 'bar', 'op': 'add'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(409, response.status_code) self.assertTrue(response.json['error_message']) def test_patch_ports_subresource(self): response = self.patch_json('/nodes/%s/ports' % self.node['uuid'], [{'path': '/extra/foo', 'value': 'bar', 'op': 'add'}], expect_errors=True) self.assertEqual(403, response.status_int) def test_remove_uuid(self): ndict = dbutils.get_test_node() response = self.patch_json('/nodes/%s' % ndict['uuid'], [{'path': '/uuid', 'op': 'remove'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_remove_mandatory_field(self): response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'path': '/driver', 'op': 'remove'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_replace_non_existent_chassis_uuid(self): response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'path': '/chassis_uuid', 'value': 'eeeeeeee-dddd-cccc-bbbb-aaaaaaaaaaaa', 'op': 'replace'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_remove_internal_field(self): response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'path': '/last_error', 'op': 'remove'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_replace_internal_field(self): response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'path': '/power_state', 'op': 'replace', 'value': 'fake-state'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_replace_maintenance(self): self.mock_update_node.return_value = self.node response = self.patch_json('/nodes/%s' % self.node.uuid, [{'path': '/maintenance', 'op': 'replace', 'value': 'true'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) self.mock_update_node.assert_called_once_with( mock.ANY, mock.ANY, 'test-topic') def test_replace_consoled_enabled(self): response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'path': '/console_enabled', 'op': 'replace', 'value': True}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_replace_provision_updated_at(self): test_time = '2000-01-01 00:00:00' response = self.patch_json('/nodes/%s' % self.node['uuid'], [{'path': '/provision_updated_at', 'op': 'replace', 'value': test_time}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) class TestPost(base.FunctionalTest): def setUp(self): super(TestPost, self).setUp() cdict = dbutils.get_test_chassis() self.chassis = self.dbapi.create_chassis(cdict) p = mock.patch.object(rpcapi.ConductorAPI, 'get_topic_for') self.mock_gtf = p.start() self.mock_gtf.return_value = 'test-topic' self.addCleanup(p.stop) @mock.patch.object(timeutils, 'utcnow') def test_create_node(self, mock_utcnow): ndict = post_get_test_node() test_time = datetime.datetime(2000, 1, 1, 0, 0) mock_utcnow.return_value = test_time response = self.post_json('/nodes', ndict) self.assertEqual(201, response.status_int) result = self.get_json('/nodes/%s' % ndict['uuid']) self.assertEqual(ndict['uuid'], result['uuid']) self.assertFalse(result['updated_at']) return_created_at = timeutils.parse_isotime( result['created_at']).replace(tzinfo=None) self.assertEqual(test_time, return_created_at) def test_create_node_valid_extra(self): ndict = post_get_test_node(extra={'foo': 123}) self.post_json('/nodes', ndict) result = self.get_json('/nodes/%s' % ndict['uuid']) self.assertEqual(ndict['extra'], result['extra']) def test_create_node_invalid_extra(self): ndict = post_get_test_node(extra={'foo': 0.123}) response = self.post_json('/nodes', ndict, expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_vendor_passthru_ok(self): ndict = dbutils.get_test_node() self.dbapi.create_node(ndict) uuid = ndict['uuid'] info = {'foo': 'bar'} with mock.patch.object( rpcapi.ConductorAPI, 'vendor_passthru') as mock_vendor: mock_vendor.return_value = 'OK' response = self.post_json('/nodes/%s/vendor_passthru/test' % uuid, info, expect_errors=False) mock_vendor.assert_called_once_with( mock.ANY, uuid, 'test', info, 'test-topic') self.assertEqual('"OK"', response.body) self.assertEqual(202, response.status_code) def test_vendor_passthru_no_such_method(self): ndict = dbutils.get_test_node() self.dbapi.create_node(ndict) uuid = ndict['uuid'] info = {'foo': 'bar'} with mock.patch.object( rpcapi.ConductorAPI, 'vendor_passthru') as mock_vendor: mock_vendor.side_effect = exception.UnsupportedDriverExtension( {'driver': ndict['driver'], 'node': uuid, 'extension': 'test'}) response = self.post_json('/nodes/%s/vendor_passthru/test' % uuid, info, expect_errors=True) mock_vendor.assert_called_once_with( mock.ANY, uuid, 'test', info, 'test-topic') self.assertEqual(400, response.status_code) def test_vendor_passthru_without_method(self): ndict = dbutils.get_test_node() self.dbapi.create_node(ndict) response = self.post_json('/nodes/%s/vendor_passthru' % ndict['uuid'], {'foo': 'bar'}, expect_errors=True) self.assertEqual('application/json', response.content_type, ) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_post_ports_subresource(self): ndict = dbutils.get_test_node() self.dbapi.create_node(ndict) pdict = apiutils.port_post_data(node_id=None) pdict['node_uuid'] = ndict['uuid'] response = self.post_json('/nodes/ports', pdict, expect_errors=True) self.assertEqual(403, response.status_int) def test_create_node_no_mandatory_field_driver(self): ndict = post_get_test_node() del ndict['driver'] response = self.post_json('/nodes', ndict, expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) def test_create_node_invalid_driver(self): ndict = post_get_test_node() self.mock_gtf.side_effect = exception.NoValidHost('Fake Error') response = self.post_json('/nodes', ndict, expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) def test_create_node_no_chassis_uuid(self): ndict = post_get_test_node() del ndict['chassis_uuid'] response = self.post_json('/nodes', ndict) self.assertEqual('application/json', response.content_type) self.assertEqual(201, response.status_int) def test_create_node_chassis_uuid_not_found(self): ndict = post_get_test_node( chassis_uuid='1a1a1a1a-2b2b-3c3c-4d4d-5e5e5e5e5e5e') response = self.post_json('/nodes', ndict, expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_int) self.assertTrue(response.json['error_message']) def test_create_node_with_internal_field(self): ndict = post_get_test_node() ndict['reservation'] = 'fake' response = self.post_json('/nodes', ndict, expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_int) self.assertTrue(response.json['error_message']) class TestDelete(base.FunctionalTest): def setUp(self): super(TestDelete, self).setUp() cdict = dbutils.get_test_chassis() self.chassis = self.dbapi.create_chassis(cdict) p = mock.patch.object(rpcapi.ConductorAPI, 'get_topic_for') self.mock_gtf = p.start() self.mock_gtf.return_value = 'test-topic' self.addCleanup(p.stop) @mock.patch.object(rpcapi.ConductorAPI, 'destroy_node') def test_delete_node(self, mock_dn): ndict = dbutils.get_test_node() self.dbapi.create_node(ndict) self.delete('/nodes/%s' % ndict['uuid']) mock_dn.assert_called_once_with(mock.ANY, ndict['uuid'], 'test-topic') @mock.patch.object(objects.Node, 'get_by_uuid') def test_delete_node_not_found(self, mock_gbu): ndict = dbutils.get_test_node() mock_gbu.side_effect = exception.NodeNotFound(node=ndict['uuid']) response = self.delete('/nodes/%s' % ndict['uuid'], expect_errors=True) self.assertEqual(404, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) mock_gbu.assert_called_once_with(mock.ANY, ndict['uuid']) def test_delete_ports_subresource(self): ndict = dbutils.get_test_node() self.dbapi.create_node(ndict) response = self.delete('/nodes/%s/ports' % ndict['uuid'], expect_errors=True) self.assertEqual(403, response.status_int) @mock.patch.object(rpcapi.ConductorAPI, 'destroy_node') def test_delete_associated(self, mock_dn): ndict = dbutils.get_test_node( instance_uuid='aaaaaaaa-1111-bbbb-2222-cccccccccccc') node = self.dbapi.create_node(ndict) mock_dn.side_effect = exception.NodeAssociated(node=node.uuid, instance=node.instance_uuid) response = self.delete('/nodes/%s' % ndict['uuid'], expect_errors=True) self.assertEqual(409, response.status_int) mock_dn.assert_called_once_with(mock.ANY, node.uuid, 'test-topic') class TestPut(base.FunctionalTest): def setUp(self): super(TestPut, self).setUp() cdict = dbutils.get_test_chassis() self.chassis = self.dbapi.create_chassis(cdict) ndict = dbutils.get_test_node() self.node = self.dbapi.create_node(ndict) p = mock.patch.object(rpcapi.ConductorAPI, 'get_topic_for') self.mock_gtf = p.start() self.mock_gtf.return_value = 'test-topic' self.addCleanup(p.stop) p = mock.patch.object(rpcapi.ConductorAPI, 'change_node_power_state') self.mock_cnps = p.start() self.addCleanup(p.stop) p = mock.patch.object(rpcapi.ConductorAPI, 'do_node_deploy') self.mock_dnd = p.start() self.addCleanup(p.stop) p = mock.patch.object(rpcapi.ConductorAPI, 'do_node_tear_down') self.mock_dntd = p.start() self.addCleanup(p.stop) def test_power_state(self): response = self.put_json('/nodes/%s/states/power' % self.node['uuid'], {'target': states.POWER_ON}) self.assertEqual(202, response.status_code) self.assertEqual('', response.body) self.mock_cnps.assert_called_once_with(mock.ANY, self.node['uuid'], states.POWER_ON, 'test-topic') def test_power_invalid_state_request(self): ret = self.put_json('/nodes/%s/states/power' % self.node.uuid, {'target': 'not-supported'}, expect_errors=True) self.assertEqual(400, ret.status_code) def test_provision_with_deploy(self): ret = self.put_json('/nodes/%s/states/provision' % self.node.uuid, {'target': states.ACTIVE}) self.assertEqual(202, ret.status_code) self.assertEqual('', ret.body) self.mock_dnd.assert_called_once_with( mock.ANY, self.node.uuid, 'test-topic') def test_provision_with_tear_down(self): ret = self.put_json('/nodes/%s/states/provision' % self.node.uuid, {'target': states.DELETED}) self.assertEqual(202, ret.status_code) self.assertEqual('', ret.body) self.mock_dntd.assert_called_once_with( mock.ANY, self.node.uuid, 'test-topic') def test_provision_invalid_state_request(self): ret = self.put_json('/nodes/%s/states/provision' % self.node.uuid, {'target': 'not-supported'}, expect_errors=True) self.assertEqual(400, ret.status_code) def test_provision_already_in_progress(self): ndict = dbutils.get_test_node(id=1, uuid=utils.generate_uuid(), target_provision_state=states.ACTIVE) node = self.dbapi.create_node(ndict) ret = self.put_json('/nodes/%s/states/provision' % node.uuid, {'target': states.ACTIVE}, expect_errors=True) self.assertEqual(409, ret.status_code) # Conflict def test_provision_with_tear_down_in_progress_deploywait(self): ndict = dbutils.get_test_node(id=1, uuid=utils.generate_uuid(), provision_state=states.DEPLOYWAIT, target_provision_state=states.DEPLOYDONE) node = self.dbapi.create_node(ndict) ret = self.put_json('/nodes/%s/states/provision' % node.uuid, {'target': states.DELETED}) self.assertEqual(202, ret.status_code) self.assertEqual('', ret.body) self.mock_dntd.assert_called_once_with( mock.ANY, node.uuid, 'test-topic') def test_provision_already_in_state(self): ndict = dbutils.get_test_node(id=1, uuid=utils.generate_uuid(), target_provision_state=states.NOSTATE, provision_state=states.ACTIVE) node = self.dbapi.create_node(ndict) ret = self.put_json('/nodes/%s/states/provision' % node.uuid, {'target': states.ACTIVE}, expect_errors=True) self.assertEqual(400, ret.status_code) def test_set_console_mode_enabled(self): with mock.patch.object(rpcapi.ConductorAPI, 'set_console_mode') \ as mock_scm: ret = self.put_json('/nodes/%s/states/console' % self.node.uuid, {'enabled': "true"}) self.assertEqual(202, ret.status_code) self.assertEqual('', ret.body) mock_scm.assert_called_once_with(mock.ANY, self.node.uuid, True, 'test-topic') def test_set_console_mode_disabled(self): with mock.patch.object(rpcapi.ConductorAPI, 'set_console_mode') \ as mock_scm: ret = self.put_json('/nodes/%s/states/console' % self.node.uuid, {'enabled': "false"}) self.assertEqual(202, ret.status_code) self.assertEqual('', ret.body) mock_scm.assert_called_once_with(mock.ANY, self.node.uuid, False, 'test-topic') def test_set_console_mode_bad_request(self): with mock.patch.object(rpcapi.ConductorAPI, 'set_console_mode') \ as mock_scm: ret = self.put_json('/nodes/%s/states/console' % self.node.uuid, {'enabled': "invalid-value"}, expect_errors=True) self.assertEqual(400, ret.status_code) # assert set_console_mode wasn't called assert not mock_scm.called def test_set_console_mode_bad_request_missing_parameter(self): with mock.patch.object(rpcapi.ConductorAPI, 'set_console_mode') \ as mock_scm: ret = self.put_json('/nodes/%s/states/console' % self.node.uuid, {}, expect_errors=True) self.assertEqual(400, ret.status_code) # assert set_console_mode wasn't called assert not mock_scm.called def test_set_console_mode_console_not_supported(self): with mock.patch.object(rpcapi.ConductorAPI, 'set_console_mode') \ as mock_scm: mock_scm.side_effect = exception.UnsupportedDriverExtension( extension='console', driver='test-driver') ret = self.put_json('/nodes/%s/states/console' % self.node.uuid, {'enabled': "true"}, expect_errors=True) self.assertEqual(400, ret.status_code) mock_scm.assert_called_once_with(mock.ANY, self.node.uuid, True, 'test-topic') def test_provision_node_in_maintenance_fail(self): with mock.patch.object(rpcapi.ConductorAPI, 'do_node_deploy') as dnd: ndict = dbutils.get_test_node(id=1, uuid=utils.generate_uuid(), maintenance=True) node = self.dbapi.create_node(ndict) dnd.side_effect = exception.NodeInMaintenance(op='provisioning', node=node.uuid) ret = self.put_json('/nodes/%s/states/provision' % node.uuid, {'target': states.ACTIVE}, expect_errors=True) self.assertEqual(400, ret.status_code) self.assertTrue(ret.json['error_message']) ironic-2014.1.rc1/ironic/tests/api/v1/test_types.py0000664000175300017540000001611312316614116023211 0ustar jenkinsjenkins00000000000000# coding: utf-8 # # Copyright 2013 Red Hat, Inc. # 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 mock import six import webtest import wsme from ironic.api.controllers.v1 import types from ironic.common import exception from ironic.common import utils from ironic.tests.api import base class TestMacAddressType(base.FunctionalTest): def test_valid_mac_addr(self): test_mac = 'aa:bb:cc:11:22:33' with mock.patch.object(utils, 'validate_and_normalize_mac') as m_mock: types.MacAddressType.validate(test_mac) m_mock.assert_called_once_with(test_mac) def test_invalid_mac_addr(self): self.assertRaises(exception.InvalidMAC, types.MacAddressType.validate, 'invalid-mac') class TestUuidType(base.FunctionalTest): def test_valid_uuid(self): test_uuid = '1a1a1a1a-2b2b-3c3c-4d4d-5e5e5e5e5e5e' with mock.patch.object(utils, 'is_uuid_like') as uuid_mock: types.UuidType.validate(test_uuid) uuid_mock.assert_called_once_with(test_uuid) def test_invalid_uuid(self): self.assertRaises(exception.InvalidUUID, types.UuidType.validate, 'invalid-uuid') class MyPatchType(types.JsonPatchType): """Helper class for TestJsonPatchType tests.""" @staticmethod def mandatory_attrs(): return ['/mandatory'] @staticmethod def internal_attrs(): return ['/internal'] class MyRoot(wsme.WSRoot): """Helper class for TestJsonPatchType tests.""" @wsme.expose([wsme.types.text], body=[MyPatchType]) @wsme.validate([MyPatchType]) def test(self, patch): return patch class TestJsonPatchType(base.FunctionalTest): def setUp(self): super(TestJsonPatchType, self).setUp() self.app = webtest.TestApp(MyRoot(['restjson']).wsgiapp()) def _patch_json(self, params, expect_errors=False): return self.app.patch_json('/test', params=params, headers={'Accept': 'application/json'}, expect_errors=expect_errors) def test_valid_patches(self): valid_patches = [{'path': '/extra/foo', 'op': 'remove'}, {'path': '/extra/foo', 'op': 'add', 'value': 'bar'}, {'path': '/foo', 'op': 'replace', 'value': 'bar'}] ret = self._patch_json(valid_patches, False) self.assertEqual(200, ret.status_int) self.assertEqual(sorted(valid_patches), sorted(ret.json)) def test_cannot_update_internal_attr(self): patch = [{'path': '/internal', 'op': 'replace', 'value': 'foo'}] ret = self._patch_json(patch, True) self.assertEqual(400, ret.status_int) self.assertTrue(ret.json['faultstring']) def test_mandatory_attr(self): patch = [{'op': 'replace', 'path': '/mandatory', 'value': 'foo'}] ret = self._patch_json(patch, False) self.assertEqual(200, ret.status_int) self.assertEqual(patch, ret.json) def test_cannot_remove_mandatory_attr(self): patch = [{'op': 'remove', 'path': '/mandatory'}] ret = self._patch_json(patch, True) self.assertEqual(400, ret.status_int) self.assertTrue(ret.json['faultstring']) def test_missing_required_fields_path(self): missing_path = [{'op': 'remove'}] ret = self._patch_json(missing_path, True) self.assertEqual(400, ret.status_int) self.assertTrue(ret.json['faultstring']) def test_missing_required_fields_op(self): missing_op = [{'path': '/foo'}] ret = self._patch_json(missing_op, True) self.assertEqual(400, ret.status_int) self.assertTrue(ret.json['faultstring']) def test_invalid_op(self): patch = [{'path': '/foo', 'op': 'invalid'}] ret = self._patch_json(patch, True) self.assertEqual(400, ret.status_int) self.assertTrue(ret.json['faultstring']) def test_invalid_path(self): patch = [{'path': 'invalid-path', 'op': 'remove'}] ret = self._patch_json(patch, True) self.assertEqual(400, ret.status_int) self.assertTrue(ret.json['faultstring']) def test_cannot_add_to_root(self): patch = [{'path': '/foo', 'op': 'add', 'value': 'bar'}] ret = self._patch_json(patch, True) self.assertEqual(400, ret.status_int) self.assertTrue(ret.json['faultstring']) def test_cannot_add_with_no_value(self): patch = [{'path': '/extra/foo', 'op': 'add'}] ret = self._patch_json(patch, True) self.assertEqual(400, ret.status_int) self.assertTrue(ret.json['faultstring']) def test_cannot_replace_with_no_value(self): patch = [{'path': '/foo', 'op': 'replace'}] ret = self._patch_json(patch, True) self.assertEqual(400, ret.status_int) self.assertTrue(ret.json['faultstring']) class TestMultiType(base.FunctionalTest): def test_valid_values(self): vt = types.MultiType(wsme.types.text, six.integer_types) value = vt.validate("hello") self.assertEqual("hello", value) value = vt.validate(10) self.assertEqual(10, value) def test_invalid_values(self): vt = types.MultiType(wsme.types.text, six.integer_types) self.assertRaises(ValueError, vt.validate, 0.10) self.assertRaises(ValueError, vt.validate, object()) def test_multitype_tostring(self): vt = types.MultiType(str, int) vts = str(vt) self.assertIn(str(str), vts) self.assertIn(str(int), vts) class TestBooleanType(base.FunctionalTest): def test_valid_true_values(self): v = types.BooleanType() self.assertTrue(v.validate("true")) self.assertTrue(v.validate("TRUE")) self.assertTrue(v.validate("True")) self.assertTrue(v.validate("t")) self.assertTrue(v.validate("1")) self.assertTrue(v.validate("y")) self.assertTrue(v.validate("yes")) self.assertTrue(v.validate("on")) def test_valid_false_values(self): v = types.BooleanType() self.assertFalse(v.validate("false")) self.assertFalse(v.validate("FALSE")) self.assertFalse(v.validate("False")) self.assertFalse(v.validate("f")) self.assertFalse(v.validate("0")) self.assertFalse(v.validate("n")) self.assertFalse(v.validate("no")) self.assertFalse(v.validate("off")) def test_invalid_value(self): v = types.BooleanType() self.assertRaises(exception.Invalid, v.validate, "invalid-value") self.assertRaises(exception.Invalid, v.validate, "01") ironic-2014.1.rc1/ironic/tests/api/v1/test_chassis.py0000664000175300017540000004040412316614116023502 0ustar jenkinsjenkins00000000000000# -*- encoding: 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. """ Tests for the API /chassis/ methods. """ import datetime import mock from oslo.config import cfg from ironic.common import utils from ironic.openstack.common import timeutils from ironic.tests.api import base from ironic.tests.api import utils as apiutils from ironic.tests.db import utils as dbutils class TestListChassis(base.FunctionalTest): def test_empty(self): data = self.get_json('/chassis') self.assertEqual([], data['chassis']) def test_one(self): ndict = dbutils.get_test_chassis() chassis = self.dbapi.create_chassis(ndict) data = self.get_json('/chassis') self.assertEqual(chassis['uuid'], data['chassis'][0]["uuid"]) self.assertNotIn('extra', data['chassis'][0]) self.assertNotIn('nodes', data['chassis'][0]) def test_detail(self): cdict = dbutils.get_test_chassis() chassis = self.dbapi.create_chassis(cdict) data = self.get_json('/chassis/detail') self.assertEqual(chassis['uuid'], data['chassis'][0]["uuid"]) self.assertIn('extra', data['chassis'][0]) self.assertIn('nodes', data['chassis'][0]) def test_detail_against_single(self): cdict = dbutils.get_test_chassis() chassis = self.dbapi.create_chassis(cdict) response = self.get_json('/chassis/%s/detail' % chassis['uuid'], expect_errors=True) self.assertEqual(404, response.status_int) def test_many(self): ch_list = [] for id in range(5): ndict = dbutils.get_test_chassis(id=id, uuid=utils.generate_uuid()) chassis = self.dbapi.create_chassis(ndict) ch_list.append(chassis['uuid']) data = self.get_json('/chassis') self.assertEqual(len(ch_list), len(data['chassis'])) uuids = [n['uuid'] for n in data['chassis']] self.assertEqual(ch_list.sort(), uuids.sort()) def test_links(self): uuid = utils.generate_uuid() ndict = dbutils.get_test_chassis(id=1, uuid=uuid) self.dbapi.create_chassis(ndict) data = self.get_json('/chassis/%s' % uuid) self.assertIn('links', data.keys()) self.assertEqual(2, len(data['links'])) self.assertIn(uuid, data['links'][0]['href']) self.assertTrue(self.validate_link(data['links'][0]['href'])) self.assertTrue(self.validate_link(data['links'][1]['href'])) def test_collection_links(self): chassis = [] for id in range(5): ndict = dbutils.get_test_chassis(id=id, uuid=utils.generate_uuid()) ch = self.dbapi.create_chassis(ndict) chassis.append(ch['uuid']) data = self.get_json('/chassis/?limit=3') self.assertEqual(3, len(data['chassis'])) next_marker = data['chassis'][-1]['uuid'] self.assertIn(next_marker, data['next']) def test_collection_links_default_limit(self): cfg.CONF.set_override('max_limit', 3, 'api') chassis = [] for id in range(5): ndict = dbutils.get_test_chassis(id=id, uuid=utils.generate_uuid()) ch = self.dbapi.create_chassis(ndict) chassis.append(ch['uuid']) data = self.get_json('/chassis') self.assertEqual(3, len(data['chassis'])) next_marker = data['chassis'][-1]['uuid'] self.assertIn(next_marker, data['next']) def test_nodes_subresource_link(self): ndict = dbutils.get_test_chassis() self.dbapi.create_chassis(ndict) data = self.get_json('/chassis/%s' % ndict['uuid']) self.assertIn('nodes', data.keys()) def test_nodes_subresource(self): cdict = dbutils.get_test_chassis() self.dbapi.create_chassis(cdict) for id in range(2): ndict = dbutils.get_test_node(id=id, chassis_id=cdict['id'], uuid=utils.generate_uuid()) self.dbapi.create_node(ndict) data = self.get_json('/chassis/%s/nodes' % cdict['uuid']) self.assertEqual(2, len(data['nodes'])) self.assertNotIn('next', data.keys()) # Test collection pagination data = self.get_json('/chassis/%s/nodes?limit=1' % cdict['uuid']) self.assertEqual(1, len(data['nodes'])) self.assertIn('next', data.keys()) def test_nodes_subresource_no_uuid(self): response = self.get_json('/chassis/nodes', expect_errors=True) self.assertEqual(400, response.status_int) def test_nodes_subresource_chassis_not_found(self): non_existent_uuid = 'eeeeeeee-cccc-aaaa-bbbb-cccccccccccc' response = self.get_json('/chassis/%s/nodes' % non_existent_uuid, expect_errors=True) self.assertEqual(404, response.status_int) class TestPatch(base.FunctionalTest): def setUp(self): super(TestPatch, self).setUp() cdict = dbutils.get_test_chassis() self.dbapi.create_chassis(cdict) def test_update_not_found(self): uuid = utils.generate_uuid() response = self.patch_json('/chassis/%s' % uuid, [{'path': '/extra/a', 'value': 'b', 'op': 'add'}], expect_errors=True) self.assertEqual(404, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) @mock.patch.object(timeutils, 'utcnow') def test_replace_singular(self, mock_utcnow): cdict = dbutils.get_test_chassis() description = 'chassis-new-description' test_time = datetime.datetime(2000, 1, 1, 0, 0) mock_utcnow.return_value = test_time response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/description', 'value': description, 'op': 'replace'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/chassis/%s' % cdict['uuid']) self.assertEqual(description, result['description']) return_updated_at = timeutils.parse_isotime( result['updated_at']).replace(tzinfo=None) self.assertEqual(test_time, return_updated_at) def test_replace_multi(self): extra = {"foo1": "bar1", "foo2": "bar2", "foo3": "bar3"} cdict = dbutils.get_test_chassis(extra=extra, uuid=utils.generate_uuid(), id=None) self.dbapi.create_chassis(cdict) new_value = 'new value' response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/extra/foo2', 'value': new_value, 'op': 'replace'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/chassis/%s' % cdict['uuid']) extra["foo2"] = new_value self.assertEqual(extra, result['extra']) def test_remove_singular(self): cdict = dbutils.get_test_chassis(extra={'a': 'b'}, uuid=utils.generate_uuid(), id=None) self.dbapi.create_chassis(cdict) response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/description', 'op': 'remove'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/chassis/%s' % cdict['uuid']) self.assertIsNone(result['description']) # Assert nothing else was changed self.assertEqual(cdict['uuid'], result['uuid']) self.assertEqual(cdict['extra'], result['extra']) def test_remove_multi(self): extra = {"foo1": "bar1", "foo2": "bar2", "foo3": "bar3"} cdict = dbutils.get_test_chassis(extra=extra, description="foobar", uuid=utils.generate_uuid(), id=None) self.dbapi.create_chassis(cdict) # Removing one item from the collection response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/extra/foo2', 'op': 'remove'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/chassis/%s' % cdict['uuid']) extra.pop("foo2") self.assertEqual(extra, result['extra']) # Removing the collection response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/extra', 'op': 'remove'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/chassis/%s' % cdict['uuid']) self.assertEqual({}, result['extra']) # Assert nothing else was changed self.assertEqual(cdict['uuid'], result['uuid']) self.assertEqual(cdict['description'], result['description']) def test_remove_non_existent_property_fail(self): cdict = dbutils.get_test_chassis() response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/extra/non-existent', 'op': 'remove'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_add_singular(self): cdict = dbutils.get_test_chassis() response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/foo', 'value': 'bar', 'op': 'add'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_int) self.assertTrue(response.json['error_message']) def test_add_multi(self): cdict = dbutils.get_test_chassis() response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/extra/foo1', 'value': 'bar1', 'op': 'add'}, {'path': '/extra/foo2', 'value': 'bar2', 'op': 'add'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/chassis/%s' % cdict['uuid']) expected = {"foo1": "bar1", "foo2": "bar2"} self.assertEqual(expected, result['extra']) def test_patch_nodes_subresource(self): cdict = dbutils.get_test_chassis() response = self.patch_json('/chassis/%s/nodes' % cdict['uuid'], [{'path': '/extra/foo', 'value': 'bar', 'op': 'add'}], expect_errors=True) self.assertEqual(403, response.status_int) def test_remove_uuid(self): cdict = dbutils.get_test_chassis() response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/uuid', 'op': 'remove'}], expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) class TestPost(base.FunctionalTest): @mock.patch.object(timeutils, 'utcnow') def test_create_chassis(self, mock_utcnow): cdict = apiutils.chassis_post_data() test_time = datetime.datetime(2000, 1, 1, 0, 0) mock_utcnow.return_value = test_time response = self.post_json('/chassis', cdict) self.assertEqual(201, response.status_int) result = self.get_json('/chassis/%s' % cdict['uuid']) self.assertEqual(cdict['uuid'], result['uuid']) self.assertFalse(result['updated_at']) return_created_at = timeutils.parse_isotime( result['created_at']).replace(tzinfo=None) self.assertEqual(test_time, return_created_at) def test_create_chassis_generate_uuid(self): cdict = apiutils.chassis_post_data() del cdict['uuid'] self.post_json('/chassis', cdict) result = self.get_json('/chassis') self.assertEqual(cdict['description'], result['chassis'][0]['description']) self.assertTrue(utils.is_uuid_like(result['chassis'][0]['uuid'])) def test_post_nodes_subresource(self): cdict = dbutils.get_test_chassis() self.dbapi.create_chassis(cdict) ndict = apiutils.node_post_data(chassis_id=None) ndict['chassis_uuid'] = cdict['uuid'] response = self.post_json('/chassis/nodes', ndict, expect_errors=True) self.assertEqual(403, response.status_int) def test_create_chassis_valid_extra(self): cdict = apiutils.chassis_post_data(extra={'foo': 123}) self.post_json('/chassis', cdict) result = self.get_json('/chassis/%s' % cdict['uuid']) self.assertEqual(cdict['extra'], result['extra']) def test_create_chassis_invalid_extra(self): cdict = apiutils.chassis_post_data(extra={'foo': 0.123}) response = self.post_json('/chassis', cdict, expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) def test_create_chassis_unicode_description(self): descr = u'\u0430\u043c\u043e' cdict = apiutils.chassis_post_data(description=descr) self.post_json('/chassis', cdict) result = self.get_json('/chassis/%s' % cdict['uuid']) self.assertEqual(descr, result['description']) class TestDelete(base.FunctionalTest): def test_delete_chassis(self): cdict = dbutils.get_test_chassis() self.dbapi.create_chassis(cdict) self.delete('/chassis/%s' % cdict['uuid']) response = self.get_json('/chassis/%s' % cdict['uuid'], expect_errors=True) self.assertEqual(404, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) def test_delete_chassis_with_node(self): cdict = dbutils.get_test_chassis() self.dbapi.create_chassis(cdict) ndict = dbutils.get_test_node(chassis_id=cdict['id']) self.dbapi.create_node(ndict) response = self.delete('/chassis/%s' % cdict['uuid'], expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) def test_delete_chassis_not_found(self): uuid = utils.generate_uuid() response = self.delete('/chassis/%s' % uuid, expect_errors=True) self.assertEqual(404, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) def test_delete_nodes_subresource(self): cdict = dbutils.get_test_chassis() self.dbapi.create_chassis(cdict) response = self.delete('/chassis/%s/nodes' % cdict['uuid'], expect_errors=True) self.assertEqual(403, response.status_int) ironic-2014.1.rc1/ironic/tests/api/v1/__init__.py0000664000175300017540000000000012316614116022531 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic/tests/api/v1/test_utils.py0000664000175300017540000000265112316614116023207 0ustar jenkinsjenkins00000000000000# Copyright 2013 Red Hat, Inc. # 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 wsme from ironic.api.controllers.v1 import utils from ironic.tests.api import base from oslo.config import cfg CONF = cfg.CONF class TestApiUtils(base.FunctionalTest): def test_validate_limit(self): limit = utils.validate_limit(10) self.assertEqual(10, 10) # max limit limit = utils.validate_limit(999999999) self.assertEqual(CONF.api.max_limit, limit) # negative self.assertRaises(wsme.exc.ClientSideError, utils.validate_limit, -1) def test_validate_sort_dir(self): sort_dir = utils.validate_sort_dir('asc') self.assertEqual('asc', sort_dir) # invalid sort_dir parameter self.assertRaises(wsme.exc.ClientSideError, utils.validate_sort_dir, 'fake-sort') ironic-2014.1.rc1/ironic/tests/api/v1/test_drivers.py0000664000175300017540000000472112316614116023525 0ustar jenkinsjenkins00000000000000# Copyright 2013 Red Hat, Inc. # 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 testtools.matchers import HasLength from ironic.tests.api import base class TestListDrivers(base.FunctionalTest): d1 = 'fake-driver1' d2 = 'fake-driver2' h1 = 'fake-host1' h2 = 'fake-host2' def register_fake_conductors(self): self.dbapi.register_conductor({ 'hostname': self.h1, 'drivers': [self.d1, self.d2], }) self.dbapi.register_conductor({ 'hostname': self.h2, 'drivers': [self.d2], }) def test_drivers(self): self.register_fake_conductors() expected = sorted([ {'name': self.d1, 'hosts': [self.h1]}, {'name': self.d2, 'hosts': [self.h1, self.h2]}, ]) data = self.get_json('/drivers') self.assertThat(data['drivers'], HasLength(2)) drivers = sorted(data['drivers']) for i in range(len(expected)): driver = drivers[i] self.assertEqual(expected[i]['name'], driver['name']) self.assertEqual(expected[i]['hosts'], driver['hosts']) self.validate_link(driver['links'][0]['href']) self.validate_link(driver['links'][1]['href']) def test_drivers_no_active_conductor(self): data = self.get_json('/drivers') self.assertThat(data['drivers'], HasLength(0)) self.assertEqual([], data['drivers']) def test_drivers_get_one_ok(self): self.register_fake_conductors() data = self.get_json('/drivers/%s' % self.d1) self.assertEqual(self.d1, data['name']) self.assertEqual([self.h1], data['hosts']) self.validate_link(data['links'][0]['href']) self.validate_link(data['links'][1]['href']) def test_drivers_get_one_not_found(self): response = self.get_json('/drivers/' + self.d1, expect_errors=True) self.assertEqual(404, response.status_int) ironic-2014.1.rc1/ironic/tests/api/v1/test_ports.py0000664000175300017540000005256412316614116023226 0ustar jenkinsjenkins00000000000000# -*- encoding: 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. """ Tests for the API /ports/ methods. """ import datetime import fixtures import mock from oslo.config import cfg from ironic.common import utils from ironic.conductor import manager from ironic.openstack.common import timeutils from ironic.tests.api import base from ironic.tests.api import utils as apiutils from ironic.tests.db import utils as dbutils # NOTE(lucasagomes): When creating a port via API (POST) # we have to use node_uuid def post_get_test_port(**kw): port = apiutils.port_post_data(**kw) node = dbutils.get_test_node() del port['node_id'] port['node_uuid'] = kw.get('node_uuid', node['uuid']) return port class TestListPorts(base.FunctionalTest): def setUp(self): super(TestListPorts, self).setUp() ndict = dbutils.get_test_node() self.node = self.dbapi.create_node(ndict) def test_empty(self): data = self.get_json('/ports') self.assertEqual([], data['ports']) def test_one(self): ndict = dbutils.get_test_port() port = self.dbapi.create_port(ndict) data = self.get_json('/ports') self.assertEqual(port['uuid'], data['ports'][0]["uuid"]) self.assertNotIn('extra', data['ports'][0]) self.assertNotIn('node_uuid', data['ports'][0]) # never expose the node_id self.assertNotIn('node_id', data['ports'][0]) def test_detail(self): pdict = dbutils.get_test_port() port = self.dbapi.create_port(pdict) data = self.get_json('/ports/detail') self.assertEqual(port['uuid'], data['ports'][0]["uuid"]) self.assertIn('extra', data['ports'][0]) self.assertIn('node_uuid', data['ports'][0]) # never expose the node_id self.assertNotIn('node_id', data['ports'][0]) def test_detail_against_single(self): pdict = dbutils.get_test_port() port = self.dbapi.create_port(pdict) response = self.get_json('/ports/%s/detail' % port['uuid'], expect_errors=True) self.assertEqual(404, response.status_int) def test_many(self): ports = [] for id in range(5): ndict = dbutils.get_test_port(id=id, uuid=utils.generate_uuid(), address='52:54:00:cf:2d:3%s' % id) port = self.dbapi.create_port(ndict) ports.append(port['uuid']) data = self.get_json('/ports') self.assertEqual(len(ports), len(data['ports'])) uuids = [n['uuid'] for n in data['ports']] self.assertEqual(ports.sort(), uuids.sort()) def test_links(self): uuid = utils.generate_uuid() ndict = dbutils.get_test_port(id=1, uuid=uuid) self.dbapi.create_port(ndict) data = self.get_json('/ports/%s' % uuid) self.assertIn('links', data.keys()) self.assertEqual(2, len(data['links'])) self.assertIn(uuid, data['links'][0]['href']) self.assertTrue(self.validate_link(data['links'][0]['href'])) self.assertTrue(self.validate_link(data['links'][1]['href'])) def test_collection_links(self): ports = [] for id in range(5): ndict = dbutils.get_test_port(id=id, uuid=utils.generate_uuid(), address='52:54:00:cf:2d:3%s' % id) port = self.dbapi.create_port(ndict) ports.append(port['uuid']) data = self.get_json('/ports/?limit=3') self.assertEqual(3, len(data['ports'])) next_marker = data['ports'][-1]['uuid'] self.assertIn(next_marker, data['next']) def test_collection_links_default_limit(self): cfg.CONF.set_override('max_limit', 3, 'api') ports = [] for id in range(5): ndict = dbutils.get_test_port(id=id, uuid=utils.generate_uuid(), address='52:54:00:cf:2d:3%s' % id) port = self.dbapi.create_port(ndict) ports.append(port['uuid']) data = self.get_json('/ports') self.assertEqual(3, len(data['ports'])) next_marker = data['ports'][-1]['uuid'] self.assertIn(next_marker, data['next']) class TestPatch(base.FunctionalTest): def setUp(self): super(TestPatch, self).setUp() ndict = dbutils.get_test_node() self.node = self.dbapi.create_node(ndict) self.pdict = dbutils.get_test_port(id=None) self.dbapi.create_port(self.pdict) def noop(*args, **kwargs): pass self.useFixture(fixtures.MonkeyPatch( 'ironic.conductor.rpcapi.ConductorAPI.get_topic_for', noop)) service = manager.ConductorManager('test-host', 'test-topic') def manager_update_port(*args, **kwargs): return service.update_port(*args[1:3]) self.useFixture(fixtures.MonkeyPatch( 'ironic.conductor.rpcapi.ConductorAPI.update_port', manager_update_port)) @mock.patch.object(timeutils, 'utcnow') def test_update_byid(self, mock_utcnow): extra = {'foo': 'bar'} test_time = datetime.datetime(2000, 1, 1, 0, 0) mock_utcnow.return_value = test_time response = self.patch_json('/ports/%s' % self.pdict['uuid'], [{'path': '/extra/foo', 'value': 'bar', 'op': 'add'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/ports/%s' % self.pdict['uuid']) self.assertEqual(extra, result['extra']) return_updated_at = timeutils.parse_isotime( result['updated_at']).replace(tzinfo=None) self.assertEqual(test_time, return_updated_at) def test_update_byaddress(self): response = self.patch_json('/ports/%s' % self.pdict['address'], [{'path': '/extra/foo', 'value': 'bar', 'op': 'add'}], expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertIn(self.pdict['address'], response.json['error_message']) def test_update_not_found(self): uuid = utils.generate_uuid() response = self.patch_json('/ports/%s' % uuid, [{'path': '/extra/a', 'value': 'b', 'op': 'add'}], expect_errors=True) self.assertEqual(404, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) def test_replace_singular(self): address = 'aa:bb:cc:dd:ee:ff' response = self.patch_json('/ports/%s' % self.pdict['uuid'], [{'path': '/address', 'value': address, 'op': 'replace'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/ports/%s' % self.pdict['uuid']) self.assertEqual(address, result['address']) def test_replace_address_already_exist(self): pdict1 = dbutils.get_test_port(address='aa:aa:aa:aa:aa:aa', uuid=utils.generate_uuid(), id=None) self.dbapi.create_port(pdict1) pdict2 = dbutils.get_test_port(address='bb:bb:bb:bb:bb:bb', uuid=utils.generate_uuid(), id=None) self.dbapi.create_port(pdict2) response = self.patch_json('/ports/%s' % pdict1['uuid'], [{'path': '/address', 'value': pdict2['address'], 'op': 'replace'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(409, response.status_code) self.assertTrue(response.json['error_message']) def test_replace_nodeid_dont_exist(self): response = self.patch_json('/ports/%s' % self.pdict['uuid'], [{'path': '/node_uuid', 'value': '12506333-a81c-4d59-9987-889ed5f8687b', 'op': 'replace'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_replace_multi(self): extra = {"foo1": "bar1", "foo2": "bar2", "foo3": "bar3"} pdict = dbutils.get_test_port(extra=extra, address="AA:BB:CC:DD:EE:FF", uuid=utils.generate_uuid()) self.dbapi.create_port(pdict) new_value = 'new value' response = self.patch_json('/ports/%s' % pdict['uuid'], [{'path': '/extra/foo2', 'value': new_value, 'op': 'replace'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/ports/%s' % pdict['uuid']) extra["foo2"] = new_value self.assertEqual(extra, result['extra']) def test_remove_multi(self): extra = {"foo1": "bar1", "foo2": "bar2", "foo3": "bar3"} pdict = dbutils.get_test_port(extra=extra, address="aa:bb:cc:dd:ee:ff", uuid=utils.generate_uuid()) self.dbapi.create_port(pdict) # Removing one item from the collection response = self.patch_json('/ports/%s' % pdict['uuid'], [{'path': '/extra/foo2', 'op': 'remove'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/ports/%s' % pdict['uuid']) extra.pop("foo2") self.assertEqual(extra, result['extra']) # Removing the collection response = self.patch_json('/ports/%s' % pdict['uuid'], [{'path': '/extra', 'op': 'remove'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/ports/%s' % pdict['uuid']) self.assertEqual({}, result['extra']) # Assert nothing else was changed self.assertEqual(pdict['uuid'], result['uuid']) self.assertEqual(pdict['address'], result['address']) def test_remove_non_existent_property_fail(self): response = self.patch_json('/ports/%s' % self.pdict['uuid'], [{'path': '/extra/non-existent', 'op': 'remove'}], expect_errors=True) self.assertEqual('application/json', response.content_type, ) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_remove_mandatory_field(self): pdict = dbutils.get_test_port(address="AA:BB:CC:DD:EE:FF", uuid=utils.generate_uuid()) self.dbapi.create_port(pdict) response = self.patch_json('/ports/%s' % pdict['uuid'], [{'path': '/address', 'op': 'remove'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message']) def test_add_singular(self): response = self.patch_json('/ports/%s' % self.pdict['uuid'], [{'path': '/foo', 'value': 'bar', 'op': 'add'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_int) self.assertTrue(response.json['error_message']) def test_add_multi(self): response = self.patch_json('/ports/%s' % self.pdict['uuid'], [{'path': '/extra/foo1', 'value': 'bar1', 'op': 'add'}, {'path': '/extra/foo2', 'value': 'bar2', 'op': 'add'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/ports/%s' % self.pdict['uuid']) expected = {"foo1": "bar1", "foo2": "bar2"} self.assertEqual(expected, result['extra']) def test_remove_uuid(self): response = self.patch_json('/ports/%s' % self.pdict['uuid'], [{'path': '/uuid', 'op': 'remove'}], expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) def test_update_address_invalid_format(self): pdict = dbutils.get_test_port(address="AA:BB:CC:DD:EE:FF", uuid=utils.generate_uuid()) self.dbapi.create_port(pdict) response = self.patch_json('/ports/%s' % pdict['uuid'], [{'path': '/address', 'value': 'invalid-format', 'op': 'replace'}], expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) def test_update_port_address_normalized(self): new_address = 'AA:BB:CC:DD:EE:FF' response = self.patch_json('/ports/%s' % self.pdict['uuid'], [{'path': '/address', 'value': new_address, 'op': 'replace'}]) self.assertEqual(200, response.status_code) result = self.get_json('/ports/%s' % self.pdict['uuid']) self.assertEqual(new_address.lower(), result['address']) class TestPost(base.FunctionalTest): def setUp(self): super(TestPost, self).setUp() ndict = dbutils.get_test_node() self.node = self.dbapi.create_node(ndict) @mock.patch.object(timeutils, 'utcnow') def test_create_port(self, mock_utcnow): pdict = post_get_test_port() test_time = datetime.datetime(2000, 1, 1, 0, 0) mock_utcnow.return_value = test_time response = self.post_json('/ports', pdict) self.assertEqual(201, response.status_int) result = self.get_json('/ports/%s' % pdict['uuid']) self.assertEqual(pdict['uuid'], result['uuid']) self.assertFalse(result['updated_at']) return_created_at = timeutils.parse_isotime( result['created_at']).replace(tzinfo=None) self.assertEqual(test_time, return_created_at) def test_create_port_generate_uuid(self): pdict = post_get_test_port() del pdict['uuid'] response = self.post_json('/ports', pdict) result = self.get_json('/ports/%s' % response.json['uuid']) self.assertEqual(pdict['address'], result['address']) self.assertTrue(utils.is_uuid_like(result['uuid'])) def test_create_port_valid_extra(self): pdict = post_get_test_port(extra={'foo': 123}) self.post_json('/ports', pdict) result = self.get_json('/ports/%s' % pdict['uuid']) self.assertEqual(pdict['extra'], result['extra']) def test_create_port_invalid_extra(self): pdict = post_get_test_port(extra={'foo': 0.123}) response = self.post_json('/ports', pdict, expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) def test_create_port_no_mandatory_field_address(self): pdict = post_get_test_port() del pdict['address'] response = self.post_json('/ports', pdict, expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) def test_create_port_no_mandatory_field_node_uuid(self): pdict = post_get_test_port() del pdict['node_uuid'] response = self.post_json('/ports', pdict, expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) def test_create_port_invalid_addr_format(self): pdict = post_get_test_port(address='invalid-format') response = self.post_json('/ports', pdict, expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) def test_create_port_address_normalized(self): address = 'AA:BB:CC:DD:EE:FF' pdict = post_get_test_port(address=address) self.post_json('/ports', pdict) result = self.get_json('/ports/%s' % pdict['uuid']) self.assertEqual(address.lower(), result['address']) def test_create_port_with_hyphens_delimiter(self): pdict = post_get_test_port() colonsMAC = pdict['address'] hyphensMAC = colonsMAC.replace(':', '-') pdict['address'] = hyphensMAC response = self.post_json('/ports', pdict, expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) def test_create_port_invalid_node_uuid_format(self): pdict = post_get_test_port(node_uuid='invalid-format') response = self.post_json('/ports', pdict, expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_int) self.assertTrue(response.json['error_message']) def test_node_uuid_to_node_id_mapping(self): pdict = post_get_test_port(node_uuid=self.node['uuid']) self.post_json('/ports', pdict) # GET doesn't return the node_id it's an internal value port = self.dbapi.get_port(pdict['uuid']) self.assertEqual(self.node['id'], port.node_id) def test_create_port_node_uuid_not_found(self): pdict = post_get_test_port( node_uuid='1a1a1a1a-2b2b-3c3c-4d4d-5e5e5e5e5e5e') response = self.post_json('/ports', pdict, expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_int) self.assertTrue(response.json['error_message']) def test_create_port_address_already_exist(self): address = 'AA:AA:AA:11:22:33' pdict = post_get_test_port(address=address) self.post_json('/ports', pdict) pdict['uuid'] = utils.generate_uuid() response = self.post_json('/ports', pdict, expect_errors=True) self.assertEqual(409, response.status_int) self.assertEqual('application/json', response.content_type) error_msg = response.json['error_message'] self.assertTrue(error_msg) self.assertIn(address, error_msg.upper()) class TestDelete(base.FunctionalTest): def setUp(self): super(TestDelete, self).setUp() ndict = dbutils.get_test_node() self.node = self.dbapi.create_node(ndict) pdict = dbutils.get_test_port() self.dbapi.create_port(pdict) def test_delete_port_byid(self): pdict = dbutils.get_test_port() self.delete('/ports/%s' % pdict['uuid']) response = self.get_json('/ports/%s' % pdict['uuid'], expect_errors=True) self.assertEqual(404, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message']) def test_delete_port_byaddress(self): pdict = dbutils.get_test_port() response = self.delete('/ports/%s' % pdict['address'], expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertIn(pdict['address'], response.json['error_message']) ironic-2014.1.rc1/ironic/tests/test_policy.py0000664000175300017540000000206212316614116022243 0ustar jenkinsjenkins00000000000000# -*- encoding: utf-8 -*- # # Copyright 2013 Red Hat, Inc. # 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 ironic.common import exception from ironic.common import policy as ironic_policy from ironic.tests import base CONF = cfg.CONF class PolicyTestCase(base.TestCase): def test_policy_file_not_found(self): ironic_policy.reset() CONF.set_override('policy_file', '/non/existent/policy/file') self.assertRaises(exception.ConfigNotFound, ironic_policy.init) ironic-2014.1.rc1/ironic/tests/test_glance_service.py0000664000175300017540000005772212316614116023732 0ustar jenkinsjenkins00000000000000# Copyright 2013 Hewlett-Packard Development Company, L.P. # 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 datetime import filecmp import os import tempfile import testtools from ironic.common import exception from ironic.common.glance_service import base_image_service from ironic.common.glance_service import service_utils from ironic.common import image_service as service from ironic.openstack.common import context from ironic.tests import base from ironic.tests import matchers from ironic.tests import stubs from oslo.config import cfg CONF = cfg.CONF class NullWriter(object): """Used to test ImageService.get which takes a writer object.""" def write(self, *arg, **kwargs): pass class TestGlanceSerializer(testtools.TestCase): def test_serialize(self): metadata = {'name': 'image1', 'is_public': True, 'foo': 'bar', 'properties': { 'prop1': 'propvalue1', 'mappings': [ {'virtual': 'aaa', 'device': 'bbb'}, {'virtual': 'xxx', 'device': 'yyy'}], 'block_device_mapping': [ {'virtual_device': 'fake', 'device_name': '/dev/fake'}, {'virtual_device': 'ephemeral0', 'device_name': '/dev/fake0'}]}} converted_expected = { 'name': 'image1', 'is_public': True, 'foo': 'bar', 'properties': { 'prop1': 'propvalue1', 'mappings': '[{"device": "bbb", "virtual": "aaa"}, ' '{"device": "yyy", "virtual": "xxx"}]', 'block_device_mapping': '[{"virtual_device": "fake", "device_name": "/dev/fake"}, ' '{"virtual_device": "ephemeral0", ' '"device_name": "/dev/fake0"}]'}} converted = service_utils._convert(metadata, 'to') self.assertEqual(converted_expected, converted) self.assertEqual(metadata, service_utils._convert(converted, 'from')) class TestGlanceImageService(base.TestCase): NOW_GLANCE_OLD_FORMAT = "2010-10-11T10:30:22" NOW_GLANCE_FORMAT = "2010-10-11T10:30:22.000000" class tzinfo(datetime.tzinfo): @staticmethod def utcoffset(*args, **kwargs): return datetime.timedelta() NOW_DATETIME = datetime.datetime(2010, 10, 11, 10, 30, 22, tzinfo=tzinfo()) def setUp(self): super(TestGlanceImageService, self).setUp() client = stubs.StubGlanceClient() self.context = context.RequestContext(auth_token=True) self.context.user_id = 'fake' self.context.project_id = 'fake' self.service = service.Service(client, 1, self.context) self.config(glance_host='localhost', group='glance') try: self.config(auth_strategy='keystone', group='glance') except Exception: opts = [ cfg.StrOpt('auth_strategy', default='keystone'), ] CONF.register_opts(opts) return @staticmethod def _make_fixture(**kwargs): fixture = {'name': None, 'properties': {}, 'status': None, 'is_public': None} fixture.update(kwargs) return fixture def _make_datetime_fixture(self): return self._make_fixture(created_at=self.NOW_GLANCE_FORMAT, updated_at=self.NOW_GLANCE_FORMAT, deleted_at=self.NOW_GLANCE_FORMAT) def test_create_with_instance_id(self): # Ensure instance_id is persisted as an image-property. fixture = {'name': 'test image', 'is_public': False, 'properties': {'instance_id': '42', 'user_id': 'fake'}} image_id = self.service.create(fixture)['id'] image_meta = self.service.show(image_id) expected = { 'id': image_id, 'name': 'test image', 'is_public': False, 'size': None, 'min_disk': None, 'min_ram': None, 'disk_format': None, 'container_format': None, 'checksum': None, 'created_at': self.NOW_DATETIME, 'updated_at': self.NOW_DATETIME, 'deleted_at': None, 'deleted': None, 'status': None, 'properties': {'instance_id': '42', 'user_id': 'fake'}, 'owner': None, } self.assertThat(image_meta, matchers.DictMatches(expected)) image_metas = self.service.detail() self.assertThat(image_metas[0], matchers.DictMatches(expected)) def test_create_without_instance_id(self): """Ensure we can create an image without having to specify an instance_id. Public images are an example of an image not tied to an instance. """ fixture = {'name': 'test image', 'is_public': False} image_id = self.service.create(fixture)['id'] expected = { 'id': image_id, 'name': 'test image', 'is_public': False, 'size': None, 'min_disk': None, 'min_ram': None, 'disk_format': None, 'container_format': None, 'checksum': None, 'created_at': self.NOW_DATETIME, 'updated_at': self.NOW_DATETIME, 'deleted_at': None, 'deleted': None, 'status': None, 'properties': {}, 'owner': None, } actual = self.service.show(image_id) self.assertThat(actual, matchers.DictMatches(expected)) def test_create(self): fixture = self._make_fixture(name='test image') num_images = len(self.service.detail()) image_id = self.service.create(fixture)['id'] self.assertIsNotNone(image_id) self.assertEqual(num_images + 1, len(self.service.detail())) def test_create_and_show_non_existing_image(self): fixture = self._make_fixture(name='test image') image_id = self.service.create(fixture)['id'] self.assertIsNotNone(image_id) self.assertRaises(exception.ImageNotFound, self.service.show, 'bad image id') def test_detail_private_image(self): fixture = self._make_fixture(name='test image') fixture['is_public'] = False properties = {'owner_id': 'proj1'} fixture['properties'] = properties self.service.create(fixture)['id'] proj = self.context.project_id self.context.project_id = 'proj1' image_metas = self.service.detail() self.context.project_id = proj self.assertEqual(1, len(image_metas)) self.assertEqual('test image', image_metas[0]['name']) self.assertEqual(False, image_metas[0]['is_public']) def test_detail_marker(self): fixtures = [] ids = [] for i in range(10): fixture = self._make_fixture(name='TestImage %d' % (i)) fixtures.append(fixture) ids.append(self.service.create(fixture)['id']) image_metas = self.service.detail(marker=ids[1]) self.assertEqual(8, len(image_metas)) i = 2 for meta in image_metas: expected = { 'id': ids[i], 'status': None, 'is_public': None, 'name': 'TestImage %d' % (i), 'properties': {}, 'size': None, 'min_disk': None, 'min_ram': None, 'disk_format': None, 'container_format': None, 'checksum': None, 'created_at': self.NOW_DATETIME, 'updated_at': self.NOW_DATETIME, 'deleted_at': None, 'deleted': None, 'owner': None, } self.assertThat(meta, matchers.DictMatches(expected)) i = i + 1 def test_detail_limit(self): fixtures = [] ids = [] for i in range(10): fixture = self._make_fixture(name='TestImage %d' % (i)) fixtures.append(fixture) ids.append(self.service.create(fixture)['id']) image_metas = self.service.detail(limit=5) self.assertEqual(5, len(image_metas)) def test_detail_default_limit(self): fixtures = [] ids = [] for i in range(10): fixture = self._make_fixture(name='TestImage %d' % (i)) fixtures.append(fixture) ids.append(self.service.create(fixture)['id']) image_metas = self.service.detail() for i, meta in enumerate(image_metas): self.assertEqual(meta['name'], 'TestImage %d' % (i)) def test_detail_marker_and_limit(self): fixtures = [] ids = [] for i in range(10): fixture = self._make_fixture(name='TestImage %d' % (i)) fixtures.append(fixture) ids.append(self.service.create(fixture)['id']) image_metas = self.service.detail(marker=ids[3], limit=5) self.assertEqual(5, len(image_metas)) i = 4 for meta in image_metas: expected = { 'id': ids[i], 'status': None, 'is_public': None, 'name': 'TestImage %d' % (i), 'properties': {}, 'size': None, 'min_disk': None, 'min_ram': None, 'disk_format': None, 'container_format': None, 'checksum': None, 'created_at': self.NOW_DATETIME, 'updated_at': self.NOW_DATETIME, 'deleted_at': None, 'deleted': None, 'owner': None, } self.assertThat(meta, matchers.DictMatches(expected)) i = i + 1 def test_detail_invalid_marker(self): fixtures = [] ids = [] for i in range(10): fixture = self._make_fixture(name='TestImage %d' % (i)) fixtures.append(fixture) ids.append(self.service.create(fixture)['id']) self.assertRaises(exception.Invalid, self.service.detail, marker='invalidmarker') def test_update(self): fixture = self._make_fixture(name='test image') image = self.service.create(fixture) image_id = image['id'] fixture['name'] = 'new image name' self.service.update(image_id, fixture) new_image_data = self.service.show(image_id) self.assertEqual('new image name', new_image_data['name']) def test_delete(self): fixture1 = self._make_fixture(name='test image 1') fixture2 = self._make_fixture(name='test image 2') fixtures = [fixture1, fixture2] num_images = len(self.service.detail()) self.assertEqual(0, num_images) ids = [] for fixture in fixtures: new_id = self.service.create(fixture)['id'] ids.append(new_id) num_images = len(self.service.detail()) self.assertEqual(2, num_images) self.service.delete(ids[0]) # When you delete an image from glance, it sets the status to DELETED # and doesn't actually remove the image. # Check the image is still there. num_images = len(self.service.detail()) self.assertEqual(2, num_images) # Check the image is marked as deleted. num_images = reduce(lambda x, y: x + (0 if y['deleted'] else 1), self.service.detail(), 0) self.assertEqual(1, num_images) def test_show_passes_through_to_client(self): fixture = self._make_fixture(name='image1', is_public=True) image_id = self.service.create(fixture)['id'] image_meta = self.service.show(image_id) expected = { 'id': image_id, 'name': 'image1', 'is_public': True, 'size': None, 'min_disk': None, 'min_ram': None, 'disk_format': None, 'container_format': None, 'checksum': None, 'created_at': self.NOW_DATETIME, 'updated_at': self.NOW_DATETIME, 'deleted_at': None, 'deleted': None, 'status': None, 'properties': {}, 'owner': None, } self.assertEqual(expected, image_meta) def test_show_raises_when_no_authtoken_in_the_context(self): fixture = self._make_fixture(name='image1', is_public=False, properties={'one': 'two'}) image_id = self.service.create(fixture)['id'] self.context.auth_token = False self.assertRaises(exception.ImageNotFound, self.service.show, image_id) def test_detail_passes_through_to_client(self): fixture = self._make_fixture(name='image10', is_public=True) image_id = self.service.create(fixture)['id'] image_metas = self.service.detail() expected = [ { 'id': image_id, 'name': 'image10', 'is_public': True, 'size': None, 'min_disk': None, 'min_ram': None, 'disk_format': None, 'container_format': None, 'checksum': None, 'created_at': self.NOW_DATETIME, 'updated_at': self.NOW_DATETIME, 'deleted_at': None, 'deleted': None, 'status': None, 'properties': {}, 'owner': None, }, ] self.assertEqual(expected, image_metas) def test_show_makes_datetimes(self): fixture = self._make_datetime_fixture() image_id = self.service.create(fixture)['id'] image_meta = self.service.show(image_id) self.assertEqual(self.NOW_DATETIME, image_meta['created_at']) self.assertEqual(self.NOW_DATETIME, image_meta['updated_at']) def test_detail_makes_datetimes(self): fixture = self._make_datetime_fixture() self.service.create(fixture) image_meta = self.service.detail()[0] self.assertEqual(self.NOW_DATETIME, image_meta['created_at']) self.assertEqual(self.NOW_DATETIME, image_meta['updated_at']) def test_download_with_retries(self): tries = [0] class MyGlanceStubClient(stubs.StubGlanceClient): """A client that fails the first time, then succeeds.""" def get(self, image_id): if tries[0] == 0: tries[0] = 1 raise exception.ServiceUnavailable('') else: return {} stub_client = MyGlanceStubClient() stub_context = context.RequestContext(auth_token=True) stub_context.user_id = 'fake' stub_context.project_id = 'fake' stub_service = service.Service(stub_client, 1, stub_context) image_id = 1 # doesn't matter writer = NullWriter() # When retries are disabled, we should get an exception self.config(glance_num_retries=0, group='glance') self.assertRaises(exception.GlanceConnectionFailed, stub_service.download, image_id, writer) # Now lets enable retries. No exception should happen now. tries = [0] self.config(glance_num_retries=1, group='glance') stub_service.download(image_id, writer) def test_download_file_url(self): #NOTE: only in v2 API class MyGlanceStubClient(stubs.StubGlanceClient): """A client that returns a file url.""" (outfd, s_tmpfname) = tempfile.mkstemp(prefix='directURLsrc') outf = os.fdopen(outfd, 'w') inf = open('/dev/urandom', 'r') for i in range(10): _data = inf.read(1024) outf.write(_data) outf.close() def get(self, image_id): return type('GlanceTestDirectUrlMeta', (object,), {'direct_url': 'file://%s' + self.s_tmpfname}) stub_context = context.RequestContext(auth_token=True) stub_context.user_id = 'fake' stub_context.project_id = 'fake' stub_client = MyGlanceStubClient() (outfd, tmpfname) = tempfile.mkstemp(prefix='directURLdst') writer = os.fdopen(outfd, 'w') stub_service = service.Service(stub_client, context=stub_context, version=2) image_id = 1 # doesn't matter self.config(allowed_direct_url_schemes=['file'], group='glance') stub_service.download(image_id, writer) writer.close() # compare the two files rc = filecmp.cmp(tmpfname, stub_client.s_tmpfname) self.assertTrue(rc, "The file %s and %s should be the same" % (tmpfname, stub_client.s_tmpfname)) os.remove(stub_client.s_tmpfname) os.remove(tmpfname) def test_client_forbidden_converts_to_imagenotauthed(self): class MyGlanceStubClient(stubs.StubGlanceClient): """A client that raises a Forbidden exception.""" def get(self, image_id): raise exception.Forbidden(image_id) stub_client = MyGlanceStubClient() stub_context = context.RequestContext(auth_token=True) stub_context.user_id = 'fake' stub_context.project_id = 'fake' stub_service = service.Service(stub_client, 1, stub_context) image_id = 1 # doesn't matter writer = NullWriter() self.assertRaises(exception.ImageNotAuthorized, stub_service.download, image_id, writer) def test_client_httpforbidden_converts_to_imagenotauthed(self): class MyGlanceStubClient(stubs.StubGlanceClient): """A client that raises a HTTPForbidden exception.""" def get(self, image_id): raise exception.HTTPForbidden(image_id) stub_client = MyGlanceStubClient() stub_context = context.RequestContext(auth_token=True) stub_context.user_id = 'fake' stub_context.project_id = 'fake' stub_service = service.Service(stub_client, 1, stub_context) image_id = 1 # doesn't matter writer = NullWriter() self.assertRaises(exception.ImageNotAuthorized, stub_service.download, image_id, writer) def test_client_notfound_converts_to_imagenotfound(self): class MyGlanceStubClient(stubs.StubGlanceClient): """A client that raises a NotFound exception.""" def get(self, image_id): raise exception.NotFound(image_id) stub_client = MyGlanceStubClient() stub_context = context.RequestContext(auth_token=True) stub_context.user_id = 'fake' stub_context.project_id = 'fake' stub_service = service.Service(stub_client, 1, stub_context) image_id = 1 # doesn't matter writer = NullWriter() self.assertRaises(exception.ImageNotFound, stub_service.download, image_id, writer) def test_client_httpnotfound_converts_to_imagenotfound(self): class MyGlanceStubClient(stubs.StubGlanceClient): """A client that raises a HTTPNotFound exception.""" def get(self, image_id): raise exception.HTTPNotFound(image_id) stub_client = MyGlanceStubClient() stub_context = context.RequestContext(auth_token=True) stub_context.user_id = 'fake' stub_context.project_id = 'fake' stub_service = service.Service(stub_client, 1, stub_context) image_id = 1 # doesn't matter writer = NullWriter() self.assertRaises(exception.ImageNotFound, stub_service.download, image_id, writer) def test_check_image_service_client_set(self): def func(self): return True self.service.client = True wrapped_func = base_image_service.check_image_service(func) self.assertTrue(wrapped_func(self.service)) def test_check_image_service__no_client_set_http(self): def func(service, *args, **kwargs): return (service.client.endpoint, args, kwargs) self.service.client = None params = {'image_href': 'http://123.123.123.123:9292/image_uuid'} self.config(auth_strategy='keystone', group='glance') wrapped_func = base_image_service.check_image_service(func) self.assertEqual(('http://123.123.123.123:9292', (), params), wrapped_func(self.service, **params)) def test_get_image_service__no_client_set_https(self): def func(service, *args, **kwargs): return (service.client.endpoint, args, kwargs) self.service.client = None params = {'image_href': 'https://123.123.123.123:9292/image_uuid'} self.config(auth_strategy='keystone', group='glance') wrapped_func = base_image_service.check_image_service(func) self.assertEqual(('https://123.123.123.123:9292', (), params), wrapped_func(self.service, **params)) def _create_failing_glance_client(info): class MyGlanceStubClient(stubs.StubGlanceClient): """A client that fails the first time, then succeeds.""" def get(self, image_id): info['num_calls'] += 1 if info['num_calls'] == 1: raise exception.ServiceUnavailable('') return {} return MyGlanceStubClient() class TestGlanceUrl(base.TestCase): def test_generate_glance_http_url(self): self.config(glance_host="127.0.0.1", group='glance') generated_url = service_utils.generate_glance_url() http_url = "http://%s:%d" % (CONF.glance.glance_host, CONF.glance.glance_port) self.assertEqual(http_url, generated_url) def test_generate_glance_https_url(self): self.config(glance_protocol="https", group='glance') self.config(glance_host="127.0.0.1", group='glance') generated_url = service_utils.generate_glance_url() https_url = "https://%s:%d" % (CONF.glance.glance_host, CONF.glance.glance_port) self.assertEqual(https_url, generated_url) class TestServiceUtils(base.TestCase): def test_parse_image_ref_no_ssl(self): image_href = 'http://127.0.0.1:9292/image_path/image_uuid' parsed_href = service_utils.parse_image_ref(image_href) self.assertEqual(('image_uuid', '127.0.0.1', 9292, False), parsed_href) def test_parse_image_ref_ssl(self): image_href = 'https://127.0.0.1:9292/image_path/image_uuid' parsed_href = service_utils.parse_image_ref(image_href) self.assertEqual(('image_uuid', '127.0.0.1', 9292, True), parsed_href) def test_generate_image_url(self): image_href = 'image_uuid' self.config(glance_host='123.123.123.123', group='glance') self.config(glance_port=1234, group='glance') self.config(glance_protocol='https', group='glance') generated_url = service_utils.generate_image_url(image_href) self.assertEqual('https://123.123.123.123:1234/images/image_uuid', generated_url) ironic-2014.1.rc1/ironic/tests/conf_fixture.py0000664000175300017540000000332712316614116022405 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # 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 fixtures from oslo.config import cfg from ironic.common import config CONF = cfg.CONF CONF.import_opt('use_ipv6', 'ironic.netconf') CONF.import_opt('host', 'ironic.common.service') class ConfFixture(fixtures.Fixture): """Fixture to manage global conf settings.""" def __init__(self, conf): self.conf = conf def setUp(self): super(ConfFixture, self).setUp() self.conf.set_default('host', 'fake-mini') self.conf.set_default('rpc_backend', 'ironic.openstack.common.rpc.impl_fake') self.conf.set_default('rpc_cast_timeout', 5) self.conf.set_default('rpc_response_timeout', 5) self.conf.set_default('connection', "sqlite://", group='database') self.conf.set_default('sqlite_synchronous', False, group='database') self.conf.set_default('use_ipv6', True) self.conf.set_default('verbose', True) config.parse_args([], default_config_files=[]) self.addCleanup(self.conf.reset) ironic-2014.1.rc1/ironic/tests/matchers.py0000664000175300017540000000655412316614116021525 0ustar jenkinsjenkins00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # Copyright 2012 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. """Matcher classes to be used inside of the testtools assertThat framework.""" import pprint class DictKeysMismatch(object): def __init__(self, d1only, d2only): self.d1only = d1only self.d2only = d2only def describe(self): return ('Keys in d1 and not d2: %(d1only)s.' ' Keys in d2 and not d1: %(d2only)s' % self.__dict__) def get_details(self): return {} class DictMismatch(object): def __init__(self, key, d1_value, d2_value): self.key = key self.d1_value = d1_value self.d2_value = d2_value def describe(self): return ("Dictionaries do not match at %(key)s." " d1: %(d1_value)s d2: %(d2_value)s" % self.__dict__) def get_details(self): return {} class DictMatches(object): def __init__(self, d1, approx_equal=False, tolerance=0.001): self.d1 = d1 self.approx_equal = approx_equal self.tolerance = tolerance def __str__(self): return 'DictMatches(%s)' % (pprint.pformat(self.d1)) # Useful assertions def match(self, d2): """Assert two dicts are equivalent. This is a 'deep' match in the sense that it handles nested dictionaries appropriately. NOTE: If you don't care (or don't know) a given value, you can specify the string DONTCARE as the value. This will cause that dict-item to be skipped. """ d1keys = set(self.d1.keys()) d2keys = set(d2.keys()) if d1keys != d2keys: d1only = d1keys - d2keys d2only = d2keys - d1keys return DictKeysMismatch(d1only, d2only) for key in d1keys: d1value = self.d1[key] d2value = d2[key] try: error = abs(float(d1value) - float(d2value)) within_tolerance = error <= self.tolerance except (ValueError, TypeError): # If both values aren't convertible to float, just ignore # ValueError if arg is a str, TypeError if it's something else # (like None) within_tolerance = False if hasattr(d1value, 'keys') and hasattr(d2value, 'keys'): matcher = DictMatches(d1value) did_match = matcher.match(d2value) if did_match is not None: return did_match elif 'DONTCARE' in (d1value, d2value): continue elif self.approx_equal and within_tolerance: continue elif d1value != d2value: return DictMismatch(key, d1value, d2value) ironic-2014.1.rc1/AUTHORS0000664000175300017540000000043412316614636015766 0ustar jenkinsjenkins00000000000000 Arata Notsu Chris Krelle Dan Prince David Kang Devananda van der Veen Ken Igarashi Michael Still Mikyung Kang ironic-2014.1.rc1/openstack-common.conf0000664000175300017540000000120112316614116021024 0ustar jenkinsjenkins00000000000000[DEFAULT] module=cliutils module=config module=config.generator module=context module=db module=db.sqlalchemy module=db.sqlalchemy.migration_cli module=eventlet_backdoor module=excutils module=fileutils module=flakes module=gettextutils module=importutils module=install_venv_common module=jsonutils module=local module=lockutils module=log module=log_handler module=loopingcall module=network_utils module=notifier module=periodic_task module=policy module=processutils module=py3kcompat module=rpc module=service module=setup module=strutils module=timeutils module=test # The base module to hold the copy of openstack.common base=ironic ironic-2014.1.rc1/babel.cfg0000664000175300017540000000002112316614116016425 0ustar jenkinsjenkins00000000000000[python: **.py] ironic-2014.1.rc1/setup.cfg0000664000175300017540000000345612316614636016546 0ustar jenkinsjenkins00000000000000[metadata] name = ironic version = 2014.1 summary = OpenStack Bare Metal Provisioning description-file = README.rst author = OpenStack author-email = openstack-dev@lists.openstack.org home-page = http://www.openstack.org/ 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 Programming Language :: Python :: 2.6 [files] packages = ironic [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.drivers = fake = ironic.drivers.fake:FakeDriver 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 pxe_ipmitool = ironic.drivers.pxe:PXEAndIPMIToolDriver pxe_ipminative = ironic.drivers.pxe:PXEAndIPMINativeDriver pxe_ssh = ironic.drivers.pxe:PXEAndSSHDriver pxe_seamicro = ironic.drivers.pxe:PXEAndSeaMicroDriver [pbr] autodoc_index_modules = True [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-2014.1.rc1/tools/0000775000175300017540000000000012316614636016055 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/tools/config/0000775000175300017540000000000012316614636017322 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/tools/config/generate_sample.sh0000775000175300017540000000654612316614116023020 0ustar jenkinsjenkins00000000000000#!/usr/bin/env bash print_hint() { echo "Try \`${0##*/} --help' for more information." >&2 } PARSED_OPTIONS=$(getopt -n "${0##*/}" -o hb:p:m:l:o: \ --long help,base-dir:,package-name:,output-dir:,module:,library: -- "$@") if [ $? != 0 ] ; then print_hint ; exit 1 ; fi eval set -- "$PARSED_OPTIONS" while true; do case "$1" in -h|--help) echo "${0##*/} [options]" echo "" echo "options:" echo "-h, --help show brief help" echo "-b, --base-dir=DIR project base directory" echo "-p, --package-name=NAME project package name" echo "-o, --output-dir=DIR file output directory" echo "-m, --module=MOD extra python module to interrogate for options" echo "-l, --library=LIB extra library that registers options for discovery" exit 0 ;; -b|--base-dir) shift BASEDIR=`echo $1 | sed -e 's/\/*$//g'` shift ;; -p|--package-name) shift PACKAGENAME=`echo $1` shift ;; -o|--output-dir) shift OUTPUTDIR=`echo $1 | sed -e 's/\/*$//g'` shift ;; -m|--module) shift MODULES="$MODULES -m $1" shift ;; -l|--library) shift LIBRARIES="$LIBRARIES -l $1" shift ;; --) break ;; esac done BASEDIR=${BASEDIR:-`pwd`} if ! [ -d $BASEDIR ] then echo "${0##*/}: missing project base directory" >&2 ; print_hint ; exit 1 elif [[ $BASEDIR != /* ]] then BASEDIR=$(cd "$BASEDIR" && pwd) fi PACKAGENAME=${PACKAGENAME:-${BASEDIR##*/}} TARGETDIR=$BASEDIR/$PACKAGENAME if ! [ -d $TARGETDIR ] then echo "${0##*/}: invalid project package name" >&2 ; print_hint ; exit 1 fi OUTPUTDIR=${OUTPUTDIR:-$BASEDIR/etc} # NOTE(bnemec): Some projects put their sample config in etc/, # some in etc/$PACKAGENAME/ if [ -d $OUTPUTDIR/$PACKAGENAME ] then OUTPUTDIR=$OUTPUTDIR/$PACKAGENAME elif ! [ -d $OUTPUTDIR ] then echo "${0##*/}: cannot access \`$OUTPUTDIR': No such file or directory" >&2 exit 1 fi BASEDIRESC=`echo $BASEDIR | sed -e 's/\//\\\\\//g'` find $TARGETDIR -type f -name "*.pyc" -delete FILES=$(find $TARGETDIR -type f -name "*.py" ! -path "*/tests/*" ! -path "*/nova/*" \ -exec grep -l "Opt(" {} + | sed -e "s/^$BASEDIRESC\///g" | sort -u) RC_FILE="`dirname $0`/oslo.config.generator.rc" if test -r "$RC_FILE" then source "$RC_FILE" fi for mod in ${IRONIC_CONFIG_GENERATOR_EXTRA_MODULES}; do MODULES="$MODULES -m $mod" done for lib in ${IRONIC_CONFIG_GENERATOR_EXTRA_LIBRARIES}; do LIBRARIES="$LIBRARIES -l $lib" done export EVENTLET_NO_GREENDNS=yes OS_VARS=$(set | sed -n '/^OS_/s/=[^=]*$//gp' | xargs) [ "$OS_VARS" ] && eval "unset \$OS_VARS" DEFAULT_MODULEPATH=ironic.openstack.common.config.generator MODULEPATH=${MODULEPATH:-$DEFAULT_MODULEPATH} OUTPUTFILE=$OUTPUTDIR/$PACKAGENAME.conf.sample python -m $MODULEPATH $MODULES $LIBRARIES $FILES > $OUTPUTFILE # Hook to allow projects to append custom config file snippets CONCAT_FILES=$(ls $BASEDIR/tools/config/*.conf.sample 2>/dev/null) for CONCAT_FILE in $CONCAT_FILES; do cat $CONCAT_FILE >> $OUTPUTFILE done ironic-2014.1.rc1/tools/config/check_uptodate.sh0000775000175300017540000000125612316614116022640 0ustar jenkinsjenkins00000000000000#!/usr/bin/env bash PROJECT_NAME=${PROJECT_NAME:-ironic} CFGFILE_NAME=${PROJECT_NAME}.conf.sample if [ -e etc/${PROJECT_NAME}/${CFGFILE_NAME} ]; then CFGFILE=etc/${PROJECT_NAME}/${CFGFILE_NAME} elif [ -e etc/${CFGFILE_NAME} ]; then CFGFILE=etc/${CFGFILE_NAME} else echo "${0##*/}: can not find config file" exit 1 fi TEMPDIR=`mktemp -d /tmp/${PROJECT_NAME}.XXXXXX` trap "rm -rf $TEMPDIR" EXIT tools/config/generate_sample.sh -b ./ -p ${PROJECT_NAME} -o ${TEMPDIR} if ! diff -u ${TEMPDIR}/${CFGFILE_NAME} ${CFGFILE} then echo "${0##*/}: ${PROJECT_NAME}.conf.sample is not up to date." echo "${0##*/}: Please run ${0%%${0##*/}}generate_sample.sh." exit 1 fi ironic-2014.1.rc1/tools/config/oslo.config.generator.rc0000664000175300017540000000012212316614116024041 0ustar jenkinsjenkins00000000000000export IRONIC_CONFIG_GENERATOR_EXTRA_MODULES=keystoneclient.middleware.auth_token ironic-2014.1.rc1/tools/install_venv_common.py0000664000175300017540000001347012316614116022501 0ustar jenkinsjenkins00000000000000# Copyright 2013 OpenStack Foundation # Copyright 2013 IBM Corp. # # 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. """Provides methods needed by installation script for OpenStack development virtual environments. Since this script is used to bootstrap a virtualenv from the system's Python environment, it should be kept strictly compatible with Python 2.6. Synced in from openstack-common """ from __future__ import print_function import optparse import os import subprocess import sys class InstallVenv(object): def __init__(self, root, venv, requirements, test_requirements, py_version, project): self.root = root self.venv = venv self.requirements = requirements self.test_requirements = test_requirements self.py_version = py_version self.project = project def die(self, message, *args): print(message % args, file=sys.stderr) sys.exit(1) def check_python_version(self): if sys.version_info < (2, 6): self.die("Need Python Version >= 2.6") def run_command_with_code(self, cmd, redirect_output=True, check_exit_code=True): """Runs a command in an out-of-process shell. Returns the output of that command. Working directory is self.root. """ if redirect_output: stdout = subprocess.PIPE else: stdout = None proc = subprocess.Popen(cmd, cwd=self.root, stdout=stdout) output = proc.communicate()[0] if check_exit_code and proc.returncode != 0: self.die('Command "%s" failed.\n%s', ' '.join(cmd), output) return (output, proc.returncode) def run_command(self, cmd, redirect_output=True, check_exit_code=True): return self.run_command_with_code(cmd, redirect_output, check_exit_code)[0] def get_distro(self): if (os.path.exists('/etc/fedora-release') or os.path.exists('/etc/redhat-release')): return Fedora( self.root, self.venv, self.requirements, self.test_requirements, self.py_version, self.project) else: return Distro( self.root, self.venv, self.requirements, self.test_requirements, self.py_version, self.project) def check_dependencies(self): self.get_distro().install_virtualenv() def create_virtualenv(self, no_site_packages=True): """Creates the virtual environment and installs PIP. Creates the virtual environment and installs PIP only into the virtual environment. """ if not os.path.isdir(self.venv): print('Creating venv...', end=' ') if no_site_packages: self.run_command(['virtualenv', '-q', '--no-site-packages', self.venv]) else: self.run_command(['virtualenv', '-q', self.venv]) print('done.') else: print("venv already exists...") pass def pip_install(self, *args): self.run_command(['tools/with_venv.sh', 'pip', 'install', '--upgrade'] + list(args), redirect_output=False) def install_dependencies(self): print('Installing dependencies with pip (this can take a while)...') # First things first, make sure our venv has the latest pip and # setuptools. self.pip_install('pip>=1.3') self.pip_install('setuptools') self.pip_install('-r', self.requirements) self.pip_install('-r', self.test_requirements) def parse_args(self, argv): """Parses command-line arguments.""" parser = optparse.OptionParser() parser.add_option('-n', '--no-site-packages', action='store_true', help="Do not inherit packages from global Python " "install") return parser.parse_args(argv[1:])[0] class Distro(InstallVenv): def check_cmd(self, cmd): return bool(self.run_command(['which', cmd], check_exit_code=False).strip()) def install_virtualenv(self): if self.check_cmd('virtualenv'): return if self.check_cmd('easy_install'): print('Installing virtualenv via easy_install...', end=' ') if self.run_command(['easy_install', 'virtualenv']): print('Succeeded') return else: print('Failed') self.die('ERROR: virtualenv not found.\n\n%s development' ' requires virtualenv, please install it using your' ' favorite package management tool' % self.project) class Fedora(Distro): """This covers all Fedora-based distributions. Includes: Fedora, RHEL, CentOS, Scientific Linux """ def check_pkg(self, pkg): return self.run_command_with_code(['rpm', '-q', pkg], check_exit_code=False)[1] == 0 def install_virtualenv(self): if self.check_cmd('virtualenv'): return if not self.check_pkg('python-virtualenv'): self.die("Please install 'python-virtualenv'.") super(Fedora, self).install_virtualenv() ironic-2014.1.rc1/tools/flakes.py0000664000175300017540000000075012316614116017667 0ustar jenkinsjenkins00000000000000""" wrapper for pyflakes to ignore gettext based warning: "undefined name '_'" Synced in from openstack-common """ __all__ = ['main'] import sys import six.moves.builtins as builtins import pyflakes.api from pyflakes import checker def main(): checker.Checker.builtIns = (set(dir(builtins)) | set(['_']) | set(checker._MAGIC_GLOBALS)) sys.exit(pyflakes.api.main()) if __name__ == "__main__": main() ironic-2014.1.rc1/tools/__init__.py0000664000175300017540000000000012316614116020145 0ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/tools/with_venv.sh0000775000175300017540000000033212316614116020414 0ustar jenkinsjenkins00000000000000#!/bin/bash tools_path=${tools_path:-$(dirname $0)} venv_path=${venv_path:-${tools_path}} venv_dir=${venv_name:-/../.venv} TOOLS=${tools_path} VENV=${venv:-${venv_path}/${venv_dir}} source ${VENV}/bin/activate && "$@" ironic-2014.1.rc1/MANIFEST.in0000664000175300017540000000013612316614116016444 0ustar jenkinsjenkins00000000000000include AUTHORS include ChangeLog exclude .gitignore exclude .gitreview global-exclude *.pyc ironic-2014.1.rc1/README.rst0000664000175300017540000000212412316614116016374 0ustar jenkinsjenkins00000000000000Ironic ====== Ironic is an Incubated 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 in concert to provision and turn on/off machines, but Ironic also supports vendor-specific plugins which may implement additional functionality. ----------------- Project Resources ----------------- Project status, bugs, and blueprints are tracked on Launchpad: http://launchpad.net/ironic Developer documentation can be found here: http://docs.openstack.org/developer/ironic Additional resources are linked from the project wiki page: https://wiki.openstack.org/wiki/Ironic Anyone wishing to contribute to an OpenStack project should find plenty of helpful resources here: https://wiki.openstack.org/wiki/HowToContribute All OpenStack projects use Gerrit for code reviews. A good reference for that is here: https://wiki.openstack.org/wiki/GerritWorkflow ironic-2014.1.rc1/.testr.conf0000664000175300017540000000032312316614116016772 0ustar jenkinsjenkins00000000000000[DEFAULT] test_command=OS_STDOUT_CAPTURE=1 OS_STDERR_CAPTURE=1 OS_TEST_TIMEOUT=60 ${PYTHON:-python} -m subunit.run discover -t ./ ./ $LISTOPT $IDOPTION test_id_option=--load-list $IDFILE test_list_option=--list ironic-2014.1.rc1/test-requirements.txt0000664000175300017540000000036612316614116021154 0ustar jenkinsjenkins00000000000000hacking>=0.8.0,<0.9 coverage>=3.6 discover fixtures>=0.3.14 mock>=1.0 Babel>=1.3 MySQL-python psycopg2 python-subunit>=0.0.18 testrepository>=0.0.18 testtools>=0.9.34 # Doc requirements sphinx>=1.1.2,<1.2 sphinxcontrib-pecanwsme>=0.6 oslosphinx ironic-2014.1.rc1/ironic.egg-info/0000775000175300017540000000000012316614636017672 5ustar jenkinsjenkins00000000000000ironic-2014.1.rc1/ironic.egg-info/PKG-INFO0000664000175300017540000000410012316614636020762 0ustar jenkinsjenkins00000000000000Metadata-Version: 1.1 Name: ironic Version: 2014.1.rc1 Summary: OpenStack Bare Metal Provisioning Home-page: http://www.openstack.org/ Author: OpenStack Author-email: openstack-dev@lists.openstack.org License: UNKNOWN Description: Ironic ====== Ironic is an Incubated 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 in concert to provision and turn on/off machines, but Ironic also supports vendor-specific plugins which may implement additional functionality. ----------------- Project Resources ----------------- Project status, bugs, and blueprints are tracked on Launchpad: http://launchpad.net/ironic Developer documentation can be found here: http://docs.openstack.org/developer/ironic Additional resources are linked from the project wiki page: https://wiki.openstack.org/wiki/Ironic Anyone wishing to contribute to an OpenStack project should find plenty of helpful resources here: https://wiki.openstack.org/wiki/HowToContribute All OpenStack projects use Gerrit for code reviews. A good reference for that is here: https://wiki.openstack.org/wiki/GerritWorkflow 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 Classifier: Programming Language :: Python :: 2.6 ironic-2014.1.rc1/ironic.egg-info/dependency_links.txt0000664000175300017540000000000112316614636023740 0ustar jenkinsjenkins00000000000000 ironic-2014.1.rc1/ironic.egg-info/top_level.txt0000664000175300017540000000000712316614636022421 0ustar jenkinsjenkins00000000000000ironic ironic-2014.1.rc1/ironic.egg-info/SOURCES.txt0000664000175300017540000003025112316614636021557 0ustar jenkinsjenkins00000000000000.mailmap .testr.conf AUTHORS CONTRIBUTING.rst ChangeLog LICENSE MANIFEST.in README.rst babel.cfg openstack-common.conf requirements.txt setup.cfg setup.py test-requirements.txt tox.ini doc/source/conf.py doc/source/index.rst doc/source/dev/api.rst doc/source/dev/architecture.rst doc/source/dev/common.rst doc/source/dev/conductor.rst doc/source/dev/contributing.rst doc/source/dev/db.rst doc/source/dev/dev-quickstart.rst doc/source/dev/drivers.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-manage-ipmi.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/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/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/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/config.py ironic/common/context.py ironic/common/driver_factory.py ironic/common/exception.py ironic/common/hash_ring.py ironic/common/image_service.py ironic/common/images.py ironic/common/keystone.py ironic/common/neutron.py ironic/common/paths.py ironic/common/policy.py ironic/common/safe_utils.py ironic/common/service.py ironic/common/states.py ironic/common/utils.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/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/21b331f883ef_add_provision_updated_at.py ironic/db/sqlalchemy/alembic/versions/2581ebaf0cb2_initial_migration.py ironic/db/sqlalchemy/alembic/versions/3cb628139ea4_nodes_add_console_enabled.py ironic/drivers/__init__.py ironic/drivers/base.py ironic/drivers/fake.py ironic/drivers/pxe.py ironic/drivers/utils.py ironic/drivers/modules/__init__.py ironic/drivers/modules/deploy_utils.py ironic/drivers/modules/fake.py ironic/drivers/modules/ipminative.py ironic/drivers/modules/ipmitool.py ironic/drivers/modules/pxe.py ironic/drivers/modules/pxe_config.template ironic/drivers/modules/seamicro.py ironic/drivers/modules/ssh.py ironic/locale/ironic.pot ironic/locale/ar/LC_MESSAGES/ironic.po ironic/locale/bg_BG/LC_MESSAGES/ironic.po ironic/locale/bn_IN/LC_MESSAGES/ironic.po ironic/locale/bs/LC_MESSAGES/ironic.po ironic/locale/ca/LC_MESSAGES/ironic.po ironic/locale/cs/LC_MESSAGES/ironic.po ironic/locale/da/LC_MESSAGES/ironic.po ironic/locale/de/LC_MESSAGES/ironic.po ironic/locale/el/LC_MESSAGES/ironic.po ironic/locale/en_AU/LC_MESSAGES/ironic.po ironic/locale/en_GB/LC_MESSAGES/ironic.po ironic/locale/en_US/LC_MESSAGES/ironic.po ironic/locale/es/LC_MESSAGES/ironic.po ironic/locale/es_MX/LC_MESSAGES/ironic.po ironic/locale/eu/LC_MESSAGES/ironic.po ironic/locale/eu_ES/LC_MESSAGES/ironic.po ironic/locale/fa/LC_MESSAGES/ironic.po ironic/locale/fi_FI/LC_MESSAGES/ironic.po ironic/locale/fil/LC_MESSAGES/ironic.po ironic/locale/fr/LC_MESSAGES/ironic.po ironic/locale/gl/LC_MESSAGES/ironic.po ironic/locale/he/LC_MESSAGES/ironic.po ironic/locale/he_IL/LC_MESSAGES/ironic.po ironic/locale/hi/LC_MESSAGES/ironic.po ironic/locale/hr/LC_MESSAGES/ironic.po ironic/locale/hu/LC_MESSAGES/ironic.po ironic/locale/id/LC_MESSAGES/ironic.po ironic/locale/is_IS/LC_MESSAGES/ironic.po ironic/locale/it/LC_MESSAGES/ironic.po ironic/locale/it_IT/LC_MESSAGES/ironic.po ironic/locale/ja/LC_MESSAGES/ironic.po ironic/locale/ka_GE/LC_MESSAGES/ironic.po ironic/locale/km/LC_MESSAGES/ironic.po ironic/locale/kn/LC_MESSAGES/ironic.po ironic/locale/ko_KR/LC_MESSAGES/ironic.po ironic/locale/ml_IN/LC_MESSAGES/ironic.po ironic/locale/mr_IN/LC_MESSAGES/ironic.po ironic/locale/ms/LC_MESSAGES/ironic.po ironic/locale/nb/LC_MESSAGES/ironic.po ironic/locale/ne/LC_MESSAGES/ironic.po ironic/locale/nl_NL/LC_MESSAGES/ironic.po ironic/locale/pa_IN/LC_MESSAGES/ironic.po ironic/locale/pl_PL/LC_MESSAGES/ironic.po ironic/locale/pt/LC_MESSAGES/ironic.po ironic/locale/pt_BR/LC_MESSAGES/ironic.po ironic/locale/ro/LC_MESSAGES/ironic.po ironic/locale/ru/LC_MESSAGES/ironic.po ironic/locale/ru_RU/LC_MESSAGES/ironic.po ironic/locale/sk/LC_MESSAGES/ironic.po ironic/locale/sl_SI/LC_MESSAGES/ironic.po ironic/locale/sq/LC_MESSAGES/ironic.po ironic/locale/sr/LC_MESSAGES/ironic.po ironic/locale/sv/LC_MESSAGES/ironic.po ironic/locale/sw_KE/LC_MESSAGES/ironic.po ironic/locale/ta/LC_MESSAGES/ironic.po ironic/locale/te_IN/LC_MESSAGES/ironic.po ironic/locale/tl/LC_MESSAGES/ironic.po ironic/locale/tl_PH/LC_MESSAGES/ironic.po ironic/locale/tr_TR/LC_MESSAGES/ironic.po ironic/locale/uk/LC_MESSAGES/ironic.po ironic/locale/ur/LC_MESSAGES/ironic.po ironic/locale/vi_VN/LC_MESSAGES/ironic.po ironic/locale/zh_CN/LC_MESSAGES/ironic.po ironic/locale/zh_HK/LC_MESSAGES/ironic.po ironic/locale/zh_TW/LC_MESSAGES/ironic.po ironic/nova/__init__.py ironic/nova/compute/__init__.py ironic/nova/compute/manager.py ironic/nova/scheduler/__init__.py ironic/nova/scheduler/ironic_host_manager.py ironic/nova/scheduler/filters/exact_core_filter.py ironic/nova/scheduler/filters/exact_disk_filter.py ironic/nova/scheduler/filters/exact_ram_filter.py ironic/nova/tests/scheduler/ironic_fakes.py ironic/nova/tests/scheduler/test_ironic_host_manager.py ironic/nova/tests/virt/ironic/__init__.py ironic/nova/tests/virt/ironic/test_driver.py ironic/nova/virt/__init__.py ironic/nova/virt/ironic/__init__.py ironic/nova/virt/ironic/driver.py ironic/nova/virt/ironic/ironic_driver_fields.py ironic/nova/virt/ironic/ironic_states.py ironic/objects/__init__.py ironic/objects/base.py ironic/objects/chassis.py ironic/objects/conductor.py ironic/objects/node.py ironic/objects/port.py ironic/objects/utils.py ironic/openstack/__init__.py ironic/openstack/common/__init__.py ironic/openstack/common/cliutils.py ironic/openstack/common/context.py ironic/openstack/common/eventlet_backdoor.py ironic/openstack/common/excutils.py ironic/openstack/common/fileutils.py ironic/openstack/common/gettextutils.py ironic/openstack/common/importutils.py ironic/openstack/common/jsonutils.py ironic/openstack/common/local.py ironic/openstack/common/lockutils.py ironic/openstack/common/log.py ironic/openstack/common/log_handler.py ironic/openstack/common/loopingcall.py ironic/openstack/common/network_utils.py ironic/openstack/common/periodic_task.py ironic/openstack/common/policy.py ironic/openstack/common/processutils.py ironic/openstack/common/service.py ironic/openstack/common/setup.py ironic/openstack/common/sslutils.py ironic/openstack/common/strutils.py ironic/openstack/common/test.py ironic/openstack/common/threadgroup.py ironic/openstack/common/timeutils.py ironic/openstack/common/versionutils.py ironic/openstack/common/config/__init__.py ironic/openstack/common/config/generator.py ironic/openstack/common/db/__init__.py ironic/openstack/common/db/api.py ironic/openstack/common/db/exception.py ironic/openstack/common/db/options.py ironic/openstack/common/db/sqlalchemy/__init__.py ironic/openstack/common/db/sqlalchemy/migration.py ironic/openstack/common/db/sqlalchemy/models.py ironic/openstack/common/db/sqlalchemy/provision.py ironic/openstack/common/db/sqlalchemy/session.py ironic/openstack/common/db/sqlalchemy/test_base.py ironic/openstack/common/db/sqlalchemy/test_migrations.py ironic/openstack/common/db/sqlalchemy/utils.py ironic/openstack/common/db/sqlalchemy/migration_cli/__init__.py ironic/openstack/common/db/sqlalchemy/migration_cli/ext_alembic.py ironic/openstack/common/db/sqlalchemy/migration_cli/ext_base.py ironic/openstack/common/db/sqlalchemy/migration_cli/ext_migrate.py ironic/openstack/common/db/sqlalchemy/migration_cli/manager.py ironic/openstack/common/notifier/__init__.py ironic/openstack/common/notifier/api.py ironic/openstack/common/notifier/log_notifier.py ironic/openstack/common/notifier/no_op_notifier.py ironic/openstack/common/notifier/rpc_notifier.py ironic/openstack/common/notifier/rpc_notifier2.py ironic/openstack/common/notifier/test_notifier.py ironic/openstack/common/py3kcompat/__init__.py ironic/openstack/common/py3kcompat/urlutils.py ironic/openstack/common/rpc/__init__.py ironic/openstack/common/rpc/amqp.py ironic/openstack/common/rpc/common.py ironic/openstack/common/rpc/dispatcher.py ironic/openstack/common/rpc/impl_fake.py ironic/openstack/common/rpc/impl_kombu.py ironic/openstack/common/rpc/impl_qpid.py ironic/openstack/common/rpc/impl_zmq.py ironic/openstack/common/rpc/matchmaker.py ironic/openstack/common/rpc/matchmaker_redis.py ironic/openstack/common/rpc/matchmaker_ring.py ironic/openstack/common/rpc/proxy.py ironic/openstack/common/rpc/serializer.py ironic/openstack/common/rpc/service.py ironic/openstack/common/rpc/zmq_receiver.py ironic/tests/__init__.py ironic/tests/base.py ironic/tests/conf_fixture.py ironic/tests/fake_policy.py ironic/tests/matchers.py ironic/tests/policy_fixture.py ironic/tests/stubs.py ironic/tests/test_dbsync.py ironic/tests/test_glance_service.py ironic/tests/test_hash_ring.py ironic/tests/test_images.py ironic/tests/test_keystone.py ironic/tests/test_neutron.py ironic/tests/test_policy.py ironic/tests/test_utils.py ironic/tests/api/__init__.py ironic/tests/api/base.py ironic/tests/api/test_acl.py ironic/tests/api/test_base.py ironic/tests/api/test_hooks.py ironic/tests/api/test_root.py ironic/tests/api/utils.py ironic/tests/api/v1/__init__.py ironic/tests/api/v1/test_chassis.py ironic/tests/api/v1/test_drivers.py ironic/tests/api/v1/test_nodes.py ironic/tests/api/v1/test_ports.py ironic/tests/api/v1/test_types.py ironic/tests/api/v1/test_utils.py ironic/tests/conductor/__init__.py ironic/tests/conductor/test_conductor_utils.py ironic/tests/conductor/test_manager.py ironic/tests/conductor/test_rpcapi.py ironic/tests/conductor/test_task_manager.py ironic/tests/conductor/test_utils.py ironic/tests/conductor/utils.py ironic/tests/db/__init__.py ironic/tests/db/base.py ironic/tests/db/test_chassis.py ironic/tests/db/test_conductor.py ironic/tests/db/test_nodes.py ironic/tests/db/test_ports.py ironic/tests/db/utils.py ironic/tests/db/sqlalchemy/__init__.py ironic/tests/db/sqlalchemy/test_migrations.conf ironic/tests/db/sqlalchemy/test_migrations.py ironic/tests/db/sqlalchemy/test_types.py ironic/tests/drivers/__init__.py ironic/tests/drivers/pxe_config.template ironic/tests/drivers/test_deploy_utils.py ironic/tests/drivers/test_fake.py ironic/tests/drivers/test_ipminative.py ironic/tests/drivers/test_ipmitool.py ironic/tests/drivers/test_pxe.py ironic/tests/drivers/test_seamicro.py ironic/tests/drivers/test_ssh.py ironic/tests/drivers/test_utils.py ironic/tests/objects/__init__.py ironic/tests/objects/test_chassis.py ironic/tests/objects/test_conductor.py ironic/tests/objects/test_node.py ironic/tests/objects/test_objects.py ironic/tests/objects/test_port.py tools/__init__.py tools/flakes.py tools/install_venv_common.py tools/with_venv.sh tools/config/check_uptodate.sh tools/config/generate_sample.sh tools/config/oslo.config.generator.rcironic-2014.1.rc1/ironic.egg-info/entry_points.txt0000664000175300017540000000130212316614636023164 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.drivers] fake = ironic.drivers.fake:FakeDriver fake_ipminative = ironic.drivers.fake:FakeIPMINativeDriver fake_ipmitool = ironic.drivers.fake:FakeIPMIToolDriver fake_pxe = ironic.drivers.fake:FakePXEDriver fake_seamicro = ironic.drivers.fake:FakeSeaMicroDriver fake_ssh = ironic.drivers.fake:FakeSSHDriver pxe_ipminative = ironic.drivers.pxe:PXEAndIPMINativeDriver pxe_ipmitool = ironic.drivers.pxe:PXEAndIPMIToolDriver pxe_seamicro = ironic.drivers.pxe:PXEAndSeaMicroDriver pxe_ssh = ironic.drivers.pxe:PXEAndSSHDriver ironic-2014.1.rc1/ironic.egg-info/not-zip-safe0000664000175300017540000000000112316614632022114 0ustar jenkinsjenkins00000000000000 ironic-2014.1.rc1/ironic.egg-info/requires.txt0000664000175300017540000000075412316614636022300 0ustar jenkinsjenkins00000000000000pbr>=0.6,<1.0 SQLAlchemy>=0.7.8,<=0.9.99 alembic>=0.4.1 amqplib>=0.6.1 anyjson>=0.3.3 eventlet>=0.13.0 kombu>=2.4.8 lockfile>=0.8 lxml>=2.3 WebOb>=1.2.3 greenlet>=0.3.2 futures>=2.1.3 sqlalchemy-migrate>=0.8.2,!=0.8.4 netaddr>=0.7.6 paramiko>=1.9.0 iso8601>=0.1.9 python-neutronclient>=2.3.4,<3 python-glanceclient>=0.9.0 python-keystoneclient>=0.6.0 stevedore>=0.14 websockify>=0.5.1,<0.6 oslo.config>=1.2.0 oslo.rootwrap pecan>=0.4.5 six>=1.5.2 jsonpatch>=1.1 WSME>=0.6 Jinja2 pyghmi>=0.5.8