././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1709547098.9095101 ironic-ui-6.3.0/0000775000175000017500000000000000000000000013441 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/.coveragerc0000664000175000017500000000010600000000000015557 0ustar00zuulzuul00000000000000[run] branch = True source = ironic-ui [report] ignore_errors = True ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/.eslintignore0000664000175000017500000000002100000000000016135 0ustar00zuulzuul00000000000000node_modules dist././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/.eslintrc0000664000175000017500000000050000000000000015260 0ustar00zuulzuul00000000000000# Enable eslint-plugin-angular plugins: - angular extends: openstack # Set up globals globals: angular: false module: false env: browser: true jasmine: true rules: angular/no-private-call: 0 angular/no-services: - 2 - - $http - $resource - Restangular angular/no-service-method: 0././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/.mailmap0000664000175000017500000000013100000000000015055 0ustar00zuulzuul00000000000000# Format is: # # ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/.zuul.yaml0000664000175000017500000000172000000000000015402 0ustar00zuulzuul00000000000000- job: name: ironic-ui-integration-tests parent: horizon-integration-tests required-projects: - name: openstack/horizon - name: openstack/ironic - name: openstack/python-ironicclient - name: openstack/ironic-ui roles: - zuul: openstack-infra/devstack - zuul: openstack/horizon irrelevant-files: - ^.*\.rst$ - ^doc/.*$ - ^releasenotes/.*$ vars: devstack_plugins: ironic: https://opendev.org/openstack/ironic ironic-ui: https://opendev.org/openstack/ironic-ui devstack_services: horizon: true tox_envlist: integration - project: templates: - check-requirements - openstack-cover-jobs - horizon-nodejs-jobs - horizon-non-primary-django-jobs - openstack-python3-jobs - publish-openstack-docs-pti - release-notes-jobs-python3 check: jobs: - ironic-ui-integration-tests: voting: false ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547098.0 ironic-ui-6.3.0/AUTHORS0000664000175000017500000000452500000000000014517 0ustar00zuulzuul00000000000000Aayush Rajoria Aayush Rajoria Akihiro Motoki Andreas Jaeger Anup Navare Beth Elwell Cao Xuan Hoang Corey Bryant Deepak Dmitry Tantsur Doug Hellmann Elizabeth Elwell Flavio Percoco Ghanshyam Mann HeroicHitesh Hervé Beraud Ian Wienand Iury Gregory Melo Ferreira Iury Gregory Melo Ferreira Ivan Kolodyazhny Julia Kreger Kaifeng Wang Lucky samadhiya Luong Anh Tuan Madhuri Kumari Miles Gould Mohammed Naser OpenStack Release Bot Peter Piela Peter Piela Ramamani Yeleswarapu Riccardo Pittau Rob Cresswell Rushil Chugh Sean McGinnis ShangXiao Sharpz7 Shu Muto Takashi Kajinami Takashi Kajinami Thomas Goirand Tony Breeds Tony Xu Tyr Johanson Vieri <15050873171@163.com> Xu Ao Zhenguo Niu ZhijunWei francotseng gecong1973 huang.zhiping lijunjie likui manchandavishal melissaml pengyuesheng qianshuai ricolin wangjiaqi07 xuanyandong yushangbin zhangyanxian zhouxinyong zhulingjie ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/CONTRIBUTING.rst0000664000175000017500000000123100000000000016077 0ustar00zuulzuul00000000000000If you would like to contribute to the development of OpenStack, you must follow the steps in this page: http://docs.openstack.org/infra/manual/developers.html If you already have a good understanding of how the system works and your OpenStack accounts are set up, you can skip to the development workflow section of this documentation to learn how changes to OpenStack should be submitted for review via the Gerrit tool: http://docs.openstack.org/infra/manual/developers.html#development-workflow Pull requests submitted through GitHub will be ignored. Bugs should be filed in StoryBoard, not GitHub: https://storyboard.openstack.org/#!/project/952 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547098.0 ironic-ui-6.3.0/ChangeLog0000664000175000017500000003357600000000000015231 0ustar00zuulzuul00000000000000CHANGES ======= 6.3.0 ----- * reno: Update master for unmaintained/yoga * [codespell] Fixing Spelling Mistakes * Bupm hacking * Update python classifier in setup.cfg * Update master for stable/2023.2 6.2.1 ----- * Fix release note build 6.2.0 ----- * Imported Translations from Zanata * Update master for stable/2023.1 6.1.0 ----- * Fix tox4 errors * Imported Translations from Zanata * Add Python3 antelope unit tests * Update master for stable/zed 6.0.0 ----- * remove unicode from code * Migrate to AngularJS v1.8.2 * Replace deprecated ugettext\_lazy * Django 4.x: ugettext\_lazy is removed * Imported Translations from Zanata * The Python 3.6 and Python 3.7 Support has been dropped since zed * Use Horizon project template for nodejs jobs * Address RemovedInDjango40Warning * Add Python3 zed unit tests * Update master for stable/yoga 5.1.0 ----- * Updating python testing classifier as per Yoga testing runtime * Add Python3 yoga unit tests * Update master for stable/xena 5.0.0 ----- * Remove horizon from doc requirements * Remove lower-constraints job * Changed minversion in tox to 3.18.0 * setup.cfg: Replace dashes with underscores * Remove testr * Drop horizon-nodejs10-jobs template * Add horizon-nodejs14-job template * Add Python3 xena unit tests * Update master for stable/wallaby 4.3.0 ----- * Add a release note for Wallaby * Imported Translations from Zanata * Use permissions attribute to detect ironic service * Fix unittest coverage bug * Remove Chrome browser from karma.conf.js * Remove hard-coded Python path in karma.conf.js * Set safe version of hacking * Imported Translations from Zanata * Add Python3 wallaby unit tests * Update master for stable/victoria * Add npm tox env 4.2.0 ----- * [goal] Migrate testing to ubuntu focal 4.1.0 ----- * api: drop project\_id from kwargs in client * Cleanup py27 support * drop mock from lower-constraints and requirements * Switch to newer openstackdocstheme and reno versions * Imported Translations from Zanata * Imported Translations from Zanata * Add py38 package metadata * Add Python3 victoria unit tests * Update master for stable/ussuri 4.0.0 ----- * Stop configuring install\_command in tox * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Fix pyScss version in lower-constraints.txt * Repair creating an ironicclient instance * Enforce running tox with correct python version based on env * Drop Django 1.11 support * translation: drop babel extractor definitions * Imported Translations from Zanata * Drop python 2.7 support and testing * Imported Translations from Zanata * Use Python3 for integration tests * Switch to Ussuri jobs * Use Horizon project template for django jobs * Imported Translations from Zanata * Imported Translations from Zanata * Update master for stable/train 3.5.2 ----- * Build pdf doc 3.5.1 ----- * Update various links in the documentation 3.5.0 ----- * Update api-ref location * Follow the new PTI for document build * Drop nodejs4 job * Add nodejs10 jobs on bionic * Modify the url of upper\_constraints\_file * Blacklist sphinx 2.1.0 (autodoc bug) * Add python 3.7 classifier to setup.cfg * Use openstack-python3-train-jobs for python3 test runtime * Exclude broken ironicclient versions 2.5.2 and 2.7.1 * Update sphinx dependency * Imported Translations from Zanata * Replace git.openstack.org URLs with opendev.org URLs * OpenDev Migration Patch * Imported Translations from Zanata * Dropping the py35 testing * Normalize operation messages into capital case * Imported Translations from Zanata * i18n: Extract strings from template files * Fix misused html attribute 'translation' in base-node.html * Imported Translations from Zanata * Replace openstack.org git:// URLs with https:// * Update master for stable/stein 3.4.0 ----- * Supporting all py3 environments with tox * add python 3.7 unit test job * Add ironic-ui integration tests * Imported Translations from Zanata * Fix the misspelling of "expression" * Use template for lower-constraints * Change openstack-dev to openstack-discuss * hange openstack-dev to openstack-discuss * Imported Translations from Zanata * Update the hacking to latst * Imported Translations from Zanata * Imported Translations from Zanata * Add ability to test Ironic UI with Horizon master branch * Imported Translations from Zanata * Drop nose dependencies * add python 3.6 unit test job * switch documentation job to new PTI * import zuul job settings from project-config * Update reno for stable/rocky 3.3.0 ----- * fix tox python3 overrides 3.2.0 ----- * Rename tests/registration.py to /tests/test\_registration.py * add lower-constraints job * Add release notes link to README * Imported Translations from Zanata * Update links in README * Imported Translations from Zanata * Fix installation docs * Change Launchpad references to Storyboard * Updated from global requirements * Imported Translations from Zanata * Update reno for stable/queens * Imported Translations from Zanata 3.1.0 ----- * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Fix docs build * Added support for injecting non-maskable interrupts * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Remove setting of version/release from releasenotes * Updated from global requirements * Imported Translations from Zanata * Allow selecting interfaces while enrolling nodes * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Unit tests for set target raid configuration * Imported Translations from Zanata * Updated from global requirements * Cleanup ironic-ui REST API * Cleanup ironic-ui portgroup REST interface * Imported Translations from Zanata * Set target raid configuration on a node * Added unit tests for edit-portgroup functionality * Updated from global requirements * Imported Translations from Zanata * Imported Translations from Zanata * Add unit tests for node-state-transition service * Update reno for stable/pike * Imported Translations from Zanata 3.0.0 ----- * Refactor the PostfixExpr class into a separate service * Create driver-property service * Refactor graph class into a separate service * Imported Translations from Zanata * Enhanced form-field radio functionality * Imported Translations from Zanata * Adds support for directly patching boolean attributes * Add unit tests for creating and editing ports * Adds support for editing portgroups * Updated from global requirements * Display enabled interfaces for underlying driver * Cleanup ironic-ui release notes for release * Added support for creating portgroups * Imported Translations from Zanata * Migrate node-details controller tests to new framework * Imported Translations from Zanata * Add property-collection-editor directive * Imported Translations from Zanata * Imported Translations from Zanata * Add the capability to associate ports with portgroups * Add python api docs to contributor docs * Imported Translations from Zanata * Update URL home-page in documents according to document migration * Updated from global requirements * Move ironic-ui contributor docs * Introduce form-field directive * Moving ironic-ui install content to install folder * Set warning-is-error for documentation builds * Imported Translations from Zanata * Imported Translations from Zanata * Set current boot device on a node * Switch from oslosphinx to openstackdocstheme * Add functionality to view portgroups * Updated from global requirements * Imported Translations from Zanata * Extend backend mock with port operations * Imported Translations from Zanata * Add support for editing node's resource\_class * Imported Translations from Zanata * Unit test framework for Ironic-UI API service * Refactor BasePortController * Updated from global requirements * Consolidate code for setting node maintenance state * Remove explicit package version * Setup JavaScript test environment * Fix Javascript unit tests * Modify regex pattern used to validate node ids * Fixed node form submission issue * Fix Javascript unassignable errors * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Updated from global requirements * Improve strings for translation * Eliminate unnecessary event handling code * Add support for soft power transitions * Imported Translations from Zanata * Add support for starting/stopping/accessing the serial console * Updated from global requirements * Imported Translations from Zanata * Show boot device in Node Details/Configuration * Imported Translations from Zanata 2.3.0 ----- * Adds Ironic-UI Devstack plugin * Fix mocks that were breaking Jasmine tests * Document how to run JavaScript unit tests * Fix typo in base-node.service.js * s/UUID/UUID or name/ in docstrings * Fix typos in docstrings * Fix docstrings for node validation * Updated from global requirements * Update test requirement * Add support for network\_interface attribute * Use angular one-time-binding to improve performance * Correct Release Notes theme * Cleanup code associated with the ironic REST api * Fix oslo\_debug\_helper not running * Imported Translations from Zanata * Add support for manual cleaning of nodes * Replace ironic with ironic-ui in contributing doc * Updated from global requirements * Imported Translations from Zanata * Correct horizon dir in installation doc * Maintenance processing code cleanup * Remove py34 env from tox * Source code documentation updates * standardize release notes filenames and fix contents 2.2.0 ----- * Release notes for recently added features * Add support for editing Ironic network ports * Imported Translations from Zanata * Add support for additional port attributes * Fix node validation problem * Imported Translations from Zanata * Remove node-action deleteNodes/deletePorts functions * Improvements to enroll-node service * Improve error handling for the ironic-ui service * Updated from global requirements * Imported Translations from Zanata * Imported Translations from Zanata * Add Python 3.5 classifier and venv * Updated from global requirements * Create base-port module to support create and update operations * Refactor the edit-node/nodeUpdatePatch class * Display current node cleaning step * Add support for aborting node cleaning * Changes required for updated Bootstrap version * Imported Translations from Zanata * Added support for the node introspection workflow * Removes unnecessary utf-8 encoding * Add Constraints support * Extend support for the Ironic state machine * Updated from global requirements * Refactor ironic-ui documentation to remove warnings * Unit tests for PostfixExpr utility class * Consolidate node last\_error processing * Imported Translations from Zanata * Show team and repo badges on README * Don't include openstack/common in flake8 exclude list * Incorporate driver-validation into node-detail panels * Imported Translations from Zanata * Fixed bug in representation of ironic state machine * Add a check for node last\_error equal to null * Eliminate references to non-existent admin module * Imported Translations from Zanata * Eliminate use of a now obsolete admin basePath variable * Update .coveragerc after the removal of openstack directory * Enable release notes translation * Fix Jasmine unit tests * Fixed processing of node properties with null value * Fixed typo in edit-node service * Consolidate processing of node properties 2.1.0 ----- * Added release notes for 2.1.0 release * Added support for editing Ironic nodes * Update homepage with developer documentation page * Clean imports in code * TrivialFix: Remove logging import unused * Minor state-machine fixes/updates * update homepage with developer documentation page * Updated to ironic API v1.11 and added manageable state * Add translation support * Improve the display of node information * Cleanup tox.ini * Imported Translations from Zanata * Imported Translations from Zanata 2.0.0 ----- * Added release notes for 2.0.0 release * Add reno for release notes management * Hide panel if 'baremetal' service not present * Added support for creating/deleting network ports * Imported Translations from Zanata * Inherit test settings from Horizon * Fix a mistake in the document about the filepath * Changed dropdown menu to align right on driver details page * Imported Translations from Zanata * UX improvements to the enroll-node dialog * Updated ironic-ui documentation * Provide capability to select deploy images * Fixed node-detail controller unit test * Fix node list magic search bar * Imported Translations from Zanata * Fixed bug in evaluation of postfix expression * Manually fixed breadcrumbs for ironic-ui * UI improvements for enroll node functionality * Added functionality to enroll a node, and delete node(s) * Imported Translations from Zanata * Imported Translations from Zanata * Display all properties and instance info * Imported Translations from Zanata * Images uuid giving 404 fix * Remove executable flag from node-list.html * Remove python-ironicclient from setup\_requires 1.1.0 ----- * Added closing tag - quick fix * Add support for specifying a maintenance reason * Added eslint config to ironic-ui * Add support for magic-search-bar * Added success messages to power change * Fixing nits of ironic-ui Readme.rst * Fix translation setup * Don't hyperlink images that are specified as URLs * Amended table styling 1.0.0 ----- * Register ironic-ui REST endpoints * Changed naming of Ironic api files * Added node details page to the plugin * Added node list pages to the plugin * Add API services Javascript 0.0.1 ----- * Move index.html to content folder * Reorganise Python according to Horizon plugin doc * Added installation instructions to the Readme * Plugin setup * Translation setup * Corrected copyright details for the project * Amended readme file to be more accurate and readable * Added cookiecutter files * Added .gitreview ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/HACKING.rst0000664000175000017500000000021400000000000015234 0ustar00zuulzuul00000000000000ironic-ui Style Commandments ============================ Read the OpenStack Style Commandments https://docs.openstack.org/hacking/latest/ ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/LICENSE0000664000175000017500000002363700000000000014461 0ustar00zuulzuul00000000000000 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. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/MANIFEST.in0000664000175000017500000000023700000000000015201 0ustar00zuulzuul00000000000000include AUTHORS include ChangeLog exclude .gitignore exclude .gitreview include setup.py recursive-include ironic_ui *.js *.html *.scss global-exclude *.pyc ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.91351 ironic-ui-6.3.0/PKG-INFO0000664000175000017500000000401600000000000014537 0ustar00zuulzuul00000000000000Metadata-Version: 1.2 Name: ironic-ui Version: 6.3.0 Summary: Ironic plugin UI for Horizon to allow users to view and manage bare metal nodes, ports and drivers. Home-page: https://docs.openstack.org/ironic-ui/latest/ Author: OpenStack Author-email: openstack-discuss@lists.openstack.org License: UNKNOWN Description: ======================== Team and repository tags ======================== .. image:: https://governance.openstack.org/tc/badges/ironic-ui.svg :target: https://governance.openstack.org/tc/reference/tags/index.html .. Change things from this point on ========= Ironic UI ========= The Ironic UI is a Horizon plugin that will allow users to view and manage bare metal nodes, ports and drivers. * Free software: Apache license * Documentation: https://docs.openstack.org/ironic-ui/latest * Release notes: https://docs.openstack.org/releasenotes/ironic-ui/ * Source: https://opendev.org/openstack/ironic-ui * Bugs: https://storyboard.openstack.org/#!/project/952 Features -------- * View bare metal nodes * View node details * Apply maintenance and power on/off actions to the nodes 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 :: Implementation :: CPython Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Requires-Python: >=3.8 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/README.rst0000664000175000017500000000142600000000000015133 0ustar00zuulzuul00000000000000======================== Team and repository tags ======================== .. image:: https://governance.openstack.org/tc/badges/ironic-ui.svg :target: https://governance.openstack.org/tc/reference/tags/index.html .. Change things from this point on ========= Ironic UI ========= The Ironic UI is a Horizon plugin that will allow users to view and manage bare metal nodes, ports and drivers. * Free software: Apache license * Documentation: https://docs.openstack.org/ironic-ui/latest * Release notes: https://docs.openstack.org/releasenotes/ironic-ui/ * Source: https://opendev.org/openstack/ironic-ui * Bugs: https://storyboard.openstack.org/#!/project/952 Features -------- * View bare metal nodes * View node details * Apply maintenance and power on/off actions to the nodes ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/babel-django.cfg0000664000175000017500000000011500000000000016424 0ustar00zuulzuul00000000000000[python: **.py] [django: **/templates/**.html] [django: **/templates/**.csv] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/babel-djangojs.cfg0000664000175000017500000000006100000000000016761 0ustar00zuulzuul00000000000000[javascript: **.js] [angular: **/static/**.html] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/bindep.txt0000664000175000017500000000030700000000000015443 0ustar00zuulzuul00000000000000# selenium tests firefox [selenium] libfontconfig1 [nodejs platform:dpkg] xvfb [selenium platform:dpkg] # already part of xorg-x11-server on openSUSE xorg-x11-server-Xvfb [selenium platform:redhat] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1709547098.8895102 ironic-ui-6.3.0/devstack/0000775000175000017500000000000000000000000015245 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/devstack/plugin.sh0000664000175000017500000000306400000000000017102 0ustar00zuulzuul00000000000000# plugin.sh - DevStack plugin.sh dispatch script ironic-ui function install_ironic_ui { # NOTE(crushil): workaround for devstack bug: 1540328 # where devstack installs 'test-requirements' but should not do it # for ironic-ui project as it installs Horizon from url. # Remove following two 'mv' commands when mentioned bug is fixed. mv $IRONIC_UI_DIR/test-requirements.txt $IRONIC_UI_DIR/_test-requirements.txt setup_develop ${IRONIC_UI_DIR} mv $IRONIC_UI_DIR/_test-requirements.txt $IRONIC_UI_DIR/test-requirements.txt } # check for service enabled if is_service_enabled horizon && is_service_enabled ironic && is_service_enabled ironic-ui; then if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then # Set up system services # no-op : elif [[ "$1" == "stack" && "$2" == "install" ]]; then # Perform installation of service source echo_summary "Installing Ironic UI" install_ironic_ui elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then # Configure after the other layer 1 and 2 services have been configured echo_summary "Configuring Ironic UI" cp -a ${IRONIC_UI_DIR}/ironic_ui/enabled/* ${DEST}/horizon/openstack_dashboard/local/enabled/ elif [[ "$1" == "stack" && "$2" == "extra" ]]; then # no-op : fi if [[ "$1" == "unstack" ]]; then # no-op : fi if [[ "$1" == "clean" ]]; then # Remove state and transient data # Remember clean.sh first calls unstack.sh # no-op : fi fi././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/devstack/settings0000664000175000017500000000021300000000000017024 0ustar00zuulzuul00000000000000# settings file for ironic-ui plugin enable_service ironic-ui # set up default directories IRONIC_UI_DIR=${IRONIC_UI_DIR:=$DEST/ironic-ui}././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1709547098.8895102 ironic-ui-6.3.0/doc/0000775000175000017500000000000000000000000014206 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/doc/requirements.txt0000664000175000017500000000042300000000000017471 0ustar00zuulzuul00000000000000sphinx>=2.0.0,!=2.1.0 # BSD openstackdocstheme>=2.2.1 # Apache-2.0 reno>=3.1.0 # Apache-2.0 testtools>=2.2.0 # MIT testscenarios>=0.4 # Apache-2.0/BSD # The below is rewquired to build testing module reference selenium>=2.50.1 # Apache-2.0 xvfbwrapper>=0.1.3 #license: MIT ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1709547098.8895102 ironic-ui-6.3.0/doc/source/0000775000175000017500000000000000000000000015506 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/doc/source/conf.py0000775000175000017500000001631000000000000017011 0ustar00zuulzuul00000000000000# -*- 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 os import sys import django BASE_DIR = os.path.dirname(os.path.abspath(__file__)) ROOT = os.path.abspath(os.path.join(BASE_DIR, "..", "..")) # Needs to be set for building documents without tox os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ironic_ui.test.settings') sys.path.insert(0, ROOT) sys.path.insert(0, os.path.abspath('../..')) # Starting in Django 1.7, standalone scripts, such as a sphinx build # require that django.setup() be called first. # https://docs.djangoproject.com/en/1.8/releases/1.7/#standalone-scripts django.setup() def write_autodoc_index(): def find_autodoc_modules(module_name, sourcedir): """returns a list of modules in the SOURCE directory.""" modlist = [] os.chdir(os.path.join(sourcedir, module_name)) print("SEARCHING %s" % sourcedir) for root, dirs, files in os.walk("."): for filename in files: if filename == 'tests.py': continue if filename.endswith(".py"): # remove the pieces of the root elements = root.split(os.path.sep) # replace the leading "." with the module name elements[0] = module_name # and get the base module name base, extension = os.path.splitext(filename) if not (base == "__init__"): elements.append(base) result = ".".join(elements) # print result modlist.append(result) return modlist RSTDIR = os.path.abspath(os.path.join(BASE_DIR, "contributor/api")) SRCS = [('ironic_ui', ROOT), ] EXCLUDED_MODULES = () CURRENT_SOURCES = {} if not(os.path.exists(RSTDIR)): os.mkdir(RSTDIR) CURRENT_SOURCES[RSTDIR] = ['autoindex.rst'] INDEXOUT = open(os.path.join(RSTDIR, "autoindex.rst"), "w") INDEXOUT.write(""" ================= Source Code Index ================= .. contents:: :depth: 1 :local: """) for modulename, path in SRCS: sys.stdout.write("Generating source documentation for %s\n" % modulename) INDEXOUT.write("\n%s\n" % modulename.capitalize()) INDEXOUT.write("%s\n" % ("=" * len(modulename),)) INDEXOUT.write(".. toctree::\n") INDEXOUT.write(" :maxdepth: 1\n") INDEXOUT.write("\n") MOD_DIR = os.path.join(RSTDIR, modulename) CURRENT_SOURCES[MOD_DIR] = [] if not(os.path.exists(MOD_DIR)): os.mkdir(MOD_DIR) for module in find_autodoc_modules(modulename, path): if any([module.startswith(exclude) for exclude in EXCLUDED_MODULES]): print("Excluded module %s." % module) continue mod_path = os.path.join(path, *module.split(".")) generated_file = os.path.join(MOD_DIR, "%s.rst" % module) INDEXOUT.write(" %s/%s\n" % (modulename, module)) # Find the __init__.py module if this is a directory if os.path.isdir(mod_path): source_file = ".".join((os.path.join(mod_path, "__init__"), "py",)) else: source_file = ".".join((os.path.join(mod_path), "py")) CURRENT_SOURCES[MOD_DIR].append("%s.rst" % module) # Only generate a new file if the source has changed or we don't # have a doc file to begin with. if not os.access(generated_file, os.F_OK) or ( os.stat(generated_file).st_mtime < os.stat(source_file).st_mtime): print("Module %s updated, generating new documentation." % module) FILEOUT = open(generated_file, "w") header = "The :mod:`%s` Module" % module FILEOUT.write("%s\n" % ("=" * len(header),)) FILEOUT.write("%s\n" % header) FILEOUT.write("%s\n" % ("=" * len(header),)) FILEOUT.write(".. automodule:: %s\n" % module) FILEOUT.write(" :members:\n") FILEOUT.write(" :undoc-members:\n") FILEOUT.write(" :show-inheritance:\n") FILEOUT.write(" :noindex:\n") FILEOUT.close() INDEXOUT.close() # Delete auto-generated .rst files for sources which no longer exist for directory, subdirs, files in list(os.walk(RSTDIR)): for old_file in files: if old_file not in CURRENT_SOURCES.get(directory, []): print("Removing outdated file for %s" % old_file) os.remove(os.path.join(directory, old_file)) write_autodoc_index() # -- General configuration ---------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [ 'sphinx.ext.autodoc', #'sphinx.ext.intersphinx', 'openstackdocstheme', ] # autodoc generation is a bit aggressive and a nuisance when doing heavy # text edit cycles. # execute "export SPHINX_DEBUG=1" in your terminal to disable # The suffix of source filenames. source_suffix = '.rst' # The master toctree document. master_doc = 'index' # General information about the project. copyright = '2016, OpenStack Foundation' # A list of ignored prefixes for module index sorting. modindex_common_prefix = ['ironic-ui.'] # If true, '()' will be appended to :func: etc. cross-reference text. add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). add_module_names = True # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'native' # -- Options for HTML output -------------------------------------------------- # The theme to use for HTML and HTML Help pages. Major themes that come with # Sphinx are currently 'default' and 'sphinxdoc'. html_theme = 'openstackdocs' # openstackdocstheme options openstackdocs_repo_name = 'openstack/ironic-ui' openstackdocs_pdf_link = True openstackdocs_use_storyboard = True # Output file base name for HTML help builder. htmlhelp_basename = 'ironic-uidoc' latex_use_xindy = False # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass # [howto/manual]). latex_documents = [ ('index', 'doc-ironic-ui.tex', 'Ironic UI Documentation', 'OpenStack Foundation', 'manual'), ] # Example configuration for intersphinx: refer to the Python standard library. #intersphinx_mapping = {'http://docs.python.org/': None} ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1709547098.8895102 ironic-ui-6.3.0/doc/source/contributor/0000775000175000017500000000000000000000000020060 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/doc/source/contributor/contributing.rst0000664000175000017500000000142700000000000023325 0ustar00zuulzuul00000000000000================= How to Contribute ================= Contributor License Agreement ----------------------------- .. index:: single: license; agreement In order to contribute to the Ironic UI project, you need to have signed OpenStack's contributor's agreement. .. seealso:: * https://docs.openstack.org/infra/manual/developers.html * https://wiki.openstack.org/CLA Project Hosting Details ------------------------- Bug tracker https://storyboard.openstack.org/#!/project/952 Mailing list (prefix subjects with ``[ironic]`` for faster responses) http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss Code Hosting https://opendev.org/openstack/ironic-ui Code Review https://review.opendev.org/#/q/status:open+project:openstack/ironic-ui,n,z ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/doc/source/contributor/index.rst0000664000175000017500000000052700000000000021725 0ustar00zuulzuul00000000000000========================= Contributing to Ironic UI ========================= If you're interested in contributing to the Ironic UI project, the following will help get you started. .. toctree:: :maxdepth: 1 contributing Autogenerated API Documentation =============================== .. toctree:: :maxdepth: 1 api/autoindex ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/doc/source/index.rst0000664000175000017500000000200600000000000017345 0ustar00zuulzuul00000000000000===================================== Welcome to Ironic UI's documentation! ===================================== Introduction ============ The ironic UI is an OpenStack Horizon plugin that will allow users to view and manage their ironic bare metal nodes, ports and drivers. The documentation provided here is continually kept up-to-date based on the latest code that has been committed, and may not represent the state of the project at any specific prior release. For information on any current or prior version of Ironic, see `the release notes`_. .. _the release notes: https://docs.openstack.org/releasenotes/ironic-ui/ For more information on ironic, see `the ironic documentation`_. .. _the ironic documentation: https://docs.openstack.org/ironic/latest/ .. toctree:: :maxdepth: 1 Introduction to ironic Installing the ironic UI Contributing Release notes ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1709547098.8895102 ironic-ui-6.3.0/doc/source/install/0000775000175000017500000000000000000000000017154 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/doc/source/install/index.rst0000664000175000017500000000023000000000000021010 0ustar00zuulzuul00000000000000============================ ironic-ui installation guide ============================ .. toctree:: :maxdepth: 1 installation uninstallation ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/doc/source/install/installation.rst0000664000175000017500000000466400000000000022421 0ustar00zuulzuul00000000000000.. _installation: Ironic-UI Installation ====================== Manual Installation ------------------- Please note that the following instructions assume that you have an existing installation of the OpenStack Horizon dashboard application. For Horizon installation please see https://docs.openstack.org/horizon/latest/contributor/quickstart.html. 1. Clone the Ironic UI repository:: git clone https://opendev.org/openstack/ironic-ui 2. Change into the root directory of your horizon installation and activate the python virtualenv. Example:: source .venv/bin/activate .. NOTE:: The ``.venv`` folder is pre-installed when horizon is setup with ``./run_tests.sh``. Do not attempt to reinstall the virtual environment. 3. Copy the ``_2200_ironic.py`` file from ``ironic_ui/enabled/_2200_ironic.py`` file to ``horizon/openstack_dashboard/local/enabled`` directory. Example, set as if being executed from the root of the ironic-ui repository:: cp ./ironic_ui/enabled/_2200_ironic.py ../horizon/openstack_dashboard/local/enabled 4. Change into the ironic-ui repository and package the plugin:: pip install -r requirements.txt -e . This will build and install the ironic-ui plugin into the active virtual environment associated with your horizon installation. The plugin is installed in "editable" mode as a link back to your ironic-ui plugin directory. 5. Change back into the horizon repository and bring up your environment:: ./run_tests.sh --runserver The Bare Metal service should now be visible in the Horizon navigation. 6. Start the server in test mode with the ``npm run test`` command. 7. Access the test page in order to initiate tests. http://localhost:8000/jasmine/?spec=horizon.dashboard.admin.ironic Installation with DevStack -------------------------- In order to use the Ironic UI with devstack, you will need to enable the UI plugin separately in your installation local.conf file. This is done in a similar fashion to enabling Ironic for devstack. Make sure you have horizon enabled, which is the default in devstack. Then, enable the Ironic UI plugin appending the following line to the end of the local.conf file, just after Ironic plugin enablement:: enable_plugin ironic-ui https://github.com/openstack/ironic-ui After this, you can run ./stack.sh from the devstack directory. The Bare Metal Provisioning plugin should now be visible in the Horizon navigation. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/doc/source/install/uninstallation.rst0000664000175000017500000000040300000000000022747 0ustar00zuulzuul00000000000000.. _unstallation: Uninstallation ============== To uninstall, use ``pip uninstall ironic-ui`` from with-in the horizon virtual environment. You will also need to remove the ``openstack_dashboard/enabled/_2200_ironic.py`` file from the horizon installation. ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1709547098.8895102 ironic-ui-6.3.0/ironic_ui/0000775000175000017500000000000000000000000015421 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/__init__.py0000664000175000017500000000120000000000000017523 0ustar00zuulzuul00000000000000# 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__ = pbr.version.VersionInfo( 'ironic-ui').version_string() ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1709547098.8895102 ironic-ui-6.3.0/ironic_ui/api/0000775000175000017500000000000000000000000016172 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/api/__init__.py0000664000175000017500000000000000000000000020271 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/api/ironic.py0000775000175000017500000003521100000000000020034 0ustar00zuulzuul00000000000000# # Copyright 2015, 2016 Hewlett Packard Enterprise Development Company LP # Copyright 2016 Cray Inc. # Copyright 2017 Intel Corporation # # 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 django.conf import settings from ironicclient import client from ironicclient.v1 import resource_fields as res_fields from horizon.utils.memoized import memoized # noqa from openstack_dashboard.api import base DEFAULT_IRONIC_API_VERSION = '1.34' DEFAULT_INSECURE = False DEFAULT_CACERT = None IRONIC_CLIENT_CLASS_NAME = 'baremetal' @memoized def ironicclient(request): """Returns a client connected to the Ironic backend. :param request: HTTP request. :return: Ironic client. """ insecure = getattr(settings, 'OPENSTACK_SSL_NO_VERIFY', DEFAULT_INSECURE) cacert = getattr(settings, 'OPENSTACK_SSL_CACERT', DEFAULT_CACERT) ironic_url = base.url_for(request, IRONIC_CLIENT_CLASS_NAME) return client.get_client(1, endpoint=ironic_url, os_ironic_api_version=DEFAULT_IRONIC_API_VERSION, token=request.user.token.id, insecure=insecure, cacert=cacert) def node_list(request): """Retrieve a list of nodes. :param request: HTTP request. :return: A list of nodes. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.list """ node_manager = ironicclient(request).node return node_manager.list(detail=True, limit=0) def node_get(request, node_id): """Retrieve a node. :param request: HTTP request. :param node_id: The UUID or name of the node. :return: node. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.get """ return ironicclient(request).node.get(node_id) def node_list_ports(request, node_id): """List all the ports on a given node. :param request: HTTP request. :param node_id: The UUID or name of the node. :return: A full list of ports. (limit=0) http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.list_ports """ return ironicclient(request).node.list_ports(node_id, limit=0, detail=True) def node_set_power_state(request, node_id, state, soft=False): """Set power state for a given node. :param request: HTTP request. :param node_id: The UUID or name of the node. :param state: the power state to set ['on', 'off', 'reboot']. :param soft: flag for graceful power 'off' or reboot :return: node. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.set_power_state """ return ironicclient(request).node.set_power_state(node_id, state, soft) def node_set_provision_state(request, node_id, state, cleansteps=None): """Set the target provision state for a given node. :param request: HTTP request. :param node_id: The UUID or name of the node. :param state: the target provision state to set. :param cleansteps: Optional list of cleaning steps :return: node. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.set_provision_state """ node_manager = ironicclient(request).node return node_manager.set_provision_state(node_id, state, cleansteps=cleansteps) def node_set_console_mode(request, node_id, enabled): """Start or stop the serial console for a given node. :param request: HTTP request. :param node_id: The UUID or name of the node. :param enabled: True to start the console, False to stop it :return: node. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.set_console_mode """ return ironicclient(request).node.set_console_mode(node_id, enabled) def node_get_console(request, node_id): """Get connection information for a node's console. :param request: HTTP request. :param node_id: The UUID or name of the node. :return: Console connection information http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.get_console """ return ironicclient(request).node.get_console(node_id) def node_set_maintenance(request, node_id, state, maint_reason=None): """Set the maintenance mode on a given node. :param request: HTTP request. :param node_id: The UUID or name of the node. :param state: The maintenance state to set. :return: node. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.set_maintenance """ return ironicclient(request).node.set_maintenance( node_id, state, maint_reason=maint_reason) def node_create(request, params): """Create a node :param request: HTTP request. :param params: Dictionary of node parameters """ node_manager = ironicclient(request).node node = node_manager.create(**params) return dict([(f, getattr(node, f, '')) for f in res_fields.NODE_DETAILED_RESOURCE.fields]) def node_delete(request, node_id): """Delete a node from inventory. :param request: HTTP request. :param node_id: The UUID or name of the node. :return: node. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.delete """ return ironicclient(request).node.delete(node_id) def node_update(request, node_id, patch): """Update a specified node. :param request: HTTP request. :param node_id: The UUID or name of the node. :param patch: Sequence of update operations :return: node. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.update """ node = ironicclient(request).node.update(node_id, patch) return dict([(f, getattr(node, f, '')) for f in res_fields.NODE_DETAILED_RESOURCE.fields]) def node_validate(request, node_id): """Validate a specified node. :param request: HTTP request. :param node_id: The UUID or name of the node. :return: List of dictionaries, each containing an interface status http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.validate """ ifaces = ironicclient(request).node.validate(node_id) result = [] for interface, status in ifaces.to_dict().items(): data = {'interface': interface} data.update(status) result.append(data) return result def node_get_boot_device(request, node_id): """Get the boot device for a specified node. :param request: HTTP request. :param node_id: The UUID or name of the node. :return: Dictionary with keys "boot_device" and "persistent" http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.get_boot_device """ return ironicclient(request).node.get_boot_device(node_id) def node_set_boot_device(request, node_id, device, persistent): """Set the boot device for a specified node. :param request: HTTP request. :param node_id: The UUID or name of the node. :param device: boot device. :param persistent: True or False. :return: null. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.set_boot_device """ return ironicclient(request).node.set_boot_device(node_id, device, persistent) def node_get_supported_boot_devices(request, node_id): """Get the list of supported boot devices for a specified node. :param request: HTTP request. :param node_id: The UUID or name of the node. :return: List of supported boot devices (strings) http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.get_boot_device """ result = ironicclient(request).node.get_supported_boot_devices(node_id) return result.get('supported_boot_devices', []) def node_inject_nmi(request, node_id): """Inject Non-Masking Interrupts into a specified node. :param request: HTTP request. :param node_id: The UUID or name of the node. :return: Empty response. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.inject_nmi """ return ironicclient(request).node.inject_nmi(node_id) def driver_list(request): """Retrieve a list of drivers. :param request: HTTP request. :return: A list of drivers. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.driver.html#ironicclient.v1.driver.DriverManager.list """ return ironicclient(request).driver.list() def driver_properties(request, driver_name): """Retrieve the properties of a specified driver :param request: HTTP request :param driver_name: Name of the driver :return: Property list http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.driver.html#ironicclient.v1.driver.DriverManager.properties """ return ironicclient(request).driver.properties(driver_name) def driver_details(request, driver_name): """Retrieve the details of a specified driver :param request: HTTP request :param driver_name: Name of the driver :return: dictionary of driver details https://docs.openstack.org/python-ironicclient/latest/cli/osc/v1/index.html#baremetal-driver-show """ details = ironicclient(request).driver.get(driver_name) return details.to_dict() def port_create(request, params): """Create network port :param request: HTTP request :param params: Port creation parameters :return: Port http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.port.html#ironicclient.v1.port.PortManager.create """ port_manager = ironicclient(request).port return port_manager.create(**params) def port_delete(request, port_uuid): """Delete a network port :param request: HTTP request :param port_uuid: Port uuid :return: Port http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.port.html#ironicclient.v1.port.PortManager.delete """ return ironicclient(request).port.delete(port_uuid) def port_update(request, port_uuid, patch): """Update a specified port. :param request: HTTP request. :param port_id: The UUID of the port. :param patch: Sequence of update operations :return: Port. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.port.html#ironicclient.v1.port.PortManager.update """ port = ironicclient(request).port.update(port_uuid, patch) return dict([(f, getattr(port, f, '')) for f in res_fields.PORT_DETAILED_RESOURCE.fields]) def portgroup_list(request, node_id): """List the portgroups associated with a given node. :param request: HTTP request. :param node_id: The UUID or name of the node. :return: A full list of portgroups. (limit=0) http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.portgroup.html#ironicclient.v1.portgroup.PortgroupManager.list_portgroups """ return ironicclient(request).portgroup.list(node_id, limit=0, detail=True) def portgroup_create(request, params): """Create a portgroup. :param request: HTTP request. :param params: Portgroup creation parameters. :return: Portgroup. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.portgroup.html#ironicclient.v1.portgroup.PortgroupManager.create """ portgroup_manager = ironicclient(request).portgroup return portgroup_manager.create(**params) def portgroup_delete(request, portgroup_id): """Delete a portgroup from the DB. :param request: HTTP request. :param portgroup_id: The UUID or name of the portgroup. :return: Portgroup. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.portgroup.html#ironicclient.v1.portgroup.PortgroupManager.delete """ return ironicclient(request).portgroup.delete(portgroup_id) def portgroup_update(request, portgroup_id, patch): """Update a specified portgroup. :param request: HTTP request. :param portgroup_id: The UUID or name of the portgroup. :param patch: Sequence of update operations :return: Portgroup. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.port.html#ironicclient.v1.portgroup.PortgroupManager.update """ portgroup = ironicclient(request).portgroup.update(portgroup_id, patch) return dict([(f, getattr(portgroup, f, '')) for f in res_fields.PORTGROUP_DETAILED_RESOURCE.fields]) def portgroup_get_ports(request, portgroup_id): """Get the ports associated with a specified portgroup. :param request: HTTP request. :param portgroup_id: The UUID or name of the portgroup. :return: List of ports. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.portgroup.html#ironicclient.v1.portgroup.PortgroupManager.list_ports """ return ironicclient(request).portgroup.list_ports(portgroup_id) def node_set_raid_config(request, node_id, target_raid_config): """Set target raid configuration for a given node. :param request: HTTP request. :param node_id: The UUID or name of the node. :param target_raid_config: Target raid configuration. :return: Node. http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.set_target_raid_config """ return ironicclient(request).node.set_target_raid_config( node_id, target_raid_config) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/api/ironic_rest_api.py0000775000175000017500000003272100000000000021725 0ustar00zuulzuul00000000000000# # Copyright 2015, 2016 Hewlett Packard Enterprise Development Company LP # Copyright 2016 Cray Inc. # Copyright 2017 Intel Corporation # # 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 django.views import generic from ironic_ui.api import ironic from openstack_dashboard.api.rest import urls from openstack_dashboard.api.rest import utils as rest_utils LOGICAL_NAME_PATTERN = '[a-zA-Z0-9-._~]+' @urls.register class Nodes(generic.View): url_regex = r'ironic/nodes/$' @rest_utils.ajax() def get(self, request): """Get the list of nodes. :param request: HTTP request. :return: List of nodes. """ nodes = ironic.node_list(request) return { 'nodes': [i.to_dict() for i in nodes] } @rest_utils.ajax(data_required=True) def post(self, request): """Create an Ironic node. :param request: HTTP request. """ params = request.DATA.get('node') return ironic.node_create(request, params) @urls.register class Node(generic.View): url_regex = r'ironic/nodes/(?P{})$'.format(LOGICAL_NAME_PATTERN) @rest_utils.ajax() def get(self, request, node_id): """Get information on a specified node. :param request: HTTP request. :param node_id: Node name or uuid. :return: node. """ return ironic.node_get(request, node_id).to_dict() @rest_utils.ajax(data_required=True) def patch(self, request, node_id): """Update an Ironic node. :param request: HTTP request. :param node_id: Node name or uuid. """ patch = request.DATA.get('patch') return ironic.node_update(request, node_id, patch) @rest_utils.ajax() def delete(self, request, node_id): """Delete an Ironic node from inventory :param request: HTTP request. :param node_id: Node name or uuid. """ return ironic.node_delete(request, node_id) @urls.register class Ports(generic.View): url_regex = r'ironic/ports/$' @rest_utils.ajax(data_required=True) def post(self, request): """Create a network port. :param request: HTTP request. :return: Port """ port = request.DATA.get('port') return ironic.port_create(request, port).to_dict() @urls.register class Port(generic.View): url_regex = r'ironic/ports/(?P[0-9a-f-]+)$' @rest_utils.ajax(data_required=True) def patch(self, request, port_uuid): """Update an Ironic port. :param request: HTTP request. :param port_uuid: Port uuid. """ patch = request.DATA.get('patch') return ironic.port_update(request, port_uuid, patch) @rest_utils.ajax() def delete(self, request, port_uuid): """Delete a network port. :param request: HTTP request :param port_uuid: Port uuid. """ return ironic.port_delete(request, port_uuid) @urls.register class StatesPower(generic.View): url_regex = r'ironic/nodes/(?P{})/states/power$'. \ format(LOGICAL_NAME_PATTERN) @rest_utils.ajax(data_required=True) def patch(self, request, node_id): """Set the power state for a specified node. :param request: HTTP request. :param node_id: Node name or uuid. :return: Return code. """ return ironic.node_set_power_state(request, node_id, request.DATA.get('state'), request.DATA.get('soft')) @urls.register class StatesProvision(generic.View): url_regex = r'ironic/nodes/(?P{})/states/provision$'. \ format(LOGICAL_NAME_PATTERN) @rest_utils.ajax(data_required=True) def put(self, request, node_id): """Set the provision state for a specified node. :param request: HTTP request. :param node_id: Node name or uuid. :return: Return code. """ verb = request.DATA.get('verb') clean_steps = request.DATA.get('clean_steps') return ironic.node_set_provision_state(request, node_id, verb, clean_steps) @urls.register class StatesConsole(generic.View): url_regex = r'ironic/nodes/(?P{})/states/console$'. \ format(LOGICAL_NAME_PATTERN) @rest_utils.ajax() def get(self, request, node_id): """Get connection information for the node's console :param request: HTTP request. :param node_id: Node name or uuid. :return: Connection information. """ return ironic.node_get_console(request, node_id) @rest_utils.ajax(data_required=True) def put(self, request, node_id): """Start or stop the serial console. :param request: HTTP request. :param node_id: Node name or uuid. :return: Return code. """ return ironic.node_set_console_mode(request, node_id, request.DATA.get('enabled')) @urls.register class Maintenance(generic.View): url_regex = r'ironic/nodes/(?P{})/maintenance$'. \ format(LOGICAL_NAME_PATTERN) @rest_utils.ajax() def patch(self, request, node_id): """Put a specified node into maintenance state :param request: HTTP request. :param node_id: Node name or uuid. :return: Return code. """ maint_reason = request.DATA.get('maint_reason') return ironic.node_set_maintenance( request, node_id, 'on', maint_reason=maint_reason) @rest_utils.ajax() def delete(self, request, node_id): """Take a specified node out of the maintenance state :param request: HTTP request. :param node_id: Node name or uuid. :return: Return code. """ return ironic.node_set_maintenance(request, node_id, 'off') @urls.register class Validate(generic.View): url_regex = r'ironic/nodes/(?P{})/validate$'. \ format(LOGICAL_NAME_PATTERN) @rest_utils.ajax() def get(self, request, node_id): """Validate a specified node :param request: HTTP request. :param node_id: Node name or uuid. :return: List of dictionaries of interface statuses. """ return ironic.node_validate(request, node_id) @urls.register class BootDevice(generic.View): url_regex = r'ironic/nodes/(?P{})/boot_device$'. \ format(LOGICAL_NAME_PATTERN) @rest_utils.ajax() def get(self, request, node_id): """Get the boot device for a specified node :param request: HTTP request. :param node_id: Node name or uuid. :return: Dictionary with keys "boot_device" and "persistent". """ return ironic.node_get_boot_device(request, node_id) @rest_utils.ajax(data_required=True) def put(self, request, node_id): """Set the boot device for a specific node :param request: HTTP request. :param node_id: Node name or uuid. :return: null. """ return ironic.node_set_boot_device( request, node_id, request.DATA.get('boot_device'), persistent=request.DATA.get('persistent')) @urls.register class SupportedBootDevices(generic.View): url_regex = r'ironic/nodes/(?P{})/boot_device/supported$' . \ format(LOGICAL_NAME_PATTERN) @rest_utils.ajax() def get(self, request, node_id): """Get the list of supported boot devices for a specified node. :param request: HTTP request. :param node_id: Node name or uuid. :return: List of supported boot devices. """ return ironic.node_get_supported_boot_devices(request, node_id) @urls.register class Drivers(generic.View): url_regex = r'ironic/drivers/$' @rest_utils.ajax() def get(self, request): """Get the list of drivers. :param request: HTTP request. :return: List of drivers. """ drivers = ironic.driver_list(request) return { 'drivers': [i.to_dict() for i in drivers] } @urls.register class DriverProperties(generic.View): url_regex = r'ironic/drivers/(?P[0-9a-zA-Z_-]+)/properties$' @rest_utils.ajax() def get(self, request, driver_name): """Get the properties associated with a specified driver :param request: HTTP request. :param driver_name: Driver name. :return: Dictionary of properties. """ return ironic.driver_properties(request, driver_name) @urls.register class Portgroups(generic.View): url_regex = r'ironic/portgroups$' @rest_utils.ajax(data_required=True) def post(self, request): """Create a portgroup. :param request: HTTP request. :return: Portgroup. """ return ironic.portgroup_create(request, request.DATA).to_dict() @urls.register class NodePorts(generic.View): url_regex = r'ironic/nodes/(?P{})/ports/detail$' . \ format(LOGICAL_NAME_PATTERN) @rest_utils.ajax() def get(self, request, node_id): """Get the list of ports associated with a specified node. :param request: HTTP request. :param node_id: Node name or uuid. :return: List of ports. """ ports = ironic.node_list_ports(request, node_id) return { 'ports': [i.to_dict() for i in ports] } @urls.register class NodePortgroups(generic.View): url_regex = r'ironic/nodes/(?P{})/portgroups$' . \ format(LOGICAL_NAME_PATTERN) @rest_utils.ajax() def get(self, request, node_id): """Get the list of portgroups associated with a specified node. :param request: HTTP request. :param node_id: Node name or uuid. :return: List of portgroups. """ portgroups = ironic.portgroup_list(request, node_id) return { 'portgroups': [i.to_dict() for i in portgroups] } @urls.register class Portgroup(generic.View): url_regex = r'ironic/portgroups/(?P{})$'. \ format(LOGICAL_NAME_PATTERN) @rest_utils.ajax(data_required=True) def patch(self, request, portgroup_id): """Update an Ironic portgroup. :param request: HTTP request. :param portgroup_id: UUID or name of portgroup. """ patch = request.DATA.get('patch') return ironic.portgroup_update(request, portgroup_id, patch) @rest_utils.ajax() def delete(self, request, portgroup_id): """Delete a portgroup. :param request: HTTP request. :param portgroup_id: UUID or name of portgroup. """ return ironic.portgroup_delete(request, portgroup_id) @urls.register class PortgroupPorts(generic.View): url_regex = r'ironic/portgroups/(?P{})/ports$'. \ format(LOGICAL_NAME_PATTERN) @rest_utils.ajax() def get(self, request, portgroup_id): """Get the ports for a specified portgroup. :param request: HTTP request. :param portgroup_id: UUID or name of portgroup. :return: List of port objects. """ ports = ironic.portgroup_get_ports(request, portgroup_id) return { 'ports': [i.to_dict() for i in ports] } @urls.register class RaidConfig(generic.View): url_regex = r'ironic/nodes/(?P{})/states/raid$'. \ format(LOGICAL_NAME_PATTERN) @rest_utils.ajax(data_required=True) def put(self, request, node_id): """Set the RAID configuration for a specified node. :param request: HTTP request. :param node_id: Node name or node uuid :return: None """ return ironic.node_set_raid_config( request, node_id, request.DATA.get('target_raid_config')) @urls.register class DriverDetails(generic.View): url_regex = r'ironic/drivers/(?P[0-9a-zA-Z_-]+)$' @rest_utils.ajax() def get(self, request, driver_name): """Get the details of a specified driver :param request: HTTP request :param driver_name: Driver name :return: Dictionary of details """ return ironic.driver_details(request, driver_name) @urls.register class InjectNmi(generic.View): url_regex = r'ironic/nodes/(?P{})/management/inject_nmi$'. \ format(LOGICAL_NAME_PATTERN) @rest_utils.ajax(data_required=True) def put(self, request, node_id): """Inject Non-Masking Interrupts into a specified node. :param request: HTTP request. :param node_id: Node name or uuid. :return: Empty response. """ return ironic.node_inject_nmi(request, node_id) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1709547098.8895102 ironic-ui-6.3.0/ironic_ui/content/0000775000175000017500000000000000000000000017073 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/content/__init__.py0000664000175000017500000000120000000000000021175 0ustar00zuulzuul00000000000000# 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__ = pbr.version.VersionInfo( 'ironic-ui').version_string() ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1709547098.8895102 ironic-ui-6.3.0/ironic_ui/content/ironic/0000775000175000017500000000000000000000000020356 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/content/ironic/__init__.py0000664000175000017500000000000000000000000022455 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/content/ironic/panel.py0000664000175000017500000000200000000000000022017 0ustar00zuulzuul00000000000000# Copyright 2016 Cisco Systems, Inc. # Copyright (c) 2016 Hewlett Packard Enterprise Development Company LP # # 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 django.utils.translation import gettext_lazy as _ import horizon from openstack_dashboard.dashboards.admin import dashboard class Ironic(horizon.Panel): name = _("Ironic Bare Metal Provisioning") slug = 'ironic' permissions = ('openstack.roles.admin', 'openstack.services.baremetal',) dashboard.Admin.register(Ironic) ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.88151 ironic-ui-6.3.0/ironic_ui/content/ironic/templates/0000775000175000017500000000000000000000000022354 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1709547098.8895102 ironic-ui-6.3.0/ironic_ui/content/ironic/templates/ironic/0000775000175000017500000000000000000000000023637 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/content/ironic/templates/ironic/index.html0000664000175000017500000000112600000000000025634 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Ironic Bare Metal Provisioning" %}{% endblock %} {% block breadcrumb_nav %} {% endblock %} {% block page_header %} {% endblock %} {% block main %} {% endblock %} ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/content/ironic/templates/ironic/node_detail.html0000664000175000017500000000114000000000000026770 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Node Details" %}{% endblock %} {% block breadcrumb_nav %} {% endblock %} {% block page_header %} {% endblock %} {% block main %} {% endblock %} ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/content/ironic/urls.py0000664000175000017500000000167200000000000021723 0ustar00zuulzuul00000000000000# Copyright 2016 Cisco Systems, Inc. # Copyright (c) 2016 Hewlett Packard Enterprise Development Company LP # Copyright (c) 2016 Cray 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 django.urls import re_path import ironic_ui.api.ironic_rest_api # noqa from ironic_ui.content.ironic import views urlpatterns = [ re_path(r'^$', views.IndexView.as_view(), name='index'), re_path(r'^([^/]+)/$', views.DetailView.as_view(), name='detail'), ] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/content/ironic/views.py0000664000175000017500000000164000000000000022066 0ustar00zuulzuul00000000000000# Copyright 2016 Cisco Systems, Inc. # Copyright (c) 2016 Hewlett Packard Enterprise Development Company LP # Copyright (c) 2016 Cray 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 django.views import generic class IndexView(generic.TemplateView): template_name = 'admin/ironic/index.html' class DetailView(generic.TemplateView): template_name = 'admin/ironic/node_detail.html' ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1709547098.8895102 ironic-ui-6.3.0/ironic_ui/enabled/0000775000175000017500000000000000000000000017013 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/enabled/_2200_ironic.py0000664000175000017500000000244700000000000021461 0ustar00zuulzuul00000000000000# Copyright (c) 2016 Hewlett Packard Enterprise Development Company LP # Copyright (c) 2016 Cray 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 name of the panel to be added to HORIZON_CONFIG. Required. PANEL = 'ironic' # The name of the dashboard the PANEL associated with. Required. PANEL_DASHBOARD = 'admin' # The name of the panel group the PANEL is associated with. PANEL_GROUP = 'admin' # Python panel class of the PANEL to be added. ADD_PANEL = 'ironic_ui.content.ironic.panel.Ironic' # A list of applications to be prepended to INSTALLED_APPS ADD_INSTALLED_APPS = ['ironic_ui', ] # A list of AngularJS modules to be loaded when Angular bootstraps. ADD_ANGULAR_MODULES = ['horizon.dashboard.admin.ironic'] # Automatically discover static resources in installed apps AUTO_DISCOVER_STATIC_FILES = True ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/enabled/__init__.py0000664000175000017500000000000000000000000021112 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/karma.conf.js0000664000175000017500000001323600000000000020003 0ustar00zuulzuul00000000000000/* * 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. */ var fs = require('fs'); var path = require('path'); (function () { 'use strict'; module.exports = function (config) { // This tox venv is setup in the post-install npm step var toxPath = path.resolve('./.tox/npm'); if (!toxPath) { console.error('xStatic libraries not found, please run `tox -e npm`'); process.exit(1); } toxPath += '/lib/'; toxPath += fs.readdirSync(toxPath).find(function(directory) { return directory.indexOf('python') === 0; }); toxPath += '/site-packages/'; config.set({ preprocessors: { // Used to collect templates for preprocessing. // NOTE: the templates must also be listed in the files section below. './static/**/*.html': ['ng-html2js'], // Used to indicate files requiring coverage reports. './static/**/!(*.spec).js': ['coverage'] }, // Sets up module to process templates. ngHtml2JsPreprocessor: { prependPrefix: '/', moduleName: 'templates' }, basePath: './', // Contains both source and test files. files: [ /* * shim, partly stolen from /i18n/js/horizon/ * Contains expected items not provided elsewhere (dynamically by * Django or via jasmine template. */ '../test-shim.js', '../node_modules/string.prototype.endswith/*.js', // from jasmine.html toxPath + 'xstatic/pkg/jquery/data/jquery.js', toxPath + 'xstatic/pkg/angular/data/angular.js', toxPath + 'xstatic/pkg/angular/data/angular-route.js', toxPath + 'xstatic/pkg/angular/data/angular-mocks.js', toxPath + 'xstatic/pkg/angular/data/angular-cookies.js', toxPath + 'xstatic/pkg/angular_bootstrap/data/angular-bootstrap.js', toxPath + 'xstatic/pkg/angular_gettext/data/angular-gettext.js', toxPath + 'xstatic/pkg/angular/data/angular-sanitize.js', toxPath + 'xstatic/pkg/d3/data/d3.js', toxPath + 'xstatic/pkg/rickshaw/data/rickshaw.js', toxPath + 'xstatic/pkg/angular_smart_table/data/smart-table.js', toxPath + 'xstatic/pkg/angular_lrdragndrop/data/lrdragndrop.js', toxPath + 'xstatic/pkg/angular_fileupload/data/ng-file-upload-all.js', toxPath + 'xstatic/pkg/spin/data/spin.js', toxPath + 'xstatic/pkg/spin/data/spin.jquery.js', toxPath + 'xstatic/pkg/tv4/data/tv4.js', toxPath + 'xstatic/pkg/objectpath/data/ObjectPath.js', toxPath + 'xstatic/pkg/angular_schema_form/data/schema-form.js', toxPath + '/horizon/static/horizon/js/horizon.js', toxPath + '/horizon/static/horizon/js/horizon.uuid.js', /** * Include framework source code from horizon that we need. * Otherwise, karma will not be able to find them when testing. * These files should be mocked in the foreseeable future. */ toxPath + 'horizon/static/framework/**/*.module.js', toxPath + 'horizon/static/framework/**/!(*.spec|*.mock).js', toxPath + 'openstack_dashboard/static/**/*.module.js', toxPath + 'openstack_dashboard/static/**/!(*.spec|*.mock).js', toxPath + 'openstack_dashboard/dashboards/**/static/**/*.module.js', toxPath + 'openstack_dashboard/dashboards/**/static/**/!(*.spec|*.mock).js', /** * First, list all the files that defines application's angular modules. * Those files have extension of `.module.js`. The order among them is * not significant. */ './static/**/*.module.js', /** * Followed by other JavaScript files that defines angular providers * on the modules defined in files listed above. And they are not mock * files or spec files defined below. The order among them is not * significant. */ './static/**/!(*.spec|*.mock).js', /** * Then, list files for mocks with `mock.js` extension. The order * among them should not be significant. */ toxPath + 'openstack_dashboard/static/**/*.mock.js', /** * Finally, list files for spec with `spec.js` extension. The order * among them should not be significant. */ './static/**/*.spec.js', /** * Angular external templates */ './static/**/*.html' ], autoWatch: true, frameworks: ['jasmine', 'jasmine-matchers'], browsers: ['Firefox'], browserNoActivityTimeout: 60000, reporters: ['progress', 'coverage', 'threshold'], plugins: [ 'karma-firefox-launcher', 'karma-jasmine', 'karma-jasmine-matchers', 'karma-ng-html2js-preprocessor', 'karma-coverage', 'karma-threshold-reporter' ], // Places coverage report in HTML format in the subdirectory below. coverageReporter: { type: 'html', dir: '../cover/karma/' }, // Coverage threshold values. thresholdReporter: { statements: 10, // target 100 branches: 0, // target 100 functions: 10, // target 100 lines: 10 // target 100 } }); }; }()); ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.88151 ironic-ui-6.3.0/ironic_ui/locale/0000775000175000017500000000000000000000000016660 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.88151 ironic-ui-6.3.0/ironic_ui/locale/de/0000775000175000017500000000000000000000000017250 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.89351 ironic-ui-6.3.0/ironic_ui/locale/de/LC_MESSAGES/0000775000175000017500000000000000000000000021035 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/locale/de/LC_MESSAGES/django.po0000664000175000017500000000143500000000000022642 0ustar00zuulzuul00000000000000# Robert Simai , 2016. #zanata # Robert Simai , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: ironic-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-25 10:13+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-05-03 02:16+0000\n" "Last-Translator: Robert Simai \n" "Language-Team: German\n" "Language: de\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "Admin" msgstr "Admin" msgid "Ironic Bare Metal Provisioning" msgstr "Ironic Bare Metal Provisionierung" msgid "Node Details" msgstr "Knoten Details" msgid "System" msgstr "System" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/locale/de/LC_MESSAGES/djangojs.po0000664000175000017500000004326400000000000023205 0ustar00zuulzuul00000000000000# Robert Simai , 2016. #zanata # Frank Kloeker , 2017. #zanata # Robert Simai , 2017. #zanata # Robert Simai , 2018. #zanata # Andreas Jaeger , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: ironic-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-09-27 08:21+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-09-26 07:57+0000\n" "Last-Translator: Andreas Jaeger \n" "Language-Team: German\n" "Language: de\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgstr " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgid "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" msgstr "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" #, python-format msgid "A request has been made to change the provisioning state of node %s" msgstr "" "Eine Anfrage wurde erstellt, um den Provisionierungszustand des Knotens %s " "zu ändern" msgid "A unique node name. Optional." msgstr "Ein eindeutiger Knotenname. Optional." msgid "Abort cleaning" msgstr "Bereinigung abbrechen" msgid "Action" msgstr "Aktion" msgid "Actions" msgstr "Aktionen" msgid "Add Extra" msgstr "Extra hinzufügen" msgid "Add Instance Property" msgstr "Instanzeigenschaft hinzufügen" msgid "Add Logical Disk" msgstr "Logische Festplatte hinzufügen." msgid "Add Property" msgstr "Eigenschaft hinzufügen" #, python-format msgid "" "Are you sure you want to delete node \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete nodes \"%s\"? This action cannot be undone." msgstr[0] "" "Sind Sie sicher, dass Sie den Knoten \"%s\" löschen wollen? Diese Aktion " "kann nicht rückgängig gemacht werden." msgstr[1] "" "Sind Sie sicher, dass Sie die Knoten \"%s\" löschen wollen? Diese Aktion " "kann nicht rückgängig gemacht werden." #, python-format msgid "" "Are you sure you want to delete port \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete ports \"%s\"? This action cannot be undone." msgstr[0] "" "Sind Sie sicher, dass Sie den Port \"%s\" löschen wollen? Diese Aktion kann " "nicht rückgängig gemacht werden." msgstr[1] "" "Sind Sie sicher, dass Sie die Ports \"%s\" löschen wollen? Diese Aktion kann " "nicht rückgängig gemacht werden." #, python-format msgid "" "Are you sure you want to delete portgroup \"%s\"? This action cannot be " "undone." msgid_plural "" "Are you sure you want to delete portgroups \"%s\"? This action cannot be " "undone." msgstr[0] "" "Sind Sie sicher, dass Sie die Portgruppe \"%s\" löschen wollen? Diese Aktion " "kann nicht rückgängig gemacht werden." msgstr[1] "" "Sind Sie sicher, dass Sie die Portgruppen \"%s\" löschen wollen? Diese " "Aktion kann nicht rückgängig gemacht werden." msgid "Attributes" msgstr "Attribute" msgid "Boot Device" msgstr "Boot-Gerät" msgid "Cancel" msgstr "Abbrechen" msgid "Chassis ID" msgstr "Chassis-ID" msgid "Choose an Image" msgstr "Wählen Sie ein Abbild" msgid "Clean" msgstr "Bereinigen" msgid "Clean Node" msgstr "Knoten bereinigen" msgid "Clean Step" msgstr "Bereinigungsschritt" msgid "Clean node" msgstr "Knoten bereinigen" msgid "Clean steps should be an non-empty array" msgstr "Reinigungsschritte sollten ein nicht-leeres Array sein" msgid "Click link to view console" msgstr "Klicken Sie auf den Link, um nur die Konsole anzuzeigen." msgid "Configuration" msgstr "Konfiguration" msgid "Console Enabled" msgstr "Konsole aktiviert" msgid "Console Info." msgstr "Konsoleninformation." msgid "Create Port" msgstr "Port erstellen" msgid "Create Portgroup" msgstr "Portgruppe erstellen" msgid "Created At" msgstr "Erstellt am" msgid "Current Interface" msgstr "Aktuelle Schnittstelle" msgid "Defaults to ([^\"\\. ]+|\"[^\"]+\")" msgstr "Standard ist ([^\"\\. ]+|\"[^\"]+\")" msgid "Delete Node" msgid_plural "Delete Nodes" msgstr[0] "Knoten löschen" msgstr[1] "Knoten löschen" msgid "Delete Nodes" msgstr "Knoten löschen" msgid "Delete Port" msgid_plural "Delete Ports" msgstr[0] "Port löschen" msgstr[1] "Ports löschen" msgid "Delete Portgroup" msgid_plural "Delete Portgroups" msgstr[0] "Portgruppe löschen" msgstr[1] "Portgruppen löschen" msgid "Delete Portgroups" msgstr "Lösche Portgruppen" msgid "Delete Ports" msgstr "Ports löschen" msgid "Deploy Kernel" msgstr "Kernel bereitstellen" msgid "Deploy Ramdisk" msgstr "Ramdisk bereitstellen" msgid "Device" msgstr "Gerät" msgid "Driver" msgstr "Treiber" msgid "Driver Details" msgstr "Treiberdetails" msgid "Driver Info" msgstr "Treiberinformationen" msgid "Driver Interfaces" msgstr "Treiber-Schnittstellen" msgid "Driver Validation" msgstr "Treibervalidierung" msgid "" "Each cleaning step must be an object that contains \"interface\" and \"step" "\" properties" msgstr "" "Jeder Reinigunsschritt muss ein Objekt sein, das \"interface\" und \"step\" " "Eigenschaften enthält" msgid "Edit" msgstr "Bearbeiten" msgid "Edit Node" msgstr "Knoten bearbeiten" msgid "Edit Port" msgstr "Port bearbeiten" msgid "Edit Portgroup" msgstr "Portgruppe bearbeiten" msgid "Enroll Node" msgstr "Knoten ausrollen" msgid "Extra" msgstr "Extra" msgid "Extra Property Name" msgstr "Extra Eigenschaftname" msgid "Extras" msgstr "Extras" msgid "General" msgstr "Allgemein" msgid "Image Source" msgstr "Abbildquelle" msgid "Indicates whether this port should be used when PXE booting this node" msgstr "Gibt an, ob der Port beim PXE-Boot des Knotens verwendet werden soll" msgid "Inject NMI" msgstr "NMI einfügen" msgid "Inspect" msgstr "Inspizieren" msgid "Inspection Finished At" msgstr "Inspektion beendet um" msgid "Inspection Started At" msgstr "Inspektion gestartet um" msgid "Instance ID" msgstr "Instanz-ID" msgid "Instance Info" msgstr "Instanzinformation" msgid "Instance Name" msgstr "Instanzname" msgid "Instance Property Name" msgstr "Instanzeigenschaftname" msgid "Interface" msgstr "Interface" msgid "Kernel" msgstr "Kernel" msgid "Last Error" msgstr "Letzter Fehler" msgid "" "Linux portgroup mode. For possible values refer to https://www.kernel.org/" "doc/Documentation/networking/bonding.txt" msgstr "" "Linux Portgruppen Modus. Mögliche Werte finden Sie hier: https://www.kernel." "org/doc/Documentation/networking/bonding.txt" msgid "Local Link Connection" msgstr "Local Link Verbindung" msgid "Local link connection" msgstr "Local Link Verbindung" msgid "MAC Address" msgstr "MAC-Adresse" msgid "MAC address" msgstr "MAC-Adresse" msgid "MAC address for this port. Required." msgstr "MAC-Adresse für diesen Port. Erforderlich." msgid "MAC address for this portgroup." msgstr "MAC-Adresse für diese Portgruppe" msgid "MAC address or OpenFlow datapath ID" msgstr "MAC Adresse oder OpenFlow datapath ID" msgid "Maintenance" msgstr "Wartung" msgid "Maintenance Reason" msgstr "Grund der Wartung" msgid "Mode" msgstr "Modus" msgid "Move to" msgstr "Verschieben nach" msgid "Name" msgstr "Name" msgid "Name for the portgroup." msgstr "Name der Portgruppe." msgid "Network Interface" msgstr "Netzwerk Schnittstelle" msgid "No Instance" msgstr "Keine Instanz" msgid "No network ports have been defined" msgstr "Es wurden keine Netzwerkports definiert" msgid "No portgroups have been defined" msgstr "Es wurden keine Portgruppen definiert" msgid "No reason given." msgstr "Kein Grund angegeben." msgid "Node" msgstr "Knoten" #, python-format msgid "Node %s is already in target maintenance state." msgstr "Knoten %s ist bereits im beabsichtigten Wartungszustand." msgid "Node Driver" msgstr "Knotentreiber" msgid "Node ID" msgstr "Knoten-ID" msgid "Node Info" msgstr "Knoteninformation" msgid "Node Name" msgstr "Knotenname" msgid "One of this, (.*) must be specified\\." msgstr "Einer von diesen, (.*) muss spezifiziert sein\\." msgid "Overview" msgstr "Übersicht" msgid "PXE Enabled" msgstr "PXE aktiviert" msgid "PXE enabled" msgstr "PXE aktiviert" msgid "Persistent" msgstr "Persistent" msgid "Port successfully created" msgstr "Port erfolgreich erstellt" msgid "Portgroup" msgstr "Portgruppe" msgid "Portgroup successfully created" msgstr "Portgruppe erfolgreich erstellt" msgid "Portgroup that this port belongs to" msgstr "Portgruppe, zu der der Port gehört" msgid "Portgroups" msgstr "Portgruppen" msgid "Ports" msgstr "Ports" msgid "Power State" msgstr "Zustand" msgid "Power off" msgstr "Ausschalten" msgid "Power on" msgstr "Einschalten" msgid "Properties" msgstr "Eigenschaften" msgid "Property Name" msgstr "Eigenschaftname" msgid "Provide a list of cleaning steps in JSON format" msgstr "Eine Liste der Reinigungsschritte im JSON-Format angeben" msgid "" "Provide a reason for why you are putting the selected node(s) into " "maintenance mode (optional)" msgstr "" "Geben Sie einen Grund an, warum Sie den/die ausgewählten Knoten in den " "Wartungsmodus setzen (optional)" msgid "Provision State" msgstr "Bereitstellungszustand" msgid "Provisioning State" msgstr "Provisionierungszustand" msgid "Provisioning Status" msgstr "Provisionierungsstatus" msgid "Put Node(s) Into Maintenance Mode" msgstr "Knoten in Wartungsmodus setzen" msgid "RAID Level" msgstr "RAID-Ebene" msgid "Ramdisk" msgstr "Ramdisk" msgid "Reason" msgstr "Grund" msgid "Reboot" msgstr "Neustart" msgid "Refresh" msgstr "Aktualisieren" msgid "Refresh page to see set boot device" msgstr "Aktualisieren Sie die Seite um das gesetzte Boot-Gerät zu sehen" msgid "Refresh page to see updated console details" msgstr "Seite neu laden, um aktualisierte Konsolendetails anzuzeigen" msgid "Refresh page to see updated power status" msgstr "Aktualisiere Seite, um den Power Status zu sehen" msgid "Refresh page." msgstr "Seite aktualisieren." msgid "Required" msgstr "Erforderlich" msgid "Reservation" msgstr "Reservierung" msgid "Resource Class" msgstr "Ressourcen-Klasse" msgid "Root GB" msgstr "Root GB" msgid "Root Volume" msgstr "Root-Datenträger" msgid "Root Volume." msgstr "Root-Datenträger" msgid "SSH Address" msgstr "SSH Adresse" msgid "SSH Key Contents" msgstr "SSH Schlüsselinhalt" msgid "SSH Key File" msgstr "SSH Schlüsseldatei" msgid "SSH Password" msgstr "SSH Passwort" msgid "SSH Port" msgstr "SSH-Port" msgid "SSH Username" msgstr "SSH-Benutzername" msgid "SSH terminal port" msgstr "SSH Terminal Port" msgid "Select a Driver" msgstr "Wählen Sie einen Treiber" msgid "Select a boot device" msgstr "Wählen Sie ein Boot-Gerät" msgid "Select a portgroup" msgstr "Wählen Sie eine Portgruppe" msgid "Set Boot Device" msgstr "Boot-Gerät setzen" msgid "Set RAID Configuration" msgstr "RAID-Konfiguration setzen" msgid "Set Target RAID Config" msgstr "Ziel RAID-Konfiguration setzen" msgid "Size GB" msgstr "Größe GB" msgid "Soft power off" msgstr "Sanftes Ausschalten" msgid "Soft reboot" msgstr "Sanfter Neustart" msgid "Specifies RAID Level." msgstr "Gibt die RAID-Ebene an." msgid "Specifies logical disk size in GiB. Required." msgstr "Gibt die logische Plattengröße in GiB an. Erforderlich." msgid "" "Specifies whether ports in this portgroup can be used as standalone ports." msgstr "" "Gibt an, ob Ports aus dieser Portgruppe auch eigenständig verwendet werden " "können." msgid "Specifies whether root volume or not." msgstr "Gibt an, ob es sich um einen Root-Datenträger handelt." msgid "Standalone Ports Supported" msgstr "Unterstützung für eigenständige Ports" msgid "Storage Interface" msgstr "Storage-Schnittstelle" msgid "Submit" msgstr "Abschicken" #, python-format msgid "Successfully deleted node \"%s\"" msgid_plural "Successfully deleted nodes \"%s\"" msgstr[0] "Knoten \"%s\" erfolgreich gelöscht" msgstr[1] "Knoten \"%s\" erfolgreich gelöscht" #, python-format msgid "Successfully deleted port \"%s\"" msgid_plural "Successfully deleted ports \"%s\"" msgstr[0] "Port \"%s\" erfolgreich gelöscht" msgstr[1] "Port \"%s\" erfolgreich gelöscht" #, python-format msgid "Successfully deleted portgroup \"%s\"" msgid_plural "Successfully deleted portgroups \"%s\"" msgstr[0] "Portgruppe \"%s\" erfolgreich gelöscht" msgstr[1] "Portgruppen \"%s\" erfolgreich gelöscht" #, python-format msgid "Successfully updated node %s" msgstr "Knoten %s erfolgreich aktualisiert" #, python-format msgid "Successfully updated port %s" msgstr "Port %s erfolgreich aktualisiert" #, python-format msgid "Successfully updated portgroup %s" msgstr "Portgruppe %s erfolgreich aktualisiert" msgid "Target Power State" msgstr "Ziel Power-Zustand" msgid "Target Provision State" msgstr "Ziel Bereitstellungszustand" msgid "" "This field is disabled because a port cannot have any connectivity " "attributes (pxe_enabled, local_link_connection, portgroup_id) updated unless " "its associated node is in an enroll, inspecting, mangeable state; or in " "maintenance mode." msgstr "" "Dieses Feld ist deaktiviert, denn bei einem Port können Verbindungsattribute " "(pxe_enabled, local_link_connection, portgroup_id) nur aktualisiert werden, " "wenn der zugewiesene Knoten im Enroll, Inspecting oder Manageable Status " "oder im Wartungsmodus ist." msgid "UUID" msgstr "UUID" msgid "Unable to create node update patch." msgstr "Knoten-Aktualisierungspatch kann nicht erstellt werden." #, python-format msgid "Unable to create node: %s" msgstr "Knoten kann nicht erstellt werden: %s" msgid "Unable to create port update patch." msgstr "Port Update Patch kann nicht erstellt werden." #, python-format msgid "Unable to create port: %s" msgstr "Port kann nicht erstellt werden: %s" msgid "Unable to create portgroup update patch." msgstr "Portgruppen-Aktualisierung kann nicht erstellt werden." #, python-format msgid "Unable to create portgroup: %s" msgstr "Portgruppe kann nicht erstellt werden: %s" #, python-format msgid "Unable to delete node \"%s\"" msgid_plural "Unable to delete nodes \"%s\"" msgstr[0] "Knoten \"%s\" kann nicht gelöscht werden" msgstr[1] "Knoten \"%s\" können nicht gelöscht werden" #, python-format msgid "Unable to delete node %s: %s" msgstr "Knoten kann nicht gelöscht werden: %s: %s" #, python-format msgid "Unable to delete port \"%s\"" msgid_plural "Unable to delete ports \"%s\"" msgstr[0] "Port \"%s\" kann nicht gelöscht werden" msgstr[1] "Ports \"%s\" können nicht gelöscht werden" #, python-format msgid "Unable to delete port: %s" msgstr "Port kann nicht gelöscht werden: %s" #, python-format msgid "Unable to delete portgroup \"%s\"" msgid_plural "Unable to delete portgroups \"%s\"" msgstr[0] "Portgruppe \"%s\" kann nicht gelöscht werden" msgstr[1] "Portgruppen \"%s\" können nicht gelöscht werden" #, python-format msgid "Unable to delete portgroup: %s" msgstr "Portgruppe kann nicht gelöscht werden: %s" #, python-format msgid "Unable to get console for node %s: %s" msgstr "Konsole für Knoten %s kann nicht abgerufen werden: %s" #, python-format msgid "Unable to inject NMI: %s" msgstr "NMI kann nicht eingefügt werden: %s" #, python-format msgid "Unable to power off the node: %s" msgstr "Konnte den Knoten nicht ausschalten: %s" #, python-format msgid "Unable to retrieve Ironic drivers: %s" msgstr "Ironic Treiber können nicht abgerufen werden: %s" #, python-format msgid "Unable to retrieve Ironic node portgroups: %s" msgstr "Ironic Knotenportgruppen können nicht abgerufen werden: %s" #, python-format msgid "Unable to retrieve Ironic nodes. %s" msgstr "Konnte die Ironic Knoten nicht abrufen: %s" #, python-format msgid "Unable to retrieve boot device for Ironic node. %s" msgstr "Boot-Gerät für den Ironic-Knoten kann nicht abgerufen werden. %s" #, python-format msgid "Unable to retrieve driver properties: %s" msgstr "Treibereigenschaften können nicht abgerufen werden: %s" #, python-format msgid "Unable to retrieve portgroup ports: %s" msgstr "Portgruppenports können nicht abgerufen werden: %s" #, python-format msgid "Unable to retrieve supported boot devices for Ironic node. %s" msgstr "" "Unterstützte Boot-Geräte für den Ironic-Knoten können nicht abgerufen " "werden. %s" #, python-format msgid "Unable to retrieve the Ironic node ports: %s" msgstr "Konnte die Ironic-Knotenports nicht abrufen: %s" #, python-format msgid "Unable to retrieve the Ironic node: %s" msgstr "Konnte den Ironic-Knoten nicht abrufen: %s" #, python-format msgid "Unable to set Ironic node %s maintenance state: %s" msgstr "Konnte den Ironic Knoten %s nicht in den Wartungszustand setzen: %s" #, python-format msgid "Unable to set boot device: %s" msgstr "Boot-Gerät kann nicht gesetzt werden: %s" #, python-format msgid "Unable to set console mode: %s" msgstr "Konsolenmodus kann nicht gesetzt werden: %s" #, python-format msgid "Unable to set node provision state: %s" msgstr "Kann Provisionierungszustand nicht setzen: %s" #, python-format msgid "Unable to set raid config: %s" msgstr "Raid-Konfiguration kann nicht gesetzt werden: %s" #, python-format msgid "Unable to update node %s: %s" msgstr "Knoten %s kann nicht aktualisiert werden: %s" #, python-format msgid "Unable to update port %s: %s" msgstr "Port %s kann nicht aktualisiert werden: %s" #, python-format msgid "Unable to update portgroup %s: %s" msgstr "Portgruppe %s kann nicht aktualisiert werden: %s" #, python-format msgid "Unable to validate node %s: %s" msgstr "Knoten %s kann nicht validiert werden: %s" msgid "Unable to validate the JSON input" msgstr "JSON-Eingabe kann nicht validiert werden" msgid "Update Node" msgstr "Knoten aktualisieren" msgid "Update Port" msgstr "Port aktualisieren" msgid "Update Portgroup" msgstr "Portgruppe aktualisieren" msgid "Updated At" msgstr "Aktualisiert am" msgid "Valid" msgstr "Gültig" msgid "Virtualization Software" msgstr "Virtualisierungssoftware" msgid "default (?:value )?is ([^\"\\. ]+|\"[^\"]+\")" msgstr "Standard (?:value )?ist ([^\"\\. ]+|\"[^\"]+\")" ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.88151 ironic-ui-6.3.0/ironic_ui/locale/en_GB/0000775000175000017500000000000000000000000017632 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.89351 ironic-ui-6.3.0/ironic_ui/locale/en_GB/LC_MESSAGES/0000775000175000017500000000000000000000000021417 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/locale/en_GB/LC_MESSAGES/django.po0000664000175000017500000000144100000000000023221 0ustar00zuulzuul00000000000000# Andi Chandler , 2016. #zanata # Andi Chandler , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: ironic-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-10-29 15:16+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-11-14 11:18+0000\n" "Last-Translator: Andi Chandler \n" "Language-Team: English (United Kingdom)\n" "Language: en_GB\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "Admin" msgstr "Admin" msgid "Ironic Bare Metal Provisioning" msgstr "Ironic Bare Metal Provisioning" msgid "Node Details" msgstr "Node Details" msgid "System" msgstr "System" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/locale/en_GB/LC_MESSAGES/djangojs.po0000664000175000017500000004177300000000000023572 0ustar00zuulzuul00000000000000# OpenStack Infra , 2015. #zanata # Rob Cresswell , 2015. #zanata # Andi Chandler , 2016. #zanata # Andreas Jaeger , 2016. #zanata # Rob Cresswell , 2016. #zanata # Andi Chandler , 2017. #zanata # Andi Chandler , 2018. #zanata # Andi Chandler , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: ironic-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-10-29 15:16+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-11-14 11:17+0000\n" "Last-Translator: Andi Chandler \n" "Language-Team: English (United Kingdom)\n" "Language: en_GB\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgstr " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgid "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" msgstr "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" #, python-format msgid "A request has been made to change the provisioning state of node %s" msgstr "A request has been made to change the provisioning state of node %s" msgid "" "A resource class name for future nova scheduling, in stand-alone usage only. " "Optional." msgstr "" "A resource class name for future nova scheduling, in stand-alone usage only. " "Optional." msgid "A unique node name. Optional." msgstr "A unique node name. Optional." msgid "Abort cleaning" msgstr "Abort cleaning" msgid "Action" msgstr "Action" msgid "Actions" msgstr "Actions" msgid "Add Extra" msgstr "Add Extra" msgid "Add Instance Property" msgstr "Add Instance Property" msgid "Add Logical Disk" msgstr "Add Logical Disk" msgid "Add Property" msgstr "Add Property" #, python-format msgid "" "Are you sure you want to delete node \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete nodes \"%s\"? This action cannot be undone." msgstr[0] "" "Are you sure you want to delete node \"%s\"? This action cannot be undone." msgstr[1] "" "Are you sure you want to delete nodes \"%s\"? This action cannot be undone." #, python-format msgid "" "Are you sure you want to delete port \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete ports \"%s\"? This action cannot be undone." msgstr[0] "" "Are you sure you want to delete port \"%s\"? This action cannot be undone." msgstr[1] "" "Are you sure you want to delete ports \"%s\"? This action cannot be undone." #, python-format msgid "" "Are you sure you want to delete portgroup \"%s\"? This action cannot be " "undone." msgid_plural "" "Are you sure you want to delete portgroups \"%s\"? This action cannot be " "undone." msgstr[0] "" "Are you sure you want to delete portgroup \"%s\"? This action cannot be " "undone." msgstr[1] "" "Are you sure you want to delete portgroups \"%s\"? This action cannot be " "undone." msgid "Attributes" msgstr "Attributes" msgid "Boot Device" msgstr "Boot Device" msgid "Cancel" msgstr "Cancel" msgid "Chassis ID" msgstr "Chassis ID" msgid "Choose an Image" msgstr "Choose an Image" msgid "Clean" msgstr "Clean" msgid "Clean Node" msgstr "Clean Node" msgid "Clean Step" msgstr "Clean Step" msgid "Clean node" msgstr "Clean node" msgid "Clean steps should be an non-empty array" msgstr "Clean steps should be an non-empty array" msgid "Click link to view console" msgstr "Click link to view console" msgid "Configuration" msgstr "Configuration" msgid "Console Enabled" msgstr "Console Enabled" msgid "Console Info." msgstr "Console Info." msgid "Create Port" msgstr "Create Port" msgid "Create Portgroup" msgstr "Create Portgroup" msgid "Created At" msgstr "Created At" msgid "Current Interface" msgstr "Current Interface" msgid "Defaults to ([^\"\\. ]+|\"[^\"]+\")" msgstr "Defaults to ([^\"\\. ]+|\"[^\"]+\")" msgid "Delete Node" msgid_plural "Delete Nodes" msgstr[0] "Delete Node" msgstr[1] "Delete Nodes" msgid "Delete Nodes" msgstr "Delete Nodes" msgid "Delete Port" msgid_plural "Delete Ports" msgstr[0] "Delete Port" msgstr[1] "Delete Ports" msgid "Delete Portgroup" msgid_plural "Delete Portgroups" msgstr[0] "Delete Portgroup" msgstr[1] "Delete Portgroups" msgid "Delete Portgroups" msgstr "Delete Portgroups" msgid "Delete Ports" msgstr "Delete Ports" msgid "Deploy Kernel" msgstr "Deploy Kernel" msgid "Deploy Ramdisk" msgstr "Deploy Ramdisk" msgid "Device" msgstr "Device" msgid "Driver" msgstr "Driver" msgid "Driver Details" msgstr "Driver Details" msgid "Driver Info" msgstr "Driver Info" msgid "Driver Interfaces" msgstr "Driver Interfaces" msgid "Driver Validation" msgstr "Driver Validation" msgid "" "Each cleaning step must be an object that contains \"interface\" and \"step" "\" properties" msgstr "" "Each cleaning step must be an object that contains \"interface\" and \"step" "\" properties" msgid "Edit" msgstr "Edit" msgid "Edit Node" msgstr "Edit Node" msgid "Edit Port" msgstr "Edit Port" msgid "Edit Portgroup" msgstr "Edit Portgroup" msgid "Enroll Node" msgstr "Enroll Node" msgid "Extra" msgstr "Extra" msgid "Extra Property Name" msgstr "Extra Property Name" msgid "Extras" msgstr "Extras" msgid "General" msgstr "General" msgid "Image Source" msgstr "Image Source" msgid "Indicates whether this port should be used when PXE booting this node" msgstr "Indicates whether this port should be used when PXE booting this node" msgid "Inject NMI" msgstr "Inject NMI" msgid "Inspect" msgstr "Inspect" msgid "Inspection Finished At" msgstr "Inspection Finished At" msgid "Inspection Started At" msgstr "Inspection Started At" msgid "Instance ID" msgstr "Instance ID" msgid "Instance Info" msgstr "Instance Info" msgid "Instance Name" msgstr "Instance Name" msgid "Instance Property Name" msgstr "Instance Property Name" msgid "Interface" msgstr "Interface" msgid "Interface used for attaching and detaching volumes on this node." msgstr "Interface used for attaching and detaching volumes on this node." msgid "Kernel" msgstr "Kernel" msgid "Last Error" msgstr "Last Error" msgid "" "Linux portgroup mode. For possible values refer to https://www.kernel.org/" "doc/Documentation/networking/bonding.txt" msgstr "" "Linux portgroup mode. For possible values refer to https://www.kernel.org/" "doc/Documentation/networking/bonding.txt" msgid "Local Link Connection" msgstr "Local Link Connection" msgid "Local link connection" msgstr "Local link connection" msgid "MAC Address" msgstr "MAC Address" msgid "MAC address" msgstr "MAC address" msgid "MAC address for this port. Required." msgstr "MAC address for this port. Required." msgid "MAC address for this portgroup." msgstr "MAC address for this portgroup." msgid "MAC address or OpenFlow datapath ID" msgstr "MAC address or OpenFlow datapath ID" msgid "Maintenance" msgstr "Maintenance" msgid "Maintenance Reason" msgstr "Maintenance Reason" msgid "Mode" msgstr "Mode" msgid "Move to" msgstr "Move to" msgid "Name" msgstr "Name" msgid "Name for the portgroup." msgstr "Name for the portgroup." msgid "Network Interface" msgstr "Network Interface" msgid "" "Network interface used for switching between provisioning, tenant, and " "cleaning networks." msgstr "" "Network interface used for switching between provisioning, tenant, and " "cleaning networks." msgid "No Instance" msgstr "No Instance" msgid "No network ports have been defined" msgstr "No network ports have been defined" msgid "No portgroups have been defined" msgstr "No portgroups have been defined" msgid "No reason given." msgstr "No reason given." msgid "Node" msgstr "Node" #, python-format msgid "Node %s is already in target maintenance state." msgstr "Node %s is already in target maintenance state." msgid "Node Driver" msgstr "Node Driver" msgid "Node ID" msgstr "Node ID" msgid "Node Info" msgstr "Node Info" msgid "Node Name" msgstr "Node Name" msgid "One of this, (.*) must be specified\\." msgstr "One of this, (.*) must be specified\\." msgid "Overview" msgstr "Overview" msgid "PXE Enabled" msgstr "PXE Enabled" msgid "PXE enabled" msgstr "PXE enabled" msgid "Persistent" msgstr "Persistent" msgid "Port successfully created" msgstr "Port successfully created" msgid "Portgroup" msgstr "Portgroup" msgid "Portgroup successfully created" msgstr "Portgroup successfully created" msgid "Portgroup that this port belongs to" msgstr "Portgroup that this port belongs to" msgid "Portgroups" msgstr "Portgroups" msgid "Ports" msgstr "Ports" msgid "Power State" msgstr "Power State" msgid "Power off" msgstr "Power off" msgid "Power on" msgstr "Power on" msgid "Properties" msgstr "Properties" msgid "Property Name" msgstr "Property Name" msgid "Provide a list of cleaning steps in JSON format" msgstr "Provide a list of cleaning steps in JSON format" msgid "" "Provide a reason for why you are putting the selected node(s) into " "maintenance mode (optional)" msgstr "" "Provide a reason for why you are putting the selected node(s) into " "maintenance mode (optional)" msgid "Provision State" msgstr "Provision State" msgid "Provisioning State" msgstr "Provisioning State" msgid "Provisioning Status" msgstr "Provisioning Status" msgid "Put Node(s) Into Maintenance Mode" msgstr "Put Node(s) Into Maintenance Mode" msgid "RAID Level" msgstr "RAID Level" msgid "Ramdisk" msgstr "Ramdisk" msgid "Reason" msgstr "Reason" msgid "Reboot" msgstr "Reboot" msgid "Refresh" msgstr "Refresh" msgid "Refresh page to see set boot device" msgstr "Refresh page to see set boot device" msgid "Refresh page to see updated console details" msgstr "Refresh page to see updated console details" msgid "Refresh page to see updated power status" msgstr "Refresh page to see updated power status" msgid "Refresh page." msgstr "Refresh page." msgid "Required" msgstr "Required" msgid "Reservation" msgstr "Reservation" msgid "Resource Class" msgstr "Resource Class" msgid "Root GB" msgstr "Root GB" msgid "Root Volume" msgstr "Root Volume" msgid "Root Volume." msgstr "Root Volume." msgid "SSH Address" msgstr "SSH Address" msgid "SSH Key Contents" msgstr "SSH Key Contents" msgid "SSH Key File" msgstr "SSH Key File" msgid "SSH Password" msgstr "SSH Password" msgid "SSH Port" msgstr "SSH Port" msgid "SSH Username" msgstr "SSH Username" msgid "SSH terminal port" msgstr "SSH terminal port" msgid "Select a Driver" msgstr "Select a Driver" msgid "Select a boot device" msgstr "Select a boot device" msgid "Select a portgroup" msgstr "Select a portgroup" msgid "Set Boot Device" msgstr "Set Boot Device" msgid "Set RAID Configuration" msgstr "Set RAID Configuration" msgid "Set Target RAID Config" msgstr "Set Target RAID Config" msgid "Size GB" msgstr "Size GB" msgid "Soft power off" msgstr "Soft power off" msgid "Soft reboot" msgstr "Soft reboot" msgid "Specifies RAID Level." msgstr "Specifies RAID Level." msgid "Specifies logical disk size in GiB. Required." msgstr "Specifies logical disk size in GiB. Required." msgid "" "Specifies whether ports in this portgroup can be used as standalone ports." msgstr "" "Specifies whether ports in this portgroup can be used as standalone ports." msgid "Specifies whether root volume or not." msgstr "Specifies whether root volume or not." msgid "Standalone Ports Supported" msgstr "Standalone Ports Supported" msgid "Storage Interface" msgstr "Storage Interface" msgid "Submit" msgstr "Submit" #, python-format msgid "Successfully deleted node \"%s\"" msgid_plural "Successfully deleted nodes \"%s\"" msgstr[0] "Successfully deleted node \"%s\"" msgstr[1] "Successfully deleted nodes \"%s\"" #, python-format msgid "Successfully deleted port \"%s\"" msgid_plural "Successfully deleted ports \"%s\"" msgstr[0] "Successfully deleted port \"%s\"" msgstr[1] "Successfully deleted ports \"%s\"" #, python-format msgid "Successfully deleted portgroup \"%s\"" msgid_plural "Successfully deleted portgroups \"%s\"" msgstr[0] "Successfully deleted portgroup \"%s\"" msgstr[1] "Successfully deleted portgroups \"%s\"" #, python-format msgid "Successfully updated node %s" msgstr "Successfully updated node %s" #, python-format msgid "Successfully updated port %s" msgstr "Successfully updated port %s" #, python-format msgid "Successfully updated portgroup %s" msgstr "Successfully updated portgroup %s" msgid "Target Power State" msgstr "Target Power State" msgid "Target Provision State" msgstr "Target Provision State" msgid "" "This field is disabled because a port cannot have any connectivity " "attributes (pxe_enabled, local_link_connection, portgroup_id) updated unless " "its associated node is in an enroll, inspecting, mangeable state; or in " "maintenance mode." msgstr "" "This field is disabled because a port cannot have any connectivity " "attributes (pxe_enabled, local_link_connection, portgroup_id) updated unless " "its associated node is enrolling, inspecting, manageable state; or in " "maintenance mode." msgid "UUID" msgstr "UUID" msgid "Unable to create node update patch." msgstr "Unable to create node update patch." #, python-format msgid "Unable to create node: %s" msgstr "Unable to create node: %s" msgid "Unable to create port update patch." msgstr "Unable to create port update patch." #, python-format msgid "Unable to create port: %s" msgstr "Unable to create port: %s" msgid "Unable to create portgroup update patch." msgstr "Unable to create portgroup update patch." #, python-format msgid "Unable to create portgroup: %s" msgstr "Unable to create portgroup: %s" #, python-format msgid "Unable to delete node \"%s\"" msgid_plural "Unable to delete nodes \"%s\"" msgstr[0] "Unable to delete node \"%s\"" msgstr[1] "Unable to delete nodes \"%s\"" #, python-format msgid "Unable to delete node %s: %s" msgstr "Unable to delete node %s: %s" #, python-format msgid "Unable to delete port \"%s\"" msgid_plural "Unable to delete ports \"%s\"" msgstr[0] "Unable to delete port \"%s\"" msgstr[1] "Unable to delete ports \"%s\"" #, python-format msgid "Unable to delete port: %s" msgstr "Unable to delete port: %s" #, python-format msgid "Unable to delete portgroup \"%s\"" msgid_plural "Unable to delete portgroups \"%s\"" msgstr[0] "Unable to delete portgroup \"%s\"" msgstr[1] "Unable to delete portgroups \"%s\"" #, python-format msgid "Unable to delete portgroup: %s" msgstr "Unable to delete portgroup: %s" #, python-format msgid "Unable to get console for node %s: %s" msgstr "Unable to get console for node %s: %s" #, python-format msgid "Unable to inject NMI: %s" msgstr "Unable to inject NMI: %s" #, python-format msgid "Unable to power off the node: %s" msgstr "Unable to power off the node: %s" #, python-format msgid "Unable to retrieve Ironic drivers: %s" msgstr "Unable to retrieve Ironic drivers: %s" #, python-format msgid "Unable to retrieve Ironic node portgroups: %s" msgstr "Unable to retrieve Ironic node portgroups: %s" #, python-format msgid "Unable to retrieve Ironic nodes. %s" msgstr "Unable to retrieve Ironic nodes. %s" #, python-format msgid "Unable to retrieve boot device for Ironic node. %s" msgstr "Unable to retrieve boot device for Ironic node. %s" #, python-format msgid "Unable to retrieve driver properties: %s" msgstr "Unable to retrieve driver properties: %s" #, python-format msgid "Unable to retrieve portgroup ports: %s" msgstr "Unable to retrieve portgroup ports: %s" #, python-format msgid "Unable to retrieve supported boot devices for Ironic node. %s" msgstr "Unable to retrieve supported boot devices for Ironic node. %s" #, python-format msgid "Unable to retrieve the Ironic node ports: %s" msgstr "Unable to retrieve the Ironic node ports: %s" #, python-format msgid "Unable to retrieve the Ironic node: %s" msgstr "Unable to retrieve the Ironic node: %s" #, python-format msgid "Unable to set Ironic node %s maintenance state: %s" msgstr "Unable to set Ironic node %s maintenance state: %s" #, python-format msgid "Unable to set boot device: %s" msgstr "Unable to set boot device: %s" #, python-format msgid "Unable to set console mode: %s" msgstr "Unable to set console mode: %s" #, python-format msgid "Unable to set node provision state: %s" msgstr "Unable to set node provision state: %s" #, python-format msgid "Unable to set raid config: %s" msgstr "Unable to set raid config: %s" #, python-format msgid "Unable to update node %s: %s" msgstr "Unable to update node %s: %s" #, python-format msgid "Unable to update port %s: %s" msgstr "Unable to update port %s: %s" #, python-format msgid "Unable to update portgroup %s: %s" msgstr "Unable to update portgroup %s: %s" #, python-format msgid "Unable to validate node %s: %s" msgstr "Unable to validate node %s: %s" msgid "Unable to validate the JSON input" msgstr "Unable to validate the JSON input" msgid "Update Node" msgstr "Update Node" msgid "Update Port" msgstr "Update Port" msgid "Update Portgroup" msgstr "Update Portgroup" msgid "Updated At" msgstr "Updated At" msgid "Valid" msgstr "Valid" msgid "Virtualization Software" msgstr "Virtualisation Software" msgid "default (?:value )?is ([^\"\\. ]+|\"[^\"]+\")" msgstr "default (?:value )?is ([^\"\\. ]+|\"[^\"]+\")" ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.88151 ironic-ui-6.3.0/ironic_ui/locale/fr/0000775000175000017500000000000000000000000017267 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.89351 ironic-ui-6.3.0/ironic_ui/locale/fr/LC_MESSAGES/0000775000175000017500000000000000000000000021054 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/locale/fr/LC_MESSAGES/djangojs.po0000664000175000017500000002342000000000000023214 0ustar00zuulzuul00000000000000# Gael Rehault , 2015. #zanata # OpenStack Infra , 2015. #zanata # Andreas Jaeger , 2016. #zanata # Gérald LONLAS , 2016. #zanata # Martine Marin , 2016. #zanata # Nicolas Fournier , 2016. #zanata # Gérald LONLAS , 2017. #zanata # Loic Nicolle , 2017. #zanata # JF Taltavull , 2018. #zanata # Loic Nicolle , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: ironic-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-15 09:55+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-03-06 07:31+0000\n" "Last-Translator: JF Taltavull \n" "Language-Team: French\n" "Language: fr\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" msgid " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgstr " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgid "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" msgstr "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" #, python-format msgid "A request has been made to change the provisioning state of node %s" msgstr "" "Une requête a été envoyé pour changer l'état du provisionnement du nœud %s" msgid "A unique node name. Optional." msgstr "Un nom de nœud unique. Optionnel." msgid "Action" msgstr "Action" msgid "Actions" msgstr "Actions" #, fuzzy, python-format msgid "" "Are you sure you want to delete node \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete nodes \"%s\"? This action cannot be undone." msgstr[0] "" "Etes-vous certain de vouloir supprimer le nœud \"%s\" ? Cette action est " "irréversible." msgstr[1] "" #, fuzzy, python-format msgid "" "Are you sure you want to delete port \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete ports \"%s\"? This action cannot be undone." msgstr[0] "" "Etes-vous certain de vouloir supprimer le port \"%s\" ? Cette action est " "irréversible." msgstr[1] "" msgid "Attributes" msgstr "Attributs" msgid "Boot Device" msgstr "Périphérique de démarrage" msgid "Cancel" msgstr "Annuler" msgid "Chassis ID" msgstr "ID du chassis" msgid "Choose an Image" msgstr "Choisir une image" msgid "Configuration" msgstr "Configuration" msgid "Console Enabled" msgstr "Console Activée" msgid "Create Port" msgstr "Créer un port" msgid "Created At" msgstr "Créé le" msgid "Defaults to ([^\"\\. ]+|\"[^\"]+\")" msgstr "Par défaut ([^\"\\. ]+|\"[^\"]+\")" #, fuzzy msgid "Delete Node" msgid_plural "Delete Nodes" msgstr[0] "Supprimer le nœud" msgstr[1] "" msgid "Delete Nodes" msgstr "Supprimer les nœuds" #, fuzzy msgid "Delete Port" msgid_plural "Delete Ports" msgstr[0] "Supprimer le port" msgstr[1] "" msgid "Delete Ports" msgstr "Supprimer les ports" msgid "Deploy Kernel" msgstr "Kernel de déploiement" msgid "Deploy Ramdisk" msgstr "Ramdisk de déploiement" msgid "Driver" msgstr "Pilote" msgid "Driver Details" msgstr "Détails du pilote" msgid "Driver Info" msgstr "Info du pilote" msgid "Edit" msgstr "Editer" msgid "Edit Node" msgstr "Editer le nœud" msgid "Edit Port" msgstr "Editer le port" msgid "Enroll Node" msgstr "Enroller le nœud" msgid "Extra" msgstr "Extra" msgid "Extras" msgstr "Extras" msgid "General" msgstr "Général" msgid "Image Source" msgstr "Image source" msgid "Inspect" msgstr "Inspecter" msgid "Inspection Finished At" msgstr "Inspection terminée à" msgid "Inspection Started At" msgstr "Inspection démarrée à" msgid "Instance ID" msgstr "ID de l'instance" msgid "Instance Info" msgstr "Infos de l'instance" msgid "Instance Name" msgstr "Nom de l'instance" msgid "Interface" msgstr "Interface" msgid "Kernel" msgstr "Noyau" msgid "Last Error" msgstr "Dernière Erreur" msgid "MAC Address" msgstr "Adresse MAC" msgid "MAC address" msgstr "Adresse MAC" msgid "MAC address for this port. Required." msgstr "Adresse MAC pour ce port. Requis." msgid "Maintenance" msgstr "Maintenance" msgid "Maintenance Reason" msgstr "Raison de la maintenance" msgid "Mode" msgstr "Mode" msgid "Name" msgstr "Nom" msgid "Name for the portgroup." msgstr "Nom du portgroup." msgid "Network Interface" msgstr "Interface réseau" msgid "No Instance" msgstr "Pas d'instance" msgid "No network ports have been defined" msgstr "Aucun port réseau n'a été défini" msgid "No reason given." msgstr "Aucune raison fournie." msgid "Node" msgstr "Nœud" msgid "Node Driver" msgstr "Pilote du nœud" msgid "Node ID" msgstr "ID du nœud" msgid "Node Info" msgstr "Info du nœud" msgid "Node Name" msgstr "Nom du nœud" msgid "One of this, (.*) must be specified\\." msgstr "Une de celles-ci (.*) doit être spécifiée\\." msgid "Overview" msgstr "Vue d'ensemble" msgid "PXE enabled" msgstr "PXE activé" msgid "Persistent" msgstr "Persistant" msgid "Port successfully created" msgstr "Port crée avec succès" msgid "Portgroup successfully created" msgstr "Portgroup crée avec succès" msgid "Ports" msgstr "Ports" msgid "Power State" msgstr "État de l'alimentation" msgid "Power off" msgstr "Éteindre" msgid "Power on" msgstr "Allumer" msgid "Properties" msgstr "Propriétés" msgid "Property Name" msgstr "Nom de la propriété" msgid "" "Provide a reason for why you are putting the selected node(s) into " "maintenance mode (optional)" msgstr "" "Fournir une raison pour avoir mis le(s) nœud(s) sélectionné(s) en mode " "maintenance (optionnel)" msgid "Provision State" msgstr "État de déploiement" msgid "Provisioning State" msgstr "État de déploiement" msgid "Provisioning Status" msgstr "Statut de Déploiement" msgid "Put Node(s) Into Maintenance Mode" msgstr "Mettre le(s) nœud(s) en mode maintenance" msgid "Ramdisk" msgstr "Ramdisk" msgid "Reason" msgstr "Raison" msgid "Reboot" msgstr "Redémarrage" msgid "Refresh" msgstr "Rafraichir" msgid "Refresh page to see updated console details" msgstr "Rafraîchir la page pour voir les détails de la console mis à jour" msgid "Refresh page to see updated power status" msgstr "Rafraichir la page pour voir les statuts d'alimentation à jour" msgid "Refresh page." msgstr "Rafraichir la page." msgid "Required" msgstr "Obligatoire" msgid "Reservation" msgstr "Réservation" msgid "Root Volume" msgstr "Volume racine" msgid "Root Volume." msgstr "Volume racine." msgid "SSH Key Contents" msgstr "Contenu de la clef" msgid "SSH Password" msgstr "Mot de passe SSH" msgid "SSH Port" msgstr "Port SSH" msgid "SSH Username" msgstr "Utilisateur SSH" msgid "Select a Driver" msgstr "Sélectionner un pilote" msgid "Select a boot device" msgstr "Sélectionner le périphérique de démarrage" msgid "Size GB" msgstr "Taille Go" msgid "Soft reboot" msgstr "Redémarrage logiciel" msgid "Submit" msgstr "Envoyer" #, fuzzy, python-format msgid "Successfully deleted node \"%s\"" msgid_plural "Successfully deleted nodes \"%s\"" msgstr[0] "Suppression avec succès du nœud \"%s\" " msgstr[1] "" #, fuzzy, python-format msgid "Successfully deleted port \"%s\"" msgid_plural "Successfully deleted ports \"%s\"" msgstr[0] "Suppression avec succès du port \"%s\" " msgstr[1] "" #, python-format msgid "Successfully updated node %s" msgstr "Mise à jour avec succès du nœud %s" #, python-format msgid "Successfully updated port %s" msgstr "Port mis à jour avec succès : %s" msgid "Target Power State" msgstr "État de l'alimentation de la cible" msgid "Target Provision State" msgstr "État de déploiement de la cible" msgid "UUID" msgstr "UUID" msgid "Unable to create node update patch." msgstr "Impossible de créer le patch de mise à jour du nœud." #, python-format msgid "Unable to create node: %s" msgstr "Impossible de créer le nœud : %s" #, python-format msgid "Unable to create port: %s" msgstr "Impossible de créer le port : %s" #, fuzzy, python-format msgid "Unable to delete node \"%s\"" msgid_plural "Unable to delete nodes \"%s\"" msgstr[0] "Impossible de supprimer le nœud \"%s\"" msgstr[1] "" #, python-format msgid "Unable to delete node %s: %s" msgstr "Impossible de supprimer le nœud %s : %s" #, fuzzy, python-format msgid "Unable to delete port \"%s\"" msgid_plural "Unable to delete ports \"%s\"" msgstr[0] "Impossible de supprimer le port \"%s\"" msgstr[1] "" #, python-format msgid "Unable to delete port: %s" msgstr "Impossible de supprimer le port : %s" #, python-format msgid "Unable to power off the node: %s" msgstr "Impossible d'éteindre le nœud : %s" #, python-format msgid "Unable to retrieve Ironic drivers: %s" msgstr "Impossible de récupérer les pilotes Ironic : %s" #, python-format msgid "Unable to retrieve Ironic nodes. %s" msgstr "Impossible de récupérer les noeuds Ironic. %s" #, python-format msgid "Unable to retrieve driver properties: %s" msgstr "Impossible de récupérer les propriétés du pilote : %s" #, python-format msgid "Unable to retrieve the Ironic node ports: %s" msgstr "Impossible de récupérer les ports du nœud Ironic : %s" #, python-format msgid "Unable to retrieve the Ironic node: %s" msgstr "Impossible de récupérer le nœud Ironic : %s" #, python-format msgid "Unable to set node provision state: %s" msgstr "Impossible de configurer l'état du provisionnement : %s" #, python-format msgid "Unable to update node %s: %s" msgstr "Impossible de mettre à jour le nœud %s : %s" #, python-format msgid "Unable to update port %s: %s" msgstr "Impossible de mettre à jour le port %s : %s" msgid "Update Node" msgstr "Mettre à jour le nœud" msgid "Update Port" msgstr "Mettre à jour le port" msgid "Updated At" msgstr "Mis à jour à" msgid "default (?:value )?is ([^\"\\. ]+|\"[^\"]+\")" msgstr "default (?:value )?is ([^\"\\. ]+|\"[^\"]+\")" ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.88151 ironic-ui-6.3.0/ironic_ui/locale/id/0000775000175000017500000000000000000000000017254 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.89351 ironic-ui-6.3.0/ironic_ui/locale/id/LC_MESSAGES/0000775000175000017500000000000000000000000021041 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/locale/id/LC_MESSAGES/django.po0000664000175000017500000000142500000000000022645 0ustar00zuulzuul00000000000000# suhartono , 2017. #zanata # suhartono , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: ironic-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-25 10:13+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-04-30 02:25+0000\n" "Last-Translator: suhartono \n" "Language-Team: Indonesian\n" "Language: id\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "Admin" msgstr "Admin" msgid "Ironic Bare Metal Provisioning" msgstr "Ironic Bare Metal Provisioning" msgid "Node Details" msgstr "Node Details" msgid "System" msgstr "System" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/locale/id/LC_MESSAGES/djangojs.po0000664000175000017500000004077500000000000023215 0ustar00zuulzuul00000000000000# OpenStack Infra , 2015. #zanata # Andreas Jaeger , 2016. #zanata # suhartono , 2017. #zanata # suhartono , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: ironic-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-15 09:55+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-01-09 05:09+0000\n" "Last-Translator: suhartono \n" "Language-Team: Indonesian\n" "Language: id\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgstr " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgid "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" msgstr "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" #, python-format msgid "A request has been made to change the provisioning state of node %s" msgstr "Permintaan telah dibuat untuk mengubah keadaan provisioning node %s" msgid "A unique node name. Optional." msgstr "Nama node yang unik. Pilihan." msgid "Abort cleaning" msgstr "Membatalkan pembersihan" msgid "Action" msgstr "Action" msgid "Actions" msgstr "Aksi" msgid "Add Extra" msgstr "Menambahkan Extra" msgid "Add Instance Property" msgstr "Menambahkan Instance Property" msgid "Add Logical Disk" msgstr "Menambahkan Logical Disk" msgid "Add Property" msgstr "Menambahkan Property" #, python-format msgid "" "Are you sure you want to delete node \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete nodes \"%s\"? This action cannot be undone." msgstr[0] "" "Apakah Anda yakin ingin menghapus node \"%s\"? Tindakan ini tidak bisa " "dibatalkan." #, python-format msgid "" "Are you sure you want to delete port \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete ports \"%s\"? This action cannot be undone." msgstr[0] "" "Apakah Anda yakin ingin menghapus port \"%s\"? Tindakan ini tidak bisa " "dibatalkan." #, python-format msgid "" "Are you sure you want to delete portgroup \"%s\"? This action cannot be " "undone." msgid_plural "" "Are you sure you want to delete portgroups \"%s\"? This action cannot be " "undone." msgstr[0] "" "Are you sure you want to delete portgroup \"%s\"? This action cannot be " "undone." msgid "Attributes" msgstr "Attributes" msgid "Boot Device" msgstr "Boot Device" msgid "Cancel" msgstr "Batal" msgid "Chassis ID" msgstr "Chassis ID" msgid "Choose an Image" msgstr "Pilih Image" msgid "Clean" msgstr "Bersih" msgid "Clean Node" msgstr "Clean Node" msgid "Clean Step" msgstr "Membersihkan langkah" msgid "Clean node" msgstr "Clean node" msgid "Clean steps should be an non-empty array" msgstr "Langkah pembersihan harus array non-empty" msgid "Click link to view console" msgstr "Klik tautan untuk melihat konsol" msgid "Configuration" msgstr "Konfigurasi" msgid "Console Enabled" msgstr "Console Enabled (konsol diaktifkan)" msgid "Console Info." msgstr "Console Info." msgid "Create Port" msgstr "Buat Port" msgid "Create Portgroup" msgstr "Membuat Portgroup" msgid "Created At" msgstr "Created At" msgid "Current Interface" msgstr "Current Interface" msgid "Defaults to ([^\"\\. ]+|\"[^\"]+\")" msgstr "Defaults ke ([^\"\\. ]+|\"[^\"]+\")" msgid "Delete Node" msgid_plural "Delete Nodes" msgstr[0] "Delete Node (hapus node)" msgid "Delete Nodes" msgstr "Delete Nodes (hapus node)" msgid "Delete Port" msgid_plural "Delete Ports" msgstr[0] "Delete Port (hapus port)" msgid "Delete Portgroup" msgid_plural "Delete Portgroups" msgstr[0] "Delete Portgroup" msgid "Delete Ports" msgstr "Delete Port (hapus port)" msgid "Deploy Kernel" msgstr "Deploy Kernel (mengerahkan kernel)" msgid "Deploy Ramdisk" msgstr "Deploy Ramdisk (mengerahkan ramdisk)" msgid "Device" msgstr "Device" msgid "Driver" msgstr "Driver" msgid "Driver Details" msgstr "Driver Details (rincian driver)" msgid "Driver Info" msgstr "Driver Info" msgid "Driver Interfaces" msgstr "Driver Interfaces" msgid "Driver Validation" msgstr "Driver Validation (validasi driver)" msgid "" "Each cleaning step must be an object that contains \"interface\" and \"step" "\" properties" msgstr "" "Setiap langkah pembersihan harus sebagai obyek yang berisi properti " "\"interface\" dan \"step\"." msgid "Edit" msgstr "Edit" msgid "Edit Node" msgstr "Edit Node" msgid "Edit Port" msgstr "Edit Port" msgid "Edit Portgroup" msgstr "Edit Portgroup" msgid "Enroll Node" msgstr "Enroll Node" msgid "Extra" msgstr "Extra" msgid "Extra Property Name" msgstr "Extra Property Name" msgid "Extras" msgstr "Extras" msgid "General" msgstr "General (umum)" msgid "Image Source" msgstr "Image Source" msgid "Indicates whether this port should be used when PXE booting this node" msgstr "" "Menunjukkan apakah port ini harus digunakan saat PXE melakukan booting node " "ini" msgid "Inject NMI" msgstr "Menyuntikkan NMI" msgid "Inspect" msgstr "Inspect (periksa)" msgid "Inspection Finished At" msgstr "Inspection Finished At (pemeriksaan selesai)" msgid "Inspection Started At" msgstr "Inspection Started At (pemeriksaan dimulai)" msgid "Instance ID" msgstr "ID Instances" msgid "Instance Info" msgstr "Instance Info (info instance)" msgid "Instance Name" msgstr "Nama Instance" msgid "Instance Property Name" msgstr "Instance Property Name" msgid "Interface" msgstr "Interface (antarmuka)" msgid "Kernel" msgstr "Kernel" msgid "Last Error" msgstr "Last Error (kesalahan terakhir)" msgid "" "Linux portgroup mode. For possible values refer to https://www.kernel.org/" "doc/Documentation/networking/bonding.txt" msgstr "" "Mode portgroup Linux. Untuk nilai yang mungkin lihat https://www.kernel.org/" "doc/Documentation/networking/bonding.txt" msgid "Local Link Connection" msgstr "Local Link Connection" msgid "Local link connection" msgstr "Koneksi link lokal" msgid "MAC Address" msgstr "MAC Address" msgid "MAC address" msgstr "MAC address" msgid "MAC address for this port. Required." msgstr "MAC address untuk port ini. Wajib." msgid "MAC address for this portgroup." msgstr "MAC address untuk portgroup ini" msgid "MAC address or OpenFlow datapath ID" msgstr "Alamat MAC atau OpenFlow datapath ID" msgid "Maintenance" msgstr "Maintenance (pemeliharaan)" msgid "Maintenance Reason" msgstr "Maintenance Reason (alasan pemeliharaan)" msgid "Mode" msgstr "Mode" msgid "Move to" msgstr "Move to (pindah ke)" msgid "Name" msgstr "Nama" msgid "Name for the portgroup." msgstr "Nama untuk portgroup" msgid "Network Interface" msgstr "Network Interface" msgid "No Instance" msgstr "Tak ada Instance" msgid "No network ports have been defined" msgstr "Tidak ada port jaringan telah didefinisikan" msgid "No portgroups have been defined" msgstr "No portgroups telah didefinisikan" msgid "No reason given." msgstr "Tidak ada alasan yang diberikan." msgid "Node" msgstr "Node (simpul)" #, python-format msgid "Node %s is already in target maintenance state." msgstr "Node %s sudah dalam target maintenance state." msgid "Node Driver" msgstr "Node Driver" msgid "Node ID" msgstr "Node ID" msgid "Node Info" msgstr "Node Info (info node)" msgid "Node Name" msgstr "Node Name (nama node)" msgid "One of this, (.*) must be specified\\." msgstr "One of this, (.*) must be specified\\." msgid "Overview" msgstr "Iktisar" msgid "PXE Enabled" msgstr "PXE Diaktifkan" msgid "PXE enabled" msgstr "PXE enabled" msgid "Persistent" msgstr "Persistent" msgid "Port successfully created" msgstr "Port berhasil dibuat" msgid "Portgroup" msgstr "Portgroup" msgid "Portgroup successfully created" msgstr "Portgroup berhasil dibuat" msgid "Portgroup that this port belongs to" msgstr "Portgroup yang dimiliki port ini" msgid "Portgroups" msgstr "Portgroups" msgid "Ports" msgstr "Port-Port" msgid "Power State" msgstr "Power State" msgid "Power off" msgstr "Power off" msgid "Power on" msgstr "Power on" msgid "Properties" msgstr "Property (sifat)" msgid "Property Name" msgstr "Property Name (nama property)" msgid "Provide a list of cleaning steps in JSON format" msgstr "Berikan daftar langkah-langkah pembersihan dalam format JSON" msgid "" "Provide a reason for why you are putting the selected node(s) into " "maintenance mode (optional)" msgstr "" "Berikan alasan mengapa Anda menempatkan node yang dipilih ke dalam modus " "pemeliharaan (opsional)" msgid "Provision State" msgstr "Provision State (keadaan penyediaan)" msgid "Provisioning State" msgstr "Provisioning State" msgid "Provisioning Status" msgstr "Provisioning Status (status penyediaan)" msgid "Put Node(s) Into Maintenance Mode" msgstr "Letakan Node(s) dalam Maintenance Mode" msgid "RAID Level" msgstr "RAID Level" msgid "Ramdisk" msgstr "Ramdisk" msgid "Reason" msgstr "Reason (alasan)" msgid "Reboot" msgstr "Reboot" msgid "Refresh" msgstr "Refresh" msgid "Refresh page to see set boot device" msgstr "Segarkan halaman untuk melihat perangkat booting yang ditetapkan" msgid "Refresh page to see updated console details" msgstr "Segarkan halaman untuk melihat rincian konsol yang diperbarui" msgid "Refresh page to see updated power status" msgstr "Refresh halaman untuk melihat status daya diperbarui" msgid "Refresh page." msgstr "Refresh halaman" msgid "Required" msgstr "Wajib" msgid "Reservation" msgstr "Reservation" msgid "Resource Class" msgstr "Resource Class" msgid "Root GB" msgstr "Root GB" msgid "Root Volume" msgstr "Root Volume" msgid "Root Volume." msgstr "Root Volume." msgid "SSH Address" msgstr "SSH Address" msgid "SSH Key Contents" msgstr "SSH Key Contents (konten kunci SSH)" msgid "SSH Key File" msgstr "SSH Key File (file kunci SSH)" msgid "SSH Password" msgstr "SSH Password (password SSH)" msgid "SSH Port" msgstr "SSH Port" msgid "SSH Username" msgstr "SSH Username " msgid "SSH terminal port" msgstr "SSH terminal port (port terminal SSH)" msgid "Select a Driver" msgstr "Pilih Driver" msgid "Select a boot device" msgstr "Pilih perangkat booting" msgid "Select a portgroup" msgstr "Pilih portgroup" msgid "Set Boot Device" msgstr "Set Boot Device (setel perangkat booting)" msgid "Set RAID Configuration" msgstr "Set RAID Configuration" msgid "Set Target RAID Config" msgstr "Set Target RAID Config" msgid "Size GB" msgstr "Ukuran GB" msgid "Soft power off" msgstr "Soft power off" msgid "Soft reboot" msgstr "Soft reboot" msgid "Specifies RAID Level." msgstr "Menentukan RAID Level." msgid "Specifies logical disk size in GiB. Required." msgstr "Menentukan ukuran disk logikal dalami GiB. Wajib." msgid "" "Specifies whether ports in this portgroup can be used as standalone ports." msgstr "" "Menentukan apakah port dalam portgroup ini dapat digunakan sebagai port " "standalone." msgid "Specifies whether root volume or not." msgstr "Menentukan apakah root volume atau bukan." msgid "Standalone Ports Supported" msgstr "Port Standalone yang Didukung" msgid "Storage Interface" msgstr "Storage Interface" msgid "Submit" msgstr "Submit (menyampaikan)" #, python-format msgid "Successfully deleted node \"%s\"" msgid_plural "Successfully deleted nodes \"%s\"" msgstr[0] "Berhasil hapus node \"%s\"" #, python-format msgid "Successfully deleted port \"%s\"" msgid_plural "Successfully deleted ports \"%s\"" msgstr[0] "Berhasil hapus port \"%s\"" #, python-format msgid "Successfully deleted portgroup \"%s\"" msgid_plural "Successfully deleted portgroups \"%s\"" msgstr[0] "Successfully deleted portgroup \"%s\"" #, python-format msgid "Successfully updated node %s" msgstr "Berhasil perbarui node %s" #, python-format msgid "Successfully updated port %s" msgstr "Port berhasil diperbarui %s" #, python-format msgid "Successfully updated portgroup %s" msgstr "Portgroup yang berhasil diperbarui %s" msgid "Target Power State" msgstr "Target Power State" msgid "Target Provision State" msgstr "Target Provision State (keadaab penyediaan sasaran)" msgid "" "This field is disabled because a port cannot have any connectivity " "attributes (pxe_enabled, local_link_connection, portgroup_id) updated unless " "its associated node is in an enroll, inspecting, mangeable state; or in " "maintenance mode." msgstr "" "Field ini dinonaktifkan karena port tidak dapat memiliki atribut " "konektivitas (pxe_enabled, local_link_connection, portgroup_id) yang " "diperbarui kecuali node yang terkait adalah dalam keadaan enroll, " "inspecting, mangeable; atau dalam modus pemeliharaan." msgid "UUID" msgstr "UUID" msgid "Unable to create node update patch." msgstr "Tidak dapat membuat node update patch." #, python-format msgid "Unable to create node: %s" msgstr "Tidak dapat membuat node: %s" msgid "Unable to create port update patch." msgstr "Tidak dapat membuat port update patch." #, python-format msgid "Unable to create port: %s" msgstr "Tidak dapat membuat port: %s" msgid "Unable to create portgroup update patch." msgstr "Tidak dapat membuat patch update portgroup." #, python-format msgid "Unable to create portgroup: %s" msgstr "Tidak dapat membuat portgroup: %s" #, python-format msgid "Unable to delete node \"%s\"" msgid_plural "Unable to delete nodes \"%s\"" msgstr[0] "Tidak dapat menghapus node \"%s\"" #, python-format msgid "Unable to delete node %s: %s" msgstr "Tidak dapat menghapus node %s: %s" #, python-format msgid "Unable to delete port \"%s\"" msgid_plural "Unable to delete ports \"%s\"" msgstr[0] "Unable to delete port \"%s\"" #, python-format msgid "Unable to delete port: %s" msgstr "Tidak dapat menghapus port: %s" #, python-format msgid "Unable to delete portgroup \"%s\"" msgid_plural "Unable to delete portgroups \"%s\"" msgstr[0] "Unable to delete portgroup \"%s\"" #, python-format msgid "Unable to delete portgroup: %s" msgstr "Tidak dapat menghapus portgroup: %s" #, python-format msgid "Unable to get console for node %s: %s" msgstr "Tidak dapat mendapatkan konsol untuk node %s: %s" #, python-format msgid "Unable to inject NMI: %s" msgstr "Tidak dapat menyuntikkan NMI: %s" #, python-format msgid "Unable to power off the node: %s" msgstr "Tidak dapat daya mati pada node: %s" #, python-format msgid "Unable to retrieve Ironic drivers: %s" msgstr "Tidak dapat mengambil Ironic driver: %s" #, python-format msgid "Unable to retrieve Ironic node portgroups: %s" msgstr "Unable to retrieve Ironic node portgroups: %s" #, python-format msgid "Unable to retrieve Ironic nodes. %s" msgstr "Tidak dapat mengambil node Ironis. %s" #, python-format msgid "Unable to retrieve boot device for Ironic node. %s" msgstr "Tidak dapat mengambil perangkat boot untuk simpul Ironis. %s" #, python-format msgid "Unable to retrieve driver properties: %s" msgstr "Tidak dapat mengambil driver property: %s" #, python-format msgid "Unable to retrieve portgroup ports: %s" msgstr "Tidak dapat mengambil port portgroup: %s" #, python-format msgid "Unable to retrieve supported boot devices for Ironic node. %s" msgstr "" "Tidak dapat mengambil perangkat booting yang didukung untuk node Ironic. %s" #, python-format msgid "Unable to retrieve the Ironic node ports: %s" msgstr "Tidak dapat mengambil Ironic node port: %s" #, python-format msgid "Unable to retrieve the Ironic node: %s" msgstr "Tidak dapat mengambil Ironic node: %s" #, python-format msgid "Unable to set Ironic node %s maintenance state: %s" msgstr "Unable to set Ironic node %s maintenance state: %s" #, python-format msgid "Unable to set boot device: %s" msgstr "Tidak dapat mengatur perangkat booting: %s" #, python-format msgid "Unable to set console mode: %s" msgstr "Tidak dapat mengatur mode konsol: %s" #, python-format msgid "Unable to set node provision state: %s" msgstr "Tidak dapat mengatur keadaan provision node: %s" #, python-format msgid "Unable to set raid config: %s" msgstr "Tidak dapat mengatur konfigurasi raid: %s" #, python-format msgid "Unable to update node %s: %s" msgstr "Tidak dapat memperbarui node %s: %s" #, python-format msgid "Unable to update port %s: %s" msgstr "Tidak dapat memperbarui port %s: %s" #, python-format msgid "Unable to update portgroup %s: %s" msgstr "Tidak dapat memperbarui portgroup %s: %s" #, python-format msgid "Unable to validate node %s: %s" msgstr "Tidak dapat memvalidasi node %s: %s" msgid "Unable to validate the JSON input" msgstr "Tidak dapat memvalidasi input JSON" msgid "Update Node" msgstr "Update Node" msgid "Update Port" msgstr "Update Port" msgid "Update Portgroup" msgstr "Update Portgroup" msgid "Updated At" msgstr "Diperbarui pada" msgid "Valid" msgstr "Valid (sah)" msgid "Virtualization Software" msgstr "Virtualization Software (software virtualisasi)" msgid "default (?:value )?is ([^\"\\. ]+|\"[^\"]+\")" msgstr "default (?:value )?is ([^\"\\. ]+|\"[^\"]+\")" ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.88151 ironic-ui-6.3.0/ironic_ui/locale/ja/0000775000175000017500000000000000000000000017252 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.89351 ironic-ui-6.3.0/ironic_ui/locale/ja/LC_MESSAGES/0000775000175000017500000000000000000000000021037 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/locale/ja/LC_MESSAGES/djangojs.po0000664000175000017500000004245700000000000023212 0ustar00zuulzuul00000000000000# Akihiro Motoki , 2016. #zanata # Andreas Jaeger , 2016. #zanata # Shu Muto , 2016. #zanata # Yoshiki Eguchi , 2016. #zanata # Akihiro Motoki , 2017. #zanata # Shu Muto , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: ironic-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-15 09:55+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-08-09 05:33+0000\n" "Last-Translator: Shu Muto \n" "Language-Team: Japanese\n" "Language: ja\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgstr " ([^\" ]+|\"[^\"]+\") \\(デフォルト\\)" msgid "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" msgstr "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" #, python-format msgid "A request has been made to change the provisioning state of node %s" msgstr "ノード %s のプロビジョニング状態を変更するための要求が作成されました。" msgid "A unique node name. Optional." msgstr "一意のノード名。オプション。" msgid "Abort cleaning" msgstr "クリーニングの中止" msgid "Actions" msgstr "アクション" msgid "Add Extra" msgstr "拡張の追加" msgid "Add Instance Property" msgstr "インスタンスのプロパティーの追加" msgid "Add Property" msgstr "プロパティーの追加" #, python-format msgid "" "Are you sure you want to delete node \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete nodes \"%s\"? This action cannot be undone." msgstr[0] "ノード「%s」 を削除してよろしいですか?この操作は取り消せません。" #, python-format msgid "" "Are you sure you want to delete port \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete ports \"%s\"? This action cannot be undone." msgstr[0] "ポート「%s」 を削除してよろしいですか?この操作は取り消せません。" #, python-format msgid "" "Are you sure you want to delete portgroup \"%s\"? This action cannot be " "undone." msgid_plural "" "Are you sure you want to delete portgroups \"%s\"? This action cannot be " "undone." msgstr[0] "" "ポートグループ「%s」 を削除してよろしいですか?この操作は取り消せません。" msgid "Attributes" msgstr "属性" msgid "Boot Device" msgstr "ブートデバイス" msgid "Cancel" msgstr "取り消し" msgid "Chassis ID" msgstr "シャーシ ID" msgid "Choose an Image" msgstr "イメージの選択" msgid "Clean" msgstr "クリーニング" msgid "Clean Node" msgstr "ノードのクリーニング" msgid "Clean Step" msgstr "クリーニングステップ" msgid "Clean node" msgstr "ノードのクリーニング" msgid "Clean steps should be an non-empty array" msgstr "クリーニングステップは空でない配列である必要があります。" msgid "Click link to view console" msgstr "コンソールを表示するにはリンクをクリックします" msgid "Configuration" msgstr "設定" msgid "Console Enabled" msgstr "コンソールの有効化" msgid "Console Info." msgstr "コンソール情報" msgid "Create Port" msgstr "ポートの作成" msgid "Create Portgroup" msgstr "ポートグループの作成" msgid "Created At" msgstr "作成時刻" msgid "Current Interface" msgstr "現在のインターフェース" msgid "Defaults to ([^\"\\. ]+|\"[^\"]+\")" msgstr "デフォルトを ([^\"\\. ]+|\"[^\"]+\") にします" msgid "Delete Node" msgid_plural "Delete Nodes" msgstr[0] "ノードの削除" msgid "Delete Nodes" msgstr "ノードの削除" msgid "Delete Port" msgid_plural "Delete Ports" msgstr[0] "ポートの削除" msgid "Delete Portgroup" msgid_plural "Delete Portgroups" msgstr[0] "ポートグループの削除" msgid "Delete Ports" msgstr "ポートの削除" msgid "Deploy Kernel" msgstr "カーネルのデプロイ" msgid "Deploy Ramdisk" msgstr "RAM ディスクのデプロイ" msgid "Device" msgstr "デバイス" msgid "Driver" msgstr "ドライバー" msgid "Driver Details" msgstr "ドライバー詳細" msgid "Driver Info" msgstr "ドライバー情報" msgid "Driver Validation" msgstr "ドライバーの検証" msgid "" "Each cleaning step must be an object that contains \"interface\" and \"step" "\" properties" msgstr "" "各クリーニングステップは、「interface」と「step」プロパティーを含むオブジェク" "トである必要があります。" msgid "Edit" msgstr "編集" msgid "Edit Node" msgstr "ノードの編集" msgid "Edit Port" msgstr "ポートの編集" msgid "Edit Portgroup" msgstr "ポートグループの編集" msgid "Enroll Node" msgstr "ノードの登録" msgid "Extra" msgstr "拡張" msgid "Extra Property Name" msgstr "拡張プロパティー名" msgid "Extras" msgstr "拡張" msgid "General" msgstr "一般" msgid "Image Source" msgstr "イメージソース" msgid "Indicates whether this port should be used when PXE booting this node" msgstr "" "このノードを PXE ブート時に、このポートがが使用されるべきかどうかを示します。" msgid "Inspect" msgstr "検査" msgid "Inspection Finished At" msgstr "検査終了時刻" msgid "Inspection Started At" msgstr "検査開始時刻" msgid "Instance ID" msgstr "インスタンス ID" msgid "Instance Info" msgstr "インスタンス情報" msgid "Instance Name" msgstr "インスタンス名" msgid "Instance Property Name" msgstr "インスタンスのプロパティー名" msgid "Interface" msgstr "インターフェース" msgid "Kernel" msgstr "カーネル" msgid "Last Error" msgstr "最後のエラー" msgid "" "Linux portgroup mode. For possible values refer to https://www.kernel.org/" "doc/Documentation/networking/bonding.txt" msgstr "" "Linux のポートグループモードです。可能な値は、 https://www.kernel.org/doc/" "Documentation/networking/bonding.txt を参照してください。" msgid "Local Link Connection" msgstr "ローカルリンク接続" msgid "Local link connection" msgstr "ローカルリンク接続" msgid "MAC Address" msgstr "MAC アドレス" msgid "MAC address" msgstr "MAC アドレス" msgid "MAC address for this port. Required." msgstr "このポートの MAC アドレス。必須。" msgid "MAC address for this portgroup." msgstr "このポートグループの MAC アドレス" msgid "MAC address or OpenFlow datapath ID" msgstr "MAC アドレスあるいは OpenFlow データパス ID" msgid "Maintenance" msgstr "メンテナンス" msgid "Maintenance Reason" msgstr "メンテナンスの理由" msgid "Mode" msgstr "モード" msgid "Move to" msgstr "移動先" msgid "Name" msgstr "名前" msgid "Name for the portgroup." msgstr "ポートグループの名前" msgid "Network Interface" msgstr "ネットワークインターフェース" msgid "No Instance" msgstr "インスタンスなし" msgid "No network ports have been defined" msgstr "ネットワークポートが定義されていません" msgid "No portgroups have been defined" msgstr "ポートグループが定義されていません" msgid "No reason given." msgstr "理由がありません。" msgid "Node" msgstr "ノード" #, python-format msgid "Node %s is already in target maintenance state." msgstr "ノード %s は既にメンテナンスモードの対象になっています。" msgid "Node Driver" msgstr "ノードドライバー" msgid "Node ID" msgstr "ノード ID" msgid "Node Info" msgstr "ノード情報" msgid "Node Name" msgstr "ノード名" msgid "One of this, (.*) must be specified\\." msgstr "(.*) の1つを指定する必要があります。" msgid "Overview" msgstr "概要" msgid "PXE Enabled" msgstr "PXE の有効化" msgid "PXE enabled" msgstr "PXE の有効化" msgid "Persistent" msgstr "永続" msgid "Port successfully created" msgstr "ポートが正常に作成されました" msgid "Portgroup" msgstr "ポートグループ" msgid "Portgroup successfully created" msgstr "ポートグループが正常に作成されました" msgid "Portgroup that this port belongs to" msgstr "このポートが属するポートグループ" msgid "Portgroups" msgstr "ポートグループ" msgid "Ports" msgstr "ポート" msgid "Power State" msgstr "電源状態" msgid "Power off" msgstr "電源オフ" msgid "Power on" msgstr "電源オン" msgid "Properties" msgstr "プロパティー" msgid "Property Name" msgstr "プロパティ名" msgid "Provide a list of cleaning steps in JSON format" msgstr "クリーニングステップの一覧を JSON 形式で提供します。" msgid "" "Provide a reason for why you are putting the selected node(s) into " "maintenance mode (optional)" msgstr "" "選択したノードをメンテナンスモードにする理由を設定してください(オプション)" msgid "Provision State" msgstr "プロビジョニング状態" msgid "Provisioning State" msgstr "プロビジョニング状態" msgid "Provisioning Status" msgstr "プロビジョニング状態" msgid "Put Node(s) Into Maintenance Mode" msgstr "ノードをメンテナンスモードにします" msgid "Ramdisk" msgstr "RAM ディスク" msgid "Reason" msgstr "理由" msgid "Reboot" msgstr "リブート" msgid "Refresh" msgstr "最新表示" msgid "Refresh page to see set boot device" msgstr "設定されたブートデバイスを参照するにはページをリフレッシュしてください" msgid "Refresh page to see updated console details" msgstr "" "更新されたコンソールの詳細を参照するにはページをリフレッシュしてください" msgid "Refresh page to see updated power status" msgstr "電源状態を更新するにはページをリフレッシュしてください" msgid "Required" msgstr "必須" msgid "Reservation" msgstr "予約" msgid "Resource Class" msgstr "リソースクラス" msgid "Root GB" msgstr "ルートディスク (GB)" msgid "SSH Address" msgstr "SSH アドレス" msgid "SSH Key Contents" msgstr "SSH 鍵の内容" msgid "SSH Key File" msgstr "SSH 鍵ファイル" msgid "SSH Password" msgstr "SSH パスワード" msgid "SSH Port" msgstr "SSH ポート" msgid "SSH Username" msgstr "SSH ユーザー名" msgid "SSH terminal port" msgstr "SSH ターミナルのポート" msgid "Select a Driver" msgstr "ドライバーを選択してください" msgid "Select a boot device" msgstr "ブートデバイスを選択してください。" msgid "Select a portgroup" msgstr "ポートグループを選択してください。" msgid "Set Boot Device" msgstr "ブートデバイスの設定" msgid "Soft power off" msgstr "ソフト電源オフ" msgid "Soft reboot" msgstr "ソフトリブート" msgid "" "Specifies whether ports in this portgroup can be used as standalone ports." msgstr "" "このポートグループのポートがスタンドアロンポートとして使用できるようにするか" "どうか指定してください。" msgid "Standalone Ports Supported" msgstr "スタンドアロンポートのサポート" msgid "Submit" msgstr "送信" #, python-format msgid "Successfully deleted node \"%s\"" msgid_plural "Successfully deleted nodes \"%s\"" msgstr[0] "ノード「%s」を正常に削除しました" #, python-format msgid "Successfully deleted port \"%s\"" msgid_plural "Successfully deleted ports \"%s\"" msgstr[0] "ポート \"%s\" を正常に削除しました" #, python-format msgid "Successfully deleted portgroup \"%s\"" msgid_plural "Successfully deleted portgroups \"%s\"" msgstr[0] "ポートグループ \"%s\" を正常に削除しました" #, python-format msgid "Successfully updated node %s" msgstr "ノード %s の更新に成功しました" #, python-format msgid "Successfully updated port %s" msgstr "ポート %s の更新に成功しました" #, python-format msgid "Successfully updated portgroup %s" msgstr "ポートグループ %s の更新に成功しました" msgid "Target Power State" msgstr "ターゲット電源状態" msgid "Target Provision State" msgstr "ターゲットプロビジョニング状態" msgid "" "This field is disabled because a port cannot have any connectivity " "attributes (pxe_enabled, local_link_connection, portgroup_id) updated unless " "its associated node is in an enroll, inspecting, mangeable state; or in " "maintenance mode." msgstr "" "ポートが接続のための属性 (PXE 有効、ローカルリンク接続、ポートグループ ID) の" "いずれも持たないため、関連付けられたノードが登録、検査、管理可能な状態に更新" "されるまで、あるいはメンテナンスモードになるまで、この項目は無効です。" msgid "UUID" msgstr "UUID" msgid "Unable to create node update patch." msgstr "ノードを更新するパッチを作成できません。" #, python-format msgid "Unable to create node: %s" msgstr "ノードを作成できません: %s" msgid "Unable to create port update patch." msgstr "ポートを更新するパッチを作成できません。" #, python-format msgid "Unable to create port: %s" msgstr "ポートを作成できません: %s" msgid "Unable to create portgroup update patch." msgstr "ポートグループを更新するパッチを作成できません。" #, python-format msgid "Unable to create portgroup: %s" msgstr "ポートグループを作成できません: %s" #, python-format msgid "Unable to delete node \"%s\"" msgid_plural "Unable to delete nodes \"%s\"" msgstr[0] "ノード 「%s」を削除できません" #, python-format msgid "Unable to delete node %s: %s" msgstr "ノード %s を削除できません: %s" #, python-format msgid "Unable to delete port \"%s\"" msgid_plural "Unable to delete ports \"%s\"" msgstr[0] "ポート \"%s\" を削除できません" #, python-format msgid "Unable to delete port: %s" msgstr "ポートを削除できません: %s" #, python-format msgid "Unable to delete portgroup \"%s\"" msgid_plural "Unable to delete portgroups \"%s\"" msgstr[0] "ポートグループ \"%s\" を削除できません" #, python-format msgid "Unable to delete portgroup: %s" msgstr "ポートグループを削除できません: %s" #, python-format msgid "Unable to get console for node %s: %s" msgstr "ノード %s のコンソールを取得できません: %s" #, python-format msgid "Unable to power off the node: %s" msgstr "ノードを電源OFFにできません: %s" #, python-format msgid "Unable to retrieve Ironic drivers: %s" msgstr "Ironic ドライバーの一覧を取得できません: %s" #, python-format msgid "Unable to retrieve Ironic node portgroups: %s" msgstr "Ironic ノードのポートグループ一覧を取得できません: %s" #, python-format msgid "Unable to retrieve Ironic nodes. %s" msgstr "Ironic ノードの一覧を取得できません: %s" #, python-format msgid "Unable to retrieve boot device for Ironic node. %s" msgstr "Ironic ノードのブートデバイスを取得できません: %s" #, python-format msgid "Unable to retrieve driver properties: %s" msgstr "ドライバープロパティーの一覧を取得できません: %s" #, python-format msgid "Unable to retrieve portgroup ports: %s" msgstr "ポートグループのポート一覧を取得できません: %s" #, python-format msgid "Unable to retrieve supported boot devices for Ironic node. %s" msgstr "Ironic ノードでサポートしているブートデバイス一覧を取得できません: %s" #, python-format msgid "Unable to retrieve the Ironic node ports: %s" msgstr "Ironic ノードのポート一覧を取得できません: %s" #, python-format msgid "Unable to retrieve the Ironic node: %s" msgstr "Ironic ノードを取得できません: %s" #, python-format msgid "Unable to set Ironic node %s maintenance state: %s" msgstr "Ironic ノード %s をメンテナンスモードにできません: %s" #, python-format msgid "Unable to set boot device: %s" msgstr "ブートデバイスを設定できません: %s" #, python-format msgid "Unable to set console mode: %s" msgstr "コンソールモードを設定できません: %s" #, python-format msgid "Unable to set node provision state: %s" msgstr "ノードのプロビジョニング状態を設定できませんでした: %s" #, python-format msgid "Unable to update node %s: %s" msgstr "ノード %s を更新できません: %s" #, python-format msgid "Unable to update port %s: %s" msgstr "ポート %s の更新に失敗しました: %s" #, python-format msgid "Unable to update portgroup %s: %s" msgstr "ポートグループ %s の更新に失敗しました: %s" #, python-format msgid "Unable to validate node %s: %s" msgstr "ノード %s を検証できません: %s" msgid "Unable to validate the JSON input" msgstr "JSON の入力を検証できません。" msgid "Update Node" msgstr "ノードの更新" msgid "Update Port" msgstr "ポートの更新" msgid "Update Portgroup" msgstr "ポートグループの更新" msgid "Updated At" msgstr "最終更新" msgid "Valid" msgstr "有効" msgid "Virtualization Software" msgstr "仮想化ソフトウェア" msgid "default (?:value )?is ([^\"\\. ]+|\"[^\"]+\")" msgstr "(?:value )?のデフォルトは ([^\"\\. ]+|\"[^\"]+\") です" ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.88151 ironic-ui-6.3.0/ironic_ui/locale/ko_KR/0000775000175000017500000000000000000000000017665 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.89351 ironic-ui-6.3.0/ironic_ui/locale/ko_KR/LC_MESSAGES/0000775000175000017500000000000000000000000021452 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/locale/ko_KR/LC_MESSAGES/django.po0000664000175000017500000000145600000000000023262 0ustar00zuulzuul00000000000000# Eunseop Shin , 2016. #zanata # ByungYeol Woo , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: ironic-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-25 10:13+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-05-01 10:51+0000\n" "Last-Translator: ByungYeol Woo \n" "Language-Team: Korean (South Korea)\n" "Language: ko_KR\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "Admin" msgstr "관리자" msgid "Ironic Bare Metal Provisioning" msgstr "Ironic 베어메탈 프로비저닝" msgid "Node Details" msgstr "노드 세부사항" msgid "System" msgstr "시스템" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/locale/ko_KR/LC_MESSAGES/djangojs.po0000664000175000017500000004306300000000000023617 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata # Eunseop Shin , 2016. #zanata # HYUNGBAI PARK , 2016. #zanata # Ian Y. Choi , 2016. #zanata # Sungjin Kang , 2016. #zanata # ChungYoung Cho , 2017. #zanata # Ian Y. Choi , 2017. #zanata # Jun-Sik Shin , 2017. #zanata # Sungjin Kang , 2017. #zanata # Wonil Choi , 2017. #zanata # minwook-shin , 2017. #zanata # Ian Y. Choi , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: ironic-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-15 09:55+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-03-13 02:08+0000\n" "Last-Translator: Ian Y. Choi \n" "Language-Team: Korean (South Korea)\n" "Language: ko_KR\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgstr " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgid "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" msgstr "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" #, python-format msgid "A request has been made to change the provisioning state of node %s" msgstr "노드 %s의 프로비저닝 상태 변경을 위한 요청이 처리되었습니다." msgid "A unique node name. Optional." msgstr "단일한 노드 명칭. 선택사항." msgid "Abort cleaning" msgstr "클린업 취소" msgid "Action" msgstr "동작" msgid "Actions" msgstr "작업" msgid "Add Extra" msgstr "Extra 추가" msgid "Add Instance Property" msgstr "인스턴스 속성 추가" msgid "Add Logical Disk" msgstr "논리 디스크 추가" msgid "Add Property" msgstr "속성 추가" #, python-format msgid "" "Are you sure you want to delete node \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete nodes \"%s\"? This action cannot be undone." msgstr[0] "노드 \"%s\" 를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다." #, python-format msgid "" "Are you sure you want to delete port \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete ports \"%s\"? This action cannot be undone." msgstr[0] "포트 \"%s\" 를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다." #, python-format msgid "" "Are you sure you want to delete portgroup \"%s\"? This action cannot be " "undone." msgid_plural "" "Are you sure you want to delete portgroups \"%s\"? This action cannot be " "undone." msgstr[0] "" "포트그룹 \"%s\" 을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다." msgid "Attributes" msgstr "특성" msgid "Boot Device" msgstr "부트 디바이스" msgid "Cancel" msgstr "취소하기" msgid "Chassis ID" msgstr "Chassis ID" msgid "Choose an Image" msgstr "이미지 선택하기" msgid "Clean" msgstr "정리" msgid "Clean Node" msgstr "클린 노드" msgid "Clean Step" msgstr "클린업 단계" msgid "Clean node" msgstr "클린 노드" msgid "Clean steps should be an non-empty array" msgstr "클린 단계는 비어있지 않은 배열이어야 합니다." msgid "Click link to view console" msgstr "콘솔을 보려면 링크를 클릭하세요" msgid "Configuration" msgstr "구성" msgid "Console Enabled" msgstr "콘솔 활성화" msgid "Console Info." msgstr "콘솔 정보." msgid "Create Port" msgstr "포트 생성하기" msgid "Create Portgroup" msgstr "포트그룹 생성" msgid "Created At" msgstr "생성 시점" msgid "Current Interface" msgstr "현재 인터페이스" msgid "Defaults to ([^\"\\. ]+|\"[^\"]+\")" msgstr "Defaults to ([^\"\\. ]+|\"[^\"]+\")" msgid "Delete Node" msgid_plural "Delete Nodes" msgstr[0] "노드 삭제" msgid "Delete Nodes" msgstr "노드들 삭제하기" msgid "Delete Port" msgid_plural "Delete Ports" msgstr[0] "포트 삭제" msgid "Delete Portgroup" msgid_plural "Delete Portgroups" msgstr[0] "포트그룹 삭제" msgid "Delete Ports" msgstr "포트 삭제하기" msgid "Deploy Kernel" msgstr "커널 배치하기" msgid "Deploy Ramdisk" msgstr "램디스크 배치하기" msgid "Device" msgstr "장치" msgid "Driver" msgstr "드라이버" msgid "Driver Details" msgstr "드라이버 세부사항" msgid "Driver Info" msgstr "드라이버 정보" msgid "Driver Interfaces" msgstr "드라이버 인터페이스" msgid "Driver Validation" msgstr "드라이버 확인" msgid "" "Each cleaning step must be an object that contains \"interface\" and \"step" "\" properties" msgstr "" "각 클리닝 단계는 \"interface\"와 \"step\" 속성을 가지고 있는 오브젝트여야 합" "니다." msgid "Edit" msgstr "편집" msgid "Edit Node" msgstr "노드 편집" msgid "Edit Port" msgstr "포트 수정" msgid "Edit Portgroup" msgstr "포트그룹 편집" msgid "Enroll Node" msgstr "노드 등록하기" msgid "Extra" msgstr "Extra" msgid "Extra Property Name" msgstr "Extra 속성 명칭" msgid "Extras" msgstr "Extra" msgid "General" msgstr "일반" msgid "Image Source" msgstr "이미지 소스" msgid "Indicates whether this port should be used when PXE booting this node" msgstr "이 노드에서 PXE 부팅 시 이 포트가 사용되어야 하는지를 가리킵니다." msgid "Inject NMI" msgstr "NMI 주입" msgid "Inspect" msgstr "검사" msgid "Inspection Finished At" msgstr "점검 종료시점" msgid "Inspection Started At" msgstr "점검 시작 시점" msgid "Instance ID" msgstr "인스턴스 ID" msgid "Instance Info" msgstr "인스턴스 정보" msgid "Instance Name" msgstr "인스턴스 이름" msgid "Instance Property Name" msgstr "인스턴스 속성 이름" msgid "Interface" msgstr "인터페이스" msgid "Kernel" msgstr "커널" msgid "Last Error" msgstr "마지막 에러" msgid "" "Linux portgroup mode. For possible values refer to https://www.kernel.org/" "doc/Documentation/networking/bonding.txt" msgstr "" "리눅스 포트그룹 모드. 가능한 설정은 https://www.kernel.org/doc/Documentation/" "networking/bonding.txt 을 참고하세요." msgid "Local Link Connection" msgstr "로컬 링크 접속" msgid "Local link connection" msgstr "로컬 링크 접속" msgid "MAC Address" msgstr "MAC 주소" msgid "MAC address" msgstr "MAC 주소" msgid "MAC address for this port. Required." msgstr "이 포트를 위한 MAC 주소. 필수항목." msgid "MAC address for this portgroup." msgstr "이 포트그룹을 위한 MAC 주소" msgid "MAC address or OpenFlow datapath ID" msgstr "MAC 주소 또는 OpenFlow datapath ID" msgid "Maintenance" msgstr "유지보수" msgid "Maintenance Reason" msgstr "유지보수 사유" msgid "Mode" msgstr "모드" msgid "Move to" msgstr "이동" msgid "Name" msgstr "이름" msgid "Name for the portgroup." msgstr "포트그룹의 이름" msgid "Network Interface" msgstr "네트워크 인터페이스" msgid "No Instance" msgstr "인스턴스 없음" msgid "No network ports have been defined" msgstr "네트워크 포트가 정의되지 않았습니다" msgid "No portgroups have been defined" msgstr "정의된 포트그룹이 없습니다" msgid "No reason given." msgstr "이유가 주어지지 않았습니다." msgid "Node" msgstr "노드" #, python-format msgid "Node %s is already in target maintenance state." msgstr "노드 %s는 이미 대상 유지보수 상태입니다." msgid "Node Driver" msgstr "노드 드라이버" msgid "Node ID" msgstr "노드 ID" msgid "Node Info" msgstr "노드 정보" msgid "Node Name" msgstr "노드 명칭" msgid "One of this, (.*) must be specified\\." msgstr "One of this, (.*) must be specified\\." msgid "Overview" msgstr "개요" msgid "PXE Enabled" msgstr "PXE 활성화됨" msgid "PXE enabled" msgstr "PXE 활성화됨" msgid "Persistent" msgstr "Persistent" msgid "Port successfully created" msgstr "포트가 성공적으로 생성됐습니다" msgid "Portgroup" msgstr "포트그룹" msgid "Portgroup successfully created" msgstr "포트그룹이 성공적으로 생성되었습니다" msgid "Portgroup that this port belongs to" msgstr "이 포트가 속한 포트그룹" msgid "Portgroups" msgstr "포트그룹" msgid "Ports" msgstr "포트들" msgid "Power State" msgstr "전원 상태" msgid "Power off" msgstr "전원 꺼짐" msgid "Power on" msgstr "전원 켜짐" msgid "Properties" msgstr "속성" msgid "Property Name" msgstr "속성 명칭" msgid "Provide a list of cleaning steps in JSON format" msgstr "클리닝 단계의 리스트는 JSON 형식으로 제공하세요." msgid "" "Provide a reason for why you are putting the selected node(s) into " "maintenance mode (optional)" msgstr "선택된 노드를 유지보수 모드로 넣는지 사유를 제공합니다 (선택항목)" msgid "Provision State" msgstr "권한설정 상태" msgid "Provisioning State" msgstr "권한설정 상태" msgid "Provisioning Status" msgstr "권한설정 상태" msgid "Put Node(s) Into Maintenance Mode" msgstr "노드(들)을 유지보수 모드로 넣기" msgid "RAID Level" msgstr "RAID 레벨" msgid "Ramdisk" msgstr "램디스크" msgid "Reason" msgstr "원인" msgid "Reboot" msgstr "재시작" msgid "Refresh" msgstr "갱신" msgid "Refresh page to see set boot device" msgstr "부트 디바이스 설정을 보기 위해 페이지 새로 고치기 " msgid "Refresh page to see updated console details" msgstr "업데이트된 콘솔 자세한 정보를 보기 위해 페이지 새로 고치기" msgid "Refresh page to see updated power status" msgstr "갱신된 전원 상태를 보기 위해 페이지 새로 고치기" msgid "Refresh page." msgstr "페이지를 갱신합니다." msgid "Required" msgstr "필수항목" msgid "Reservation" msgstr "예약" msgid "Resource Class" msgstr "리소스 클래스" msgid "Root GB" msgstr "루트 GB" msgid "Root Volume" msgstr "루트 볼륨" msgid "Root Volume." msgstr "루트 볼륨." msgid "SSH Address" msgstr "SSH주소" msgid "SSH Key Contents" msgstr "SSH 키콘텐츠" msgid "SSH Key File" msgstr "SSH Key File" msgid "SSH Password" msgstr "SSH 패스워드" msgid "SSH Port" msgstr "SSH 포트" msgid "SSH Username" msgstr "SSH Username" msgid "SSH terminal port" msgstr "SSH 터미널포트" msgid "Select a Driver" msgstr "드라이버 선택하기" msgid "Select a boot device" msgstr "부트 디바이스 선택" msgid "Select a portgroup" msgstr "포트그룹 선택" msgid "Set Boot Device" msgstr "부트 디바이스 설정" msgid "Set RAID Configuration" msgstr "RAID 구성 설정" msgid "Set Target RAID Config" msgstr "대상 RAID 구성 설정" msgid "Size GB" msgstr "크기 (GB)" msgid "Soft power off" msgstr "소프트 전원 끄기" msgid "Soft reboot" msgstr "소프트 재시작" msgid "Specifies RAID Level." msgstr "RAID 레벨을 지정합니다." msgid "Specifies logical disk size in GiB. Required." msgstr "논리 디스크 크기를 GiB로 지정합니다. 필수." msgid "" "Specifies whether ports in this portgroup can be used as standalone ports." msgstr "이 포트그룹 내 포트들이 standalone 포트로 사용 가능한 지 지정합니다." msgid "Specifies whether root volume or not." msgstr "루트 볼륨인지 아닌지 지정합니다." msgid "Standalone Ports Supported" msgstr "독립형 포트 지원" msgid "Storage Interface" msgstr "스토리지 인터페이스" msgid "Submit" msgstr "제출" #, python-format msgid "Successfully deleted node \"%s\"" msgid_plural "Successfully deleted nodes \"%s\"" msgstr[0] "노드 \"%s\" 를 성공적으로 삭제했습니다" #, python-format msgid "Successfully deleted port \"%s\"" msgid_plural "Successfully deleted ports \"%s\"" msgstr[0] "포트 \"%s\" 를 성공적으로 삭제했습니다" #, python-format msgid "Successfully deleted portgroup \"%s\"" msgid_plural "Successfully deleted portgroups \"%s\"" msgstr[0] "포트그룹 \"%s\" 을(를) 성공적으로 삭제했습니다." #, python-format msgid "Successfully updated node %s" msgstr "노드 %s가 성공적으로 업데이트 됨." #, python-format msgid "Successfully updated port %s" msgstr "포트 %s가 성공적으로 업데이트하였습니다" #, python-format msgid "Successfully updated portgroup %s" msgstr "포트그룹 %s를 성공적으로 업데이트 하였습니다." msgid "Target Power State" msgstr "대상 전원 상태" msgid "Target Provision State" msgstr "대상 권한설정 상태" msgid "" "This field is disabled because a port cannot have any connectivity " "attributes (pxe_enabled, local_link_connection, portgroup_id) updated unless " "its associated node is in an enroll, inspecting, mangeable state; or in " "maintenance mode." msgstr "" "연결된 노드가 등록, 검사, 관리 가능한 상태이거나 유지보수 모드가 아니라면, 포" "트가 업데이트된 연결 속성(pxe_enabled, local_link_connection, portgroup_id)" "을 가질 수 없어서 이 필드는 비활성화 되었습니다." msgid "UUID" msgstr "UUID" msgid "Unable to create node update patch." msgstr "노드 업데이트 패치를 만들수 없습니다." #, python-format msgid "Unable to create node: %s" msgstr "노드를 생성할 수 없습니다: %s" msgid "Unable to create port update patch." msgstr "포트 업데이트 패치를 만들 수 없습니다." #, python-format msgid "Unable to create port: %s" msgstr "포트를 생성할 수 없습니다: %s" msgid "Unable to create portgroup update patch." msgstr "포트그룹 업데이트 패치를 만들 수 없습니다." #, python-format msgid "Unable to create portgroup: %s" msgstr "포트그룹을 생성할 수 없습니다: %s" #, python-format msgid "Unable to delete node \"%s\"" msgid_plural "Unable to delete nodes \"%s\"" msgstr[0] "노드 \"%s\" 를 삭제할 수 없습니다" #, python-format msgid "Unable to delete node %s: %s" msgstr "노드 %s를 삭제할 수 없습니다: %s" #, python-format msgid "Unable to delete port \"%s\"" msgid_plural "Unable to delete ports \"%s\"" msgstr[0] "포트를 삭제할 수 없습니다: %s" #, python-format msgid "Unable to delete port: %s" msgstr "포트를 삭제할 수 없습니다: %s" #, python-format msgid "Unable to delete portgroup \"%s\"" msgid_plural "Unable to delete portgroups \"%s\"" msgstr[0] "포트그룹 \"%s\" 을(를) 삭제할 수 없습니다." #, python-format msgid "Unable to delete portgroup: %s" msgstr "포트그룹을 삭제할 수 없습니다: %s" #, python-format msgid "Unable to get console for node %s: %s" msgstr "노드 %s를 위한 콘솔을 가져올 수 없습니다: %s" #, python-format msgid "Unable to inject NMI: %s" msgstr "NMI: %s 을(를) 주입할 수 없습니다" #, python-format msgid "Unable to power off the node: %s" msgstr "노드의 전원을 끌 수 없습니다: %s" #, python-format msgid "Unable to retrieve Ironic drivers: %s" msgstr "Ironic 드라이버를 되찾을 수 없습니다: %s" #, python-format msgid "Unable to retrieve Ironic node portgroups: %s" msgstr "Ironic 노드 포트그룹을 가져올 수 없습니다: %s" #, python-format msgid "Unable to retrieve Ironic nodes. %s" msgstr "Ironic 노드를 가져올 수 없습니다: %s " #, python-format msgid "Unable to retrieve boot device for Ironic node. %s" msgstr "Ironic 노드를 위한 부트 장치를 가져올 수 없습니다: %s" #, python-format msgid "Unable to retrieve driver properties: %s" msgstr "드라이버 속성을 되찾을 수 없습니다 : %s" #, python-format msgid "Unable to retrieve portgroup ports: %s" msgstr "포트그룹 포트들을 가져올 수 없습니다: %s" #, python-format msgid "Unable to retrieve supported boot devices for Ironic node. %s" msgstr "Ironic 노드를 위한 지원되는 부트 장치를 가져올 수 없습니다: %s" #, python-format msgid "Unable to retrieve the Ironic node ports: %s" msgstr "Ironic 노드 포트를 가져올 수 없습니다: %s" #, python-format msgid "Unable to retrieve the Ironic node: %s" msgstr "해당 Ironic 노드를 가져올 수 없습니다: %s " #, python-format msgid "Unable to set Ironic node %s maintenance state: %s" msgstr "Ironic 노드 %s 유지보수 상태를 설정 할 수 없습니다: %s" #, python-format msgid "Unable to set boot device: %s" msgstr "부트 디바이스 설정을 할 수 없습니다: %s" #, python-format msgid "Unable to set console mode: %s" msgstr "콘솔 모드를 설정할 수 없습니다: %s" #, python-format msgid "Unable to set node provision state: %s" msgstr "노드 공급 상태를 설정 할 수 없습니다: %s" #, python-format msgid "Unable to set raid config: %s" msgstr "raid 구성: %s 을(를) 읽을 수 없습니다" #, python-format msgid "Unable to update node %s: %s" msgstr "노드 %s를 업데이트 할 수 없습니다: %s" #, python-format msgid "Unable to update port %s: %s" msgstr "포트 %s를 업데이트 할 수 없습니다: %s" #, python-format msgid "Unable to update portgroup %s: %s" msgstr "포트그룹 %s를 업데이트 할 수 없습니다: %s" #, python-format msgid "Unable to validate node %s: %s" msgstr "노드 %s를 검증할수 없습니다: %s" msgid "Unable to validate the JSON input" msgstr "JSON 입력의 유효성을 확인할 수 없습니다" msgid "Update Node" msgstr "노드 업데이트" msgid "Update Port" msgstr "포트 업데이트" msgid "Update Portgroup" msgstr "포트그룹 업데이트" msgid "Updated At" msgstr "업데이트 시점" msgid "Valid" msgstr "유효" msgid "Virtualization Software" msgstr "가상화 소프트트웨어" msgid "default (?:value )?is ([^\"\\. ]+|\"[^\"]+\")" msgstr "default (?:value )?is ([^\"\\. ]+|\"[^\"]+\")" ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.88151 ironic-ui-6.3.0/ironic_ui/locale/pt_BR/0000775000175000017500000000000000000000000017666 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.89351 ironic-ui-6.3.0/ironic_ui/locale/pt_BR/LC_MESSAGES/0000775000175000017500000000000000000000000021453 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/locale/pt_BR/LC_MESSAGES/djangojs.po0000664000175000017500000004312400000000000023616 0ustar00zuulzuul00000000000000# André Campos , 2015. #zanata # OpenStack Infra , 2015. #zanata # Andreas Jaeger , 2016. #zanata # Fernando Pimenta , 2018. #zanata # Rodrigo Loures , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: ironic-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-15 09:55+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-04-25 11:42+0000\n" "Last-Translator: Fernando Pimenta \n" "Language-Team: Portuguese (Brazil)\n" "Language: pt_BR\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgstr " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgid "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" msgstr "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" #, python-format msgid "A request has been made to change the provisioning state of node %s" msgstr "" "Uma requisição foi feita para alterar o estado de provisionamento do nó %s" msgid "Abort cleaning" msgstr "Abortar limpeza" msgid "Action" msgstr "Ação" msgid "Actions" msgstr "Ações" msgid "Add Extra" msgstr "Adicionar Extra" msgid "Add Instance Property" msgstr "Adicionar Propriedade da Instância" msgid "Add Logical Disk" msgstr "Adicionar Disco Lógico" msgid "Add Property" msgstr "Adicionar Propriedade " #, python-format msgid "" "Are you sure you want to delete node \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete nodes \"%s\"? This action cannot be undone." msgstr[0] "" "Você tem certeza que deseja excluir o nó \"%s\"? Essa ação não pode ser " "desfeita." msgstr[1] "" "Você tem certeza que deseja excluir os nós \"%s\"? Essa ação não pode ser " "desfeita." #, python-format msgid "" "Are you sure you want to delete port \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete ports \"%s\"? This action cannot be undone." msgstr[0] "" "Você tem certeza que deseja excluir a porta \"%s\"? Essa ação não pode ser " "desfeita." msgstr[1] "" "Você tem certeza que deseja excluir as portas \"%s\"? Essa ação não pode ser " "desfeita." #, python-format msgid "" "Are you sure you want to delete portgroup \"%s\"? This action cannot be " "undone." msgid_plural "" "Are you sure you want to delete portgroups \"%s\"? This action cannot be " "undone." msgstr[0] "" "Tem certeza que você quer excluir o grupo de portas \"%s\"? Esta ação não " "pode ser desfeita." msgstr[1] "" "Tem certeza que você quer excluir os grupos de portas \"%s\"? Esta ação não " "pode ser desfeita." msgid "Attributes" msgstr "Atributos" msgid "Boot Device" msgstr "Dispositivo de Boot" msgid "Cancel" msgstr "Cancelar" msgid "Chassis ID" msgstr "ID do Chassi" msgid "Choose an Image" msgstr "Escolha uma Imagem" msgid "Clean" msgstr "Limpar" msgid "Clean Node" msgstr "Nó Limpo" msgid "Clean Step" msgstr "Passo de Limpeza" msgid "Clean node" msgstr "Nó limpo" msgid "Clean steps should be an non-empty array" msgstr "Passos de limpeza deve ser uma matriz não vazia" msgid "Click link to view console" msgstr "Clique no link para ver o console" msgid "Configuration" msgstr "Configuração" msgid "Console Enabled" msgstr "Console Ativado" msgid "Console Info." msgstr "Informações de Console." msgid "Create Port" msgstr "Criar Porta" msgid "Create Portgroup" msgstr "Criar Grupo de Portas" msgid "Created At" msgstr "Criado em" msgid "Current Interface" msgstr "Interface Atual" msgid "Defaults to ([^\"\\. ]+|\"[^\"]+\")" msgstr "Padrões para ([^\"\\. ]+|\"[^\"]+\")" msgid "Delete Node" msgid_plural "Delete Nodes" msgstr[0] "Excluir nó" msgstr[1] "Excluir nós" msgid "Delete Port" msgid_plural "Delete Ports" msgstr[0] "Excluir Porta" msgstr[1] "Excluir Portas" msgid "Delete Portgroup" msgid_plural "Delete Portgroups" msgstr[0] "Excluir Grupo de Portas" msgstr[1] "Excluir Grupos de Portas" msgid "Deploy Kernel" msgstr "Implantar Kernel" msgid "Deploy Ramdisk" msgstr "Implantar Ramdisk" msgid "Device" msgstr "Dispositivo" msgid "Driver" msgstr "Driver" msgid "Driver Details" msgstr "Detalhes do Driver" msgid "Driver Info" msgstr "Informações do Driver" msgid "Driver Interfaces" msgstr "Interfaces do Driver" msgid "Driver Validation" msgstr "Validação do Driver" msgid "" "Each cleaning step must be an object that contains \"interface\" and \"step" "\" properties" msgstr "" "Cada passo de limpeza deve ser um objeto que contenha propriedades de " "\"interface\" e \"passo\"" msgid "Edit Node" msgstr "Editar Nó" msgid "Edit Port" msgstr "Editar Porta" msgid "Edit Portgroup" msgstr "Editar Grupo de Portas" msgid "Enroll Node" msgstr "Nó de Inscrição" msgid "Extra" msgstr "Extra" msgid "Extra Property Name" msgstr "Nome de Propriedade Extra" msgid "Extras" msgstr "Extras" msgid "General" msgstr "Geral" msgid "Image Source" msgstr "Fonte de Imagem" msgid "Indicates whether this port should be used when PXE booting this node" msgstr "Indica se essa porta deve ser utilizada ao inicializar esse nó via PXE" msgid "Inject NMI" msgstr "Injetar NMI" msgid "Inspect" msgstr "Inspecionar " msgid "Inspection Finished At" msgstr "Inspeção Finalizada Em" msgid "Inspection Started At" msgstr "Inspeção Iniciada Em" msgid "Instance ID" msgstr "ID da instância" msgid "Instance Info" msgstr "Informações da Instância" msgid "Instance Name" msgstr "Nome da instância" msgid "Instance Property Name" msgstr "Nome da Propriedade da Instância" msgid "Interface" msgstr "Interface" msgid "Kernel" msgstr "Kernel" msgid "Last Error" msgstr "Último Erro" msgid "" "Linux portgroup mode. For possible values refer to https://www.kernel.org/" "doc/Documentation/networking/bonding.txt" msgstr "" "Modo Linux de grupo de portas. Para os valores possíveis consulte https://" "www.kernel.org/doc/Documentation/networking/bonding.txt" msgid "Local Link Connection" msgstr "Conexão de Link Local" msgid "Local link connection" msgstr "Conexão de link local" msgid "MAC Address" msgstr "Endereço MAC" msgid "MAC address" msgstr "Endereço MAC" msgid "MAC address for this port. Required." msgstr "Endereço MAC para essa porta. Obrigatório." msgid "MAC address for this portgroup." msgstr "Endereço MAC para esse grupo de portas." msgid "MAC address or OpenFlow datapath ID" msgstr "Endereço MAC ou ID do datapath OpenFlow" msgid "Maintenance" msgstr "Manutenção" msgid "Maintenance Reason" msgstr "Motivo da Manutenção" msgid "Mode" msgstr "Modo" msgid "Move to" msgstr "Mover para" msgid "Name" msgstr "Nome" msgid "Name for the portgroup." msgstr "Nome para esse grupo de portas." msgid "Network Interface" msgstr "Interface de Rede" msgid "No Instance" msgstr "Nenhuma Instância" msgid "No network ports have been defined" msgstr "Nenhuma porta de rede foi definida" msgid "No portgroups have been defined" msgstr "Nenhum grupo de portas foi definido" msgid "No reason given." msgstr "Nenhuma razão dada." msgid "Node" msgstr "Nó" #, python-format msgid "Node %s is already in target maintenance state." msgstr "O nó %s já está entrando no estado de manutenção." msgid "Node Driver" msgstr "Driver de Nó" msgid "Node ID" msgstr "ID do Nó" msgid "Node Info" msgstr "Informação do Nó" msgid "Node Name" msgstr "Nome do Nó" msgid "One of this, (.*) must be specified\\." msgstr "Um desse, (.*) deve ser especificado\\." msgid "Overview" msgstr "Visão Geral" msgid "PXE Enabled" msgstr "PXE Ativado" msgid "PXE enabled" msgstr "PXE ativado" msgid "Persistent" msgstr "Persistente" msgid "Port successfully created" msgstr "Porta criada com sucesso" msgid "Portgroup" msgstr "Grupo de Portas" msgid "Portgroup successfully created" msgstr "Grupo de portas criado com sucesso" msgid "Portgroup that this port belongs to" msgstr "Grupo de Portas ao qual essa porta pertence" msgid "Portgroups" msgstr "Grupos de Portas" msgid "Ports" msgstr "Portas" msgid "Power State" msgstr "Estado de energia" msgid "Power off" msgstr "Desligar" msgid "Power on" msgstr "Ligar" msgid "Properties" msgstr "Propriedades" msgid "Property Name" msgstr "Nome da Propriedade" msgid "Provide a list of cleaning steps in JSON format" msgstr "Forneça uma lista de passos de limpeza no formato JSON" msgid "" "Provide a reason for why you are putting the selected node(s) into " "maintenance mode (optional)" msgstr "" "Forneça uma razão pela qual você está colocando o(s) nó(s) selecionado(s) em " "modo de manutenção (opcional)" msgid "Provision State" msgstr "Estado de Provisão" msgid "Provisioning State" msgstr "Estado de Provisionamento" msgid "Provisioning Status" msgstr "Estado de Provisionamento" msgid "Put Node(s) Into Maintenance Mode" msgstr "Colocar Nó(s) em Modo de Manutenção" msgid "RAID Level" msgstr "Nível de RAID" msgid "Ramdisk" msgstr "Ramdisk" msgid "Reason" msgstr "Motivo" msgid "Reboot" msgstr "Reiniciar" msgid "Refresh" msgstr "Atualizar" msgid "Refresh page to see set boot device" msgstr "" "Atualize a página para visualizar o dispositivo de inicialização definido." msgid "Refresh page to see updated console details" msgstr "Atualize a página para ver os detalhes atualizados do console" msgid "Refresh page to see updated power status" msgstr "Atualize a página para visualizar o estado de energia atualizado" msgid "Refresh page." msgstr "Atualizar página." msgid "Required" msgstr "Obrigatório" msgid "Reservation" msgstr "Reserva" msgid "Resource Class" msgstr "Classe de Recurso" msgid "Root GB" msgstr "GB Raiz" msgid "Root Volume" msgstr "Volume Raiz" msgid "Root Volume." msgstr "Volume Raiz." msgid "SSH Address" msgstr "Endereço SSH" msgid "SSH Key Contents" msgstr "Conteúdo da chave SSH" msgid "SSH Key File" msgstr "Arquivo de Chave SSH" msgid "SSH Password" msgstr "Senha SSH" msgid "SSH Port" msgstr "Porta SSH" msgid "SSH Username" msgstr "Nome de usuário SSH" msgid "SSH terminal port" msgstr "Porta de terminal SSH" msgid "Select a Driver" msgstr "Selecione um Driver" msgid "Select a boot device" msgstr "Selecionar dispositivo de boot" msgid "Select a portgroup" msgstr "Selecione um grupo de portas" msgid "Set Boot Device" msgstr "Configurar o Dispositivo de Boot" msgid "Set RAID Configuration" msgstr "Definir Configuração RAID" msgid "Set Target RAID Config" msgstr "Definir Configuração Alvo de RAID" msgid "Size GB" msgstr "Tamanho GB" msgid "Soft power off" msgstr "Desligamento suave" msgid "Soft reboot" msgstr "Reinicialização simples" msgid "Specifies RAID Level." msgstr "Especifica o Nível de RAID." msgid "Specifies logical disk size in GiB. Required." msgstr "Especifique o tamanho lógico de disco em GiB. Obrigatório." msgid "" "Specifies whether ports in this portgroup can be used as standalone ports." msgstr "" "Especifica se portas nesse grupo de portas podem ser utilizadas como portas " "autônomas." msgid "Specifies whether root volume or not." msgstr "Especifica se é um volume raiz ou não" msgid "Standalone Ports Supported" msgstr "Portas Autônomas Suportadas" msgid "Storage Interface" msgstr "Interface de Storage" msgid "Submit" msgstr "Enviar" #, python-format msgid "Successfully deleted node \"%s\"" msgid_plural "Successfully deleted nodes \"%s\"" msgstr[0] "Nó excluído com sucesso \"%s\"" msgstr[1] "Nós excluídos com sucesso \"%s\"" #, python-format msgid "Successfully deleted port \"%s\"" msgid_plural "Successfully deleted ports \"%s\"" msgstr[0] "Porta excluída com sucesso \"%s\"" msgstr[1] "Portas excluídas com sucesso \"%s\"" #, python-format msgid "Successfully deleted portgroup \"%s\"" msgid_plural "Successfully deleted portgroups \"%s\"" msgstr[0] "Grupo de Portas \"%s\" excluído com sucesso" msgstr[1] "Grupos de Portas \"%s\" excluído com sucesso" #, python-format msgid "Successfully updated node %s" msgstr "Nó atualizado com sucesso %s" #, python-format msgid "Successfully updated port %s" msgstr "Porta atualizada com sucesso %s" #, python-format msgid "Successfully updated portgroup %s" msgstr "Atualização com sucesso do grupo de portas %s" msgid "Target Power State" msgstr "Estado de Energia Alvo" msgid "Target Provision State" msgstr "Estado de Provisão Alvo" msgid "" "This field is disabled because a port cannot have any connectivity " "attributes (pxe_enabled, local_link_connection, portgroup_id) updated unless " "its associated node is in an enroll, inspecting, mangeable state; or in " "maintenance mode." msgstr "" "Esse campo está desativado porque uma porta não pode ter quaisquer atributos " "de conectividade (pxe_enabled, local_link_connection, portgroup_id) " "atualizado a menos que seu nó associado esteja em um estado de inscrição, " "inspeção, gerenciamento; ou em modo de manutenção." msgid "UUID" msgstr "UUID" msgid "Unable to create node update patch." msgstr "Não é possível criar patch de atualização do nó" #, python-format msgid "Unable to create node: %s" msgstr "Não foi possível criar o nó: %s" msgid "Unable to create port update patch." msgstr "Não é possível criar patch de atualização de porta" #, python-format msgid "Unable to create port: %s" msgstr "Não foi possível criar a porta: %s" msgid "Unable to create portgroup update patch." msgstr "Não é possível criar patch de atualização de grupo de portas" #, python-format msgid "Unable to create portgroup: %s" msgstr "Não é possível criar o grupo de portas: %s" #, python-format msgid "Unable to delete node \"%s\"" msgid_plural "Unable to delete nodes \"%s\"" msgstr[0] "Não foi possível excluir o nó \"%s\"" msgstr[1] "Não foi possível excluir os nós \"%s\"" #, python-format msgid "Unable to delete node %s: %s" msgstr "Não foi possível excluir o nó %s: %s" #, python-format msgid "Unable to delete port \"%s\"" msgid_plural "Unable to delete ports \"%s\"" msgstr[0] "Não foi possível excluir a porta\"%s\"" msgstr[1] "Não foi possível excluir as portas\"%s\"" #, python-format msgid "Unable to delete port: %s" msgstr "Não foi possível excluir a porta: %s" #, python-format msgid "Unable to delete portgroup \"%s\"" msgid_plural "Unable to delete portgroups \"%s\"" msgstr[0] "Não é possível excluir o grupo de portas \"%s\"" msgstr[1] "Não é possível excluir os grupos de portas \"%s\"" #, python-format msgid "Unable to delete portgroup: %s" msgstr "Não é possível excluir o grupo de portas: %s" #, python-format msgid "Unable to get console for node %s: %s" msgstr "Não é possível obter o console para o nó %s: %s" #, python-format msgid "Unable to inject NMI: %s" msgstr "Não foi possível injetar NMI: %s" #, python-format msgid "Unable to power off the node: %s" msgstr "Não foi possível desligar o nó: %s" #, python-format msgid "Unable to retrieve Ironic drivers: %s" msgstr "Não foi possível recuperar os drivers do Ironic: %s" #, python-format msgid "Unable to retrieve Ironic node portgroups: %s" msgstr "Não é possível recuperar o grupo de portas do nó Ironic: %s" #, python-format msgid "Unable to retrieve Ironic nodes. %s" msgstr "Não foi possível recuperar os nós do Ironic. %s" #, python-format msgid "Unable to retrieve boot device for Ironic node. %s" msgstr "" "Não foi possível recuperar o dispositivo de inicialização para o nó do " "Ironic. %s" #, python-format msgid "Unable to retrieve driver properties: %s" msgstr "Não foi possível recuperar as propriedades do driver: %s" #, python-format msgid "Unable to retrieve portgroup ports: %s" msgstr "Não é possível obter as portas do grupo de portas: %s" #, python-format msgid "Unable to retrieve supported boot devices for Ironic node. %s" msgstr "" "Não foi possível recuperar dispositivos de inicialização suportados para o " "nó do Ironic. %s" #, python-format msgid "Unable to retrieve the Ironic node ports: %s" msgstr "Não foi possível recuperar as portas do nó do Ironic: %s" #, python-format msgid "Unable to retrieve the Ironic node: %s" msgstr "Não foi possível recuperar o nó do Ironic: %s" #, python-format msgid "Unable to set Ironic node %s maintenance state: %s" msgstr "" "Não foi possível configurar o nó %s do Ironic para estado de manutenção: %s" #, python-format msgid "Unable to set boot device: %s" msgstr "Não foi possível definir o dispositivo de inicialização: %s" #, python-format msgid "Unable to set console mode: %s" msgstr "Não é possível configurar o modo console: %s" #, python-format msgid "Unable to set node provision state: %s" msgstr "Não foi possível definir o estado de provisionamento do nó: %s" #, python-format msgid "Unable to set raid config: %s" msgstr "Não foi possível realizar a configuração do raid: %s" #, python-format msgid "Unable to update node %s: %s" msgstr "Não é possível atualizar o nó %s: %s" #, python-format msgid "Unable to update port %s: %s" msgstr "Não foi possível atualizar a porta %s: %s" #, python-format msgid "Unable to update portgroup %s: %s" msgstr "Não é possível atualizar o grupo de portas %s: %s" #, python-format msgid "Unable to validate node %s: %s" msgstr "Não foi possível validar o nó %s: %s" msgid "Unable to validate the JSON input" msgstr "Não é possível validar o JSON de entrada" msgid "Update Node" msgstr "Atualizar Nó" msgid "Update Port" msgstr "Atualizar Porta" msgid "Update Portgroup" msgstr "Atualizar Grupo de Portas" msgid "Updated At" msgstr "Atualizado em" msgid "Valid" msgstr "Válido" msgid "Virtualization Software" msgstr "Software de Virtualização" msgid "default (?:value )?is ([^\"\\. ]+|\"[^\"]+\")" msgstr "padrão (?:value )? está ([^\"\\. ]+|\"[^\"]+\")" ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.88151 ironic-ui-6.3.0/ironic_ui/locale/ru/0000775000175000017500000000000000000000000017306 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.89351 ironic-ui-6.3.0/ironic_ui/locale/ru/LC_MESSAGES/0000775000175000017500000000000000000000000021073 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/locale/ru/LC_MESSAGES/djangojs.po0000664000175000017500000002272700000000000023244 0ustar00zuulzuul00000000000000# Ilya Alekseyev , 2015. #zanata # OpenStack Infra , 2015. #zanata # Alexander , 2016. #zanata # Andreas Jaeger , 2016. #zanata # Fedor Tarasenko , 2016. #zanata # Alexander , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: ironic-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-15 09:55+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-02-03 10:49+0000\n" "Last-Translator: Alexander \n" "Language-Team: Russian\n" "Language: ru\n" "X-Generator: Zanata 4.3.3\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" msgid " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgstr " ([^\" ]+|\"[^\"]+\") \\(По умолчанию\\)" msgid "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" msgstr "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" #, python-format msgid "A request has been made to change the provisioning state of node %s" msgstr "Запрос был создал для изменения состояния подготовки узла %s" msgid "A unique node name. Optional." msgstr "Уникальное имя узла. Необязательный параметр." msgid "Actions" msgstr "Действия" #, fuzzy, python-format msgid "" "Are you sure you want to delete node \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete nodes \"%s\"? This action cannot be undone." msgstr[0] "" "Вы действительно хотите удалить узел \"%s\"? Это действие не может быть " "отменено." msgstr[1] "" msgstr[2] "" #, fuzzy, python-format msgid "" "Are you sure you want to delete port \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete ports \"%s\"? This action cannot be undone." msgstr[0] "" "Вы действительно хотите удалить порт \"%s\"? Это действие не может быть " "отменено." msgstr[1] "" msgstr[2] "" msgid "Cancel" msgstr "Отмена" msgid "Chassis ID" msgstr "ID устройства" msgid "Choose an Image" msgstr "Выберите образ" msgid "Configuration" msgstr "Конфигурация" msgid "Console Enabled" msgstr "Консоль активирована" msgid "Create Port" msgstr "Создать порт" msgid "Created At" msgstr "Создано" msgid "Defaults to ([^\"\\. ]+|\"[^\"]+\")" msgstr "По умолчанию ([^\"\\. ]+|\"[^\"]+\")" #, fuzzy msgid "Delete Node" msgid_plural "Delete Nodes" msgstr[0] "Удалить узел" msgstr[1] "" msgstr[2] "" msgid "Delete Nodes" msgstr "Удалить узлы" #, fuzzy msgid "Delete Port" msgid_plural "Delete Ports" msgstr[0] "Удалить порт" msgstr[1] "" msgstr[2] "" msgid "Delete Ports" msgstr "Удалить порты" msgid "Deploy Kernel" msgstr "Развернуть ядро" msgid "Deploy Ramdisk" msgstr "Развернуть Ramdisk" msgid "Driver" msgstr "Драйвер" msgid "Driver Details" msgstr "Детали дравера" msgid "Driver Info" msgstr "Информация о драйвере" msgid "Edit" msgstr "Редактировать" msgid "Edit Node" msgstr "Редактировать узел" msgid "Enroll Node" msgstr "Зарегистрировать узел" msgid "Extra" msgstr "Дополнительно" msgid "Extras" msgstr "Дополнительно" msgid "General" msgstr "Общее" msgid "Inspection Finished At" msgstr "Проверка закончилась в" msgid "Inspection Started At" msgstr "Проверка началась в" msgid "Instance ID" msgstr "ID инстанса" msgid "Instance Info" msgstr "Информация об инстансе" msgid "Instance Name" msgstr "Имя инстанса" msgid "Kernel" msgstr "Ядро" msgid "Last Error" msgstr "Последняя ошибка" msgid "MAC Address" msgstr "MAC адрес" msgid "MAC address" msgstr "MAC адрес" msgid "MAC address for this port. Required." msgstr "MAC адрес для этого порта. Обязательный параметр." msgid "Maintenance" msgstr "Техническое обслуживание" msgid "Maintenance Reason" msgstr "Причина технического обслуживания" msgid "Name" msgstr "Имя" msgid "No Instance" msgstr "Нет инстанса" msgid "No network ports have been defined" msgstr "Сетевые порты не были заданы" msgid "Node" msgstr "Узел" msgid "Node Driver" msgstr "Драйвер узла" msgid "Node ID" msgstr "ID узла" msgid "Node Info" msgstr "Информация об узле" msgid "Node Name" msgstr "Имя узла" msgid "One of this, (.*) must be specified\\." msgstr "Один из этих, (.*) должен быть определен\\." msgid "Overview" msgstr "Обзор" msgid "Port successfully created" msgstr "Порт создан успешно" msgid "Ports" msgstr "Порты" msgid "Power State" msgstr "Состояние" msgid "Power off" msgstr "Выключить" msgid "Power on" msgstr "Включить" msgid "Properties" msgstr "Свойства" msgid "Property Name" msgstr "Имя свойства" msgid "" "Provide a reason for why you are putting the selected node(s) into " "maintenance mode (optional)" msgstr "" "Опишите причину по которой вы переводите выбранные узлы в режим обслуживания " "(необязательно)" msgid "Provision State" msgstr "Статус развертывания" msgid "Provisioning State" msgstr "Статус развертывания" msgid "Provisioning Status" msgstr "Статус развертывания" msgid "Put Node(s) Into Maintenance Mode" msgstr "Перевести узел (узлы) в режим обслуживания" msgid "Ramdisk" msgstr "Ramdisk" msgid "Refresh" msgstr "Обновить" msgid "Refresh page to see updated power status" msgstr "Обновите страницу чтобы увидеть обновленный статус питания" msgid "Required" msgstr "Обязательно" msgid "Reservation" msgstr "Резервация" msgid "SSH Port" msgstr "Порт SSH" msgid "SSH Username" msgstr "Имя пользователя SSH" msgid "Select a Driver" msgstr "Выберите драйвер" msgid "Submit" msgstr "Отправить" #, fuzzy, python-format msgid "Successfully deleted node \"%s\"" msgid_plural "Successfully deleted nodes \"%s\"" msgstr[0] "Узел \"%s\" успешно удален" msgstr[1] "" msgstr[2] "" #, fuzzy, python-format msgid "Successfully deleted port \"%s\"" msgid_plural "Successfully deleted ports \"%s\"" msgstr[0] "Порт \"%s\" успешно удален" msgstr[1] "" msgstr[2] "" #, python-format msgid "Successfully updated node %s" msgstr "Узел %s успешно обновлен" msgid "Target Power State" msgstr "Целевое состояние" msgid "Target Provision State" msgstr "Целевой статус развертывания" msgid "UUID" msgstr "UUID" msgid "Unable to create node update patch." msgstr "Невозможно создать патч обновления узла." #, python-format msgid "Unable to create node: %s" msgstr "Невозможно создать узел: %s" #, python-format msgid "Unable to create port: %s" msgstr "Невозможно создать порт: %s" #, fuzzy, python-format msgid "Unable to delete node \"%s\"" msgid_plural "Unable to delete nodes \"%s\"" msgstr[0] "Невозможно удалить узел \"%s\"" msgstr[1] "" msgstr[2] "" #, python-format msgid "Unable to delete node %s: %s" msgstr "Невозможно удалить узел %s: %s" #, fuzzy, python-format msgid "Unable to delete port \"%s\"" msgid_plural "Unable to delete ports \"%s\"" msgstr[0] "Невозможно удалить порт \"%s\"" msgstr[1] "" msgstr[2] "" #, python-format msgid "Unable to delete port: %s" msgstr "Невозможно удалить порт: %s" #, python-format msgid "Unable to power off the node: %s" msgstr "Невозможно выключить узел: %s" #, python-format msgid "Unable to retrieve Ironic drivers: %s" msgstr "Невозможно получить драйвера Ironic: %s" #, python-format msgid "Unable to retrieve driver properties: %s" msgstr "Невозможно получить свойства драйвера: %s" #, python-format msgid "Unable to retrieve the Ironic node ports: %s" msgstr "Невозможно получить порты узла Ironic: %s" #, python-format msgid "Unable to retrieve the Ironic node: %s" msgstr "Невозможно получить узел Ironic: %s" #, python-format msgid "Unable to set node provision state: %s" msgstr "Не удается установить состояние подготовки узла: %s" #, python-format msgid "Unable to update node %s: %s" msgstr "Невозможно обновить узел %s: %s" msgid "Update Node" msgstr "Обновить узел" msgid "Updated At" msgstr "Обновлено" msgid "default (?:value )?is ([^\"\\. ]+|\"[^\"]+\")" msgstr "По умолчанию (?:value )? - ([^\"\\. ]+|\"[^\"]+\")" ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.88151 ironic-ui-6.3.0/ironic_ui/locale/tr_TR/0000775000175000017500000000000000000000000017712 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.89351 ironic-ui-6.3.0/ironic_ui/locale/tr_TR/LC_MESSAGES/0000775000175000017500000000000000000000000021477 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/locale/tr_TR/LC_MESSAGES/djangojs.po0000664000175000017500000004103300000000000023637 0ustar00zuulzuul00000000000000# Mücahit Büyükyılmaz , 2015. #zanata # OpenStack Infra , 2015. #zanata # Andreas Jaeger , 2016. #zanata # Mücahit Büyükyılmaz , 2016. #zanata # işbaran akçayır , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: ironic-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-15 09:55+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-09-16 08:03+0000\n" "Last-Translator: işbaran akçayır \n" "Language-Team: Turkish (Turkey)\n" "Language: tr_TR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Zanata 4.3.3\n" "X-POOTLE-MTIME: 1495454551.000000\n" msgid " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgstr " ([^\" ]+|\"[^\"]+\") \\(Öntanımlı\\)" msgid "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" msgstr "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" #, python-format msgid "A request has been made to change the provisioning state of node %s" msgstr "%s düğümünün hazırlık durumnda bir değişklik yapılması isteği geldi" msgid "Abort cleaning" msgstr "Temizliği iptal et" msgid "Actions" msgstr "İşlemler" msgid "Add Extra" msgstr "Ek Ekle" msgid "Add Instance Property" msgstr "Sunucu Özelliği Ekle" msgid "Add Property" msgstr "Özellik Ekle" #, python-format msgid "" "Are you sure you want to delete node \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete nodes \"%s\"? This action cannot be undone." msgstr[0] "" "\"%s\" düğümünü silmek istediğinize emin misiniz? Bu eylem geri alınamaz." msgstr[1] "" "\"%s\" düğümlerini silmek istediğinize emin misiniz? Bu eylem geri alınamaz." #, python-format msgid "" "Are you sure you want to delete port \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete ports \"%s\"? This action cannot be undone." msgstr[0] "" "\"%s\" bağlantı noktasını silmek istediğinize emin misiniz? Bu eylem geri " "alınamaz." msgstr[1] "" "\"%s\" bağlantı noktalarını silmek istediğinize emin misiniz? Bu eylem geri " "alınamaz." #, python-format msgid "" "Are you sure you want to delete portgroup \"%s\"? This action cannot be " "undone." msgid_plural "" "Are you sure you want to delete portgroups \"%s\"? This action cannot be " "undone." msgstr[0] "" "\"%s\" bağlantı noktası grubunu silmek istediğinize emin misiniz? Bu eylem " "geri getirilemez." msgstr[1] "" "\"%s\" bağlantı noktası gruplarını silmek istediğinize emin misiniz? Bu " "eylem geri getirilemez." msgid "Attributes" msgstr "Öznitelikler" msgid "Boot Device" msgstr "Önyükleme Aygıtı" msgid "Cancel" msgstr "İptal" msgid "Chassis ID" msgstr "Şasi ID'si" msgid "Choose an Image" msgstr "Bir İmaj seçin" msgid "Clean" msgstr "Temizle" msgid "Clean Node" msgstr "Düğümü Temizle" msgid "Clean Step" msgstr "Temizlik Adımı" msgid "Clean node" msgstr "Düğümü sil" msgid "Clean steps should be an non-empty array" msgstr "Temizlik adımları boş-olmayan bir dizi olmalı" msgid "Click link to view console" msgstr "Konsolu görüntülemek için bağlantıya tıklayın" msgid "Configuration" msgstr "Yapılandırma" msgid "Console Enabled" msgstr "Konsol Etkin" msgid "Console Info." msgstr "Konsol Bilgisi." msgid "Create Port" msgstr "Bağlantı Noktası Oluştur" msgid "Create Portgroup" msgstr "Bağlantı Noktası Grubu Oluştur" msgid "Created At" msgstr "Oluşturulduğu zaman" msgid "Current Interface" msgstr "Mevcut Arayüz" msgid "Defaults to ([^\"\\. ]+|\"[^\"]+\")" msgstr "Öntanımlı olarak ([^\"\\. ]+|\"[^\"]+\")" msgid "Delete Node" msgid_plural "Delete Nodes" msgstr[0] "Düğümü Sil" msgstr[1] "Düğümleri Sil" msgid "Delete Port" msgid_plural "Delete Ports" msgstr[0] "Bağlantı Noktasını Sil" msgstr[1] "Bağlantı Noktalarını Sil" msgid "Delete Portgroup" msgid_plural "Delete Portgroups" msgstr[0] "Bağlantı Noktası Grubunu Sil" msgstr[1] "Bağlantı Noktası Gruplarını Sil" msgid "Deploy Kernel" msgstr "Çekirdeği Yerleştir" msgid "Deploy Ramdisk" msgstr "Ramdisk'i Yerleştir" msgid "Device" msgstr "Aygıt" msgid "Driver" msgstr "Sürücü" msgid "Driver Details" msgstr "Sürücü Ayrıntıları" msgid "Driver Info" msgstr "Sürücü Bilgisi" msgid "Driver Validation" msgstr "Sürücü Onaylama" msgid "" "Each cleaning step must be an object that contains \"interface\" and \"step" "\" properties" msgstr "" "Her temizlik adımı \"arayüz\" ve \"adım\" özelliklerinden birini içeren " "nesne olmalı" msgid "Edit Node" msgstr "Düğümü Düzenle" msgid "Edit Port" msgstr "Bağlantı Noktasını Düzenle" msgid "Edit Portgroup" msgstr "Bağlantı Noktası Grubunu Düzenle" msgid "Enroll Node" msgstr "Düğümü Kaydet" msgid "Extra" msgstr "Ek" msgid "Extra Property Name" msgstr "Ek Özellik İsmi" msgid "Extras" msgstr "Ekler" msgid "General" msgstr "Genel" msgid "Image Source" msgstr "İmaj Kaynağı" msgid "Indicates whether this port should be used when PXE booting this node" msgstr "" "Bu düğüm PXE önyüklenirken bu bağlantı noktasının kullanılıp " "kullanılmayacağını gösterir" msgid "Inspect" msgstr "İncele" msgid "Inspection Finished At" msgstr "İnceleme Şu Anda Bitti" msgid "Inspection Started At" msgstr "İnceleme Şu Anda Başlatıldı" msgid "Instance ID" msgstr "Instance ID" msgid "Instance Info" msgstr "Sunucu Bilgisi" msgid "Instance Name" msgstr "Instance Adı" msgid "Instance Property Name" msgstr "Sunucu Özellik İsmi" msgid "Interface" msgstr "Arayüz" msgid "Kernel" msgstr "Çekirdek" msgid "Last Error" msgstr "Son Hata" msgid "" "Linux portgroup mode. For possible values refer to https://www.kernel.org/" "doc/Documentation/networking/bonding.txt" msgstr "" "Linux bağlantı noktası grubu kipi. Muhtemel değerler için https://www.kernel." "org/doc/Documentation/networking/bonding.txt adresine başvurun" msgid "Local Link Connection" msgstr "Yerel Ağ Bağlantısı" msgid "Local link connection" msgstr "Yerel bağlantı" msgid "MAC Address" msgstr "MAC Adresi" msgid "MAC address" msgstr "MAC adresi" msgid "MAC address for this port. Required." msgstr "Bu bağlantı noktası için MAC adresi. Gerekli." msgid "MAC address for this portgroup." msgstr "Bu bağlantı noktası grubu için MAC adresi." msgid "MAC address or OpenFlow datapath ID" msgstr "MAC adresi veya OpenFlow veriyolu ID'si" msgid "Maintenance" msgstr "Bakım" msgid "Maintenance Reason" msgstr "Bakım Sebebi" msgid "Mode" msgstr "Kip" msgid "Move to" msgstr "Taşı" msgid "Name" msgstr "İsim" msgid "Name for the portgroup." msgstr "Bağlantı noktası grubu için isim." msgid "Network Interface" msgstr "Ağ Arayüzü" msgid "No Instance" msgstr "Sunucu Yok" msgid "No network ports have been defined" msgstr "Hiçbir ağ bağlantı noktası tanımlanmamış" msgid "No portgroups have been defined" msgstr "Herhangi bir bağlantı noktası grubu tanımlanmamış" msgid "No reason given." msgstr "Sebep verilmemiş." msgid "Node" msgstr "Düğüm" #, python-format msgid "Node %s is already in target maintenance state." msgstr "Düğüm %s zaten hedef bakım durumunda." msgid "Node Driver" msgstr "Düğüm Sürücüsü" msgid "Node ID" msgstr "Düğüm Kimliği" msgid "Node Info" msgstr "Düğüm Bilgisi" msgid "Node Name" msgstr "Düğüm İsmi" msgid "One of this, (.*) must be specified\\." msgstr "Bunlardan biri, (.*) belirtilmeli\\." msgid "Overview" msgstr "Önizleme" msgid "PXE Enabled" msgstr "PXE Etkin" msgid "PXE enabled" msgstr "PXE etkin" msgid "Persistent" msgstr "Kalıcı" msgid "Port successfully created" msgstr "Bağlantı noktası başarıyla oluşturuldu" msgid "Portgroup" msgstr "Bağlantı noktası grubu" msgid "Portgroup successfully created" msgstr "Bağlantı noktası grubu başarıyla oluşturuldu" msgid "Portgroup that this port belongs to" msgstr "Bu bağlantı noktasının ait olduğu bağlantı noktası grubu" msgid "Portgroups" msgstr "Bağlantı noktası grupları" msgid "Ports" msgstr "Portlar" msgid "Power State" msgstr "Güç Durumu" msgid "Power off" msgstr "Güç kapa" msgid "Power on" msgstr "Güç aç" msgid "Properties" msgstr "Özellikler" msgid "Property Name" msgstr "Özellik İsmi" msgid "Provide a list of cleaning steps in JSON format" msgstr "JSON biçiminde temizlik adımları listesi sağlayın" msgid "" "Provide a reason for why you are putting the selected node(s) into " "maintenance mode (optional)" msgstr "" "Seçili düğüm(ler)i neden bakım kipine soktuğunuzla ilgili bir sebep verin " "(isteğe bağlı)" msgid "Provision State" msgstr "Hazırlık Durumu" msgid "Provisioning State" msgstr "Hazırlık Durumu" msgid "Provisioning Status" msgstr "Hazırlık Durumu" msgid "Put Node(s) Into Maintenance Mode" msgstr "Düğüm(ler)i Bakım Kipine Sok" msgid "Ramdisk" msgstr "Ramdisk" msgid "Reason" msgstr "Sebep" msgid "Reboot" msgstr "Yeniden başlat" msgid "Refresh" msgstr "Tazele" msgid "Refresh page to see set boot device" msgstr "Önyükleme aygıtı ayarlamayı görmek için sayfayı tazeleyin" msgid "Refresh page to see updated console details" msgstr "Güncel konsol ayrıntılarını görmek için sayfayı tazeleyin" msgid "Refresh page to see updated power status" msgstr "Güncel güç durumunu görmek için sayfayı tazeleyin" msgid "Required" msgstr "Gerekli" msgid "Reservation" msgstr "Yer ayırmalar" msgid "Resource Class" msgstr "Kaynak Sınıfı" msgid "Root GB" msgstr "Kök GB" msgid "SSH Address" msgstr "SSH Adresi" msgid "SSH Key Contents" msgstr "SSH Anahtar İçeriği" msgid "SSH Key File" msgstr "SSH Anahtar Dosyası" msgid "SSH Password" msgstr "SSH Parolası" msgid "SSH Port" msgstr "SSH Bağlantı Noktası" msgid "SSH Username" msgstr "SSH Kullanıcı adı" msgid "SSH terminal port" msgstr "SSH terminal bağlantı noktası" msgid "Select a Driver" msgstr "Bir Sürücü Seçin" msgid "Select a boot device" msgstr "Bir önyükleme aygıtı seçin" msgid "Select a portgroup" msgstr "Bir bağlantı noktası grubu seçin" msgid "Set Boot Device" msgstr "Önyükleme Aygıtı Ayarla" msgid "Soft power off" msgstr "Yumuşak güç kapa" msgid "Soft reboot" msgstr "Yumuşak yeniden başlatma" msgid "" "Specifies whether ports in this portgroup can be used as standalone ports." msgstr "" "Bu bağlantı noktası grubundaki bağlantı noktalarının bağımsız bağlantı " "noktaları olarak kullanılıp kullanılamayacağını belirtir." msgid "Standalone Ports Supported" msgstr "Bağımsız Bağlantı Noktaları Destekleniyor" msgid "Submit" msgstr "Gönder" #, python-format msgid "Successfully deleted node \"%s\"" msgid_plural "Successfully deleted nodes \"%s\"" msgstr[0] "\"%s\" düğümü başarıyla silindi." msgstr[1] "\"%s\" düğümleri başarıyla silindi." #, python-format msgid "Successfully deleted port \"%s\"" msgid_plural "Successfully deleted ports \"%s\"" msgstr[0] "\"%s\" bağlantı noktası başarıyla silindi" msgstr[1] "\"%s\" bağlantı noktaları başarıyla silindi" #, python-format msgid "Successfully deleted portgroup \"%s\"" msgid_plural "Successfully deleted portgroups \"%s\"" msgstr[0] "\"%s\" bağlantı noktası grubu başarıyla silindi" msgstr[1] "\"%s\" bağlantı noktası grupları başarıyla silindi" #, python-format msgid "Successfully updated node %s" msgstr "Düğüm %s başarıyla güncellendi" #, python-format msgid "Successfully updated port %s" msgstr "Bağlantı noktası %s başarıyla güncellendi" #, python-format msgid "Successfully updated portgroup %s" msgstr "Bağlantı noktası grubu %s başarıyla güncellendi" msgid "Target Power State" msgstr "Hedef Güç Durumu" msgid "Target Provision State" msgstr "Hedef Hazırlık Durumu" msgid "" "This field is disabled because a port cannot have any connectivity " "attributes (pxe_enabled, local_link_connection, portgroup_id) updated unless " "its associated node is in an enroll, inspecting, mangeable state; or in " "maintenance mode." msgstr "" "Bu alan kapalı çünkü bağlantı noktası bağlanırlık öznitelikleri " "(pxe_enabled, local_link_connection, portgroup_id), ilişkili düğümü kayıt, " "inceleme, yönetilir durum; veya bakım kipinde olmadan güncellenemez." msgid "UUID" msgstr "UUID" msgid "Unable to create node update patch." msgstr "Düğüm güncelleme yaması oluşturulamadı." #, python-format msgid "Unable to create node: %s" msgstr "Düğüm oluşturulamıyor: %s" msgid "Unable to create port update patch." msgstr "Bağlantı noktası güncelleme yaması oluşturulamadı." #, python-format msgid "Unable to create port: %s" msgstr "Bağlantı noktası oluşturulamıyor: %s" msgid "Unable to create portgroup update patch." msgstr "Bağlantı noktası grubu güncelleme yaması oluşturulamadı." #, python-format msgid "Unable to create portgroup: %s" msgstr "Bağlantı noktası grubu oluşturulamadı: %s" #, python-format msgid "Unable to delete node \"%s\"" msgid_plural "Unable to delete nodes \"%s\"" msgstr[0] "\"%s\" düğümü silinemedi" msgstr[1] "\"%s\" düğümleri silinemedi" #, python-format msgid "Unable to delete node %s: %s" msgstr "Düğüm %s silinemiyor: %s" #, python-format msgid "Unable to delete port \"%s\"" msgid_plural "Unable to delete ports \"%s\"" msgstr[0] "\"%s\" bağlantı noktası silinemiyor" msgstr[1] "\"%s\" bağlantı noktaları silinemiyor" #, python-format msgid "Unable to delete port: %s" msgstr "Bağlantı noktası silinemiyor: %s" #, python-format msgid "Unable to delete portgroup \"%s\"" msgid_plural "Unable to delete portgroups \"%s\"" msgstr[0] "\"%s\" bağlantı noktası grubu silinemedi" msgstr[1] "\"%s\" bağlantı noktası grupları silinemedi" #, python-format msgid "Unable to delete portgroup: %s" msgstr "Bağlantı noktası grubu silinemedi: %s" #, python-format msgid "Unable to get console for node %s: %s" msgstr "Düğüm %s için konsol alınamadı: %s" #, python-format msgid "Unable to power off the node: %s" msgstr "Düğümün gücü kesilemiyor: %s" #, python-format msgid "Unable to retrieve Ironic drivers: %s" msgstr "Ironic sürücüleri alınamıyor: %s" #, python-format msgid "Unable to retrieve Ironic node portgroups: %s" msgstr "Ironic düğümü bağlantı noktası grupları alınamadı: %s" #, python-format msgid "Unable to retrieve Ironic nodes. %s" msgstr "Ironic düğümler alınamadı. %s" #, python-format msgid "Unable to retrieve boot device for Ironic node. %s" msgstr "Ironic düğüm için ön yükleme aygıtı alınamadı. %s" #, python-format msgid "Unable to retrieve driver properties: %s" msgstr "Sürücü özellikleri alınamıyor: %s" #, python-format msgid "Unable to retrieve portgroup ports: %s" msgstr "Bağlantı noktası grubu bağlantı noktaları alınamadı: %s" #, python-format msgid "Unable to retrieve supported boot devices for Ironic node. %s" msgstr "Ironic düğümü için desteklenen ön yükleme aygıtları alınamadı. %s" #, python-format msgid "Unable to retrieve the Ironic node ports: %s" msgstr "Ironic düğümü bağlantı noktaları alınamadı: %s" #, python-format msgid "Unable to retrieve the Ironic node: %s" msgstr "Ironic düğümü alınamadı: %s" #, python-format msgid "Unable to set Ironic node %s maintenance state: %s" msgstr "Ironic düğümü %s bakım durumuna ayarlanamadı: %s" #, python-format msgid "Unable to set boot device: %s" msgstr "Önyükleme aygıtı ayarlanamadı: %s" #, python-format msgid "Unable to set console mode: %s" msgstr "Konsol kipi ayarlanamıyor: %s" #, python-format msgid "Unable to set node provision state: %s" msgstr "Düğüm hazırlık durumu ayarlanamıyor: %s" #, python-format msgid "Unable to update node %s: %s" msgstr "Düğüm %s güncellenemedi: %s" #, python-format msgid "Unable to update port %s: %s" msgstr "Bağlantı noktası %s güncellenemiyor: %s" #, python-format msgid "Unable to update portgroup %s: %s" msgstr "%s bağlantı noktası grubu güncellenemedi: %s" #, python-format msgid "Unable to validate node %s: %s" msgstr "Düğüm %s onaylanamıyor: %s" msgid "Unable to validate the JSON input" msgstr "JSON girdisi onaylanamadı" msgid "Update Node" msgstr "Düğümü Güncelle" msgid "Update Port" msgstr "Bağlantı Noktasını Güncelle" msgid "Update Portgroup" msgstr "Bağlantı Noktası Grubunu Güncelle" msgid "Updated At" msgstr "Güncelleme saati" msgid "Valid" msgstr "Geçerli" msgid "Virtualization Software" msgstr "Sanallaştırma Yazılımı" msgid "default (?:value )?is ([^\"\\. ]+|\"[^\"]+\")" msgstr "öntanımlı (?:değer )? ([^\"\\. ]+|\"[^\"]+\")" ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.88151 ironic-ui-6.3.0/ironic_ui/locale/zh_Hans/0000775000175000017500000000000000000000000020252 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.89351 ironic-ui-6.3.0/ironic_ui/locale/zh_Hans/LC_MESSAGES/0000775000175000017500000000000000000000000022037 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/locale/zh_Hans/LC_MESSAGES/django.po0000664000175000017500000000144300000000000023643 0ustar00zuulzuul00000000000000# Shengjing Zhu , 2016. #zanata # Franco Tseng , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: ironic-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2021-01-24 09:54+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-03-30 01:32+0000\n" "Last-Translator: Franco Tseng \n" "Language-Team: Chinese (China)\n" "Language: zh_CN\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "Admin" msgstr "管理员" msgid "Ironic Bare Metal Provisioning" msgstr "裸金属 Ironic 配置向导" msgid "Node Details" msgstr "节点详情" msgid "System" msgstr "系统" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/locale/zh_Hans/LC_MESSAGES/djangojs.po0000664000175000017500000003664300000000000024212 0ustar00zuulzuul00000000000000# OpenStack Infra , 2015. #zanata # zhangjingwen , 2015. #zanata # Andreas Jaeger , 2016. #zanata # Shengjing Zhu , 2016. #zanata # sunanchen , 2016. #zanata # vuuv , 2016. #zanata # Bin , 2017. #zanata # Gaoxiao Zhu , 2017. #zanata # liujunpeng , 2017. #zanata # Franco Tseng , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: ironic-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2021-01-24 09:54+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-04-02 02:19+0000\n" "Last-Translator: Franco Tseng \n" "Language-Team: Chinese (China)\n" "Language: zh_CN\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid " ([^\" ]+|\"[^\"]+\") \\(Default\\)" msgstr "([^\" ]+|\"[^\"]+\") \\(Default标签\\)" msgid "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" msgstr "(?:[Oo]ne of )(?!this)((?:(?:\"[^\"]+\"|[^,\\. ]+)(?:, |\\.))+)" #, python-format msgid "A request has been made to change the provisioning state of node %s" msgstr "更改节点 \"%s\" 服务状态的请求已提交。" msgid "A unique node name. Optional." msgstr "独一无二的节点名称。可选。" msgid "Abort cleaning" msgstr "放弃清理" msgid "Action" msgstr "动作" msgid "Actions" msgstr "动作" msgid "Add Extra" msgstr "增加额外信息" msgid "Add Instance Property" msgstr "添加实例属性" msgid "Add Logical Disk" msgstr "添加逻辑盘" msgid "Add Property" msgstr "添加属性" #, python-format msgid "" "Are you sure you want to delete node \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete nodes \"%s\"? This action cannot be undone." msgstr[0] "你确认要删除节点\"%s\"吗?此操作将不可恢复" #, python-format msgid "" "Are you sure you want to delete port \"%s\"? This action cannot be undone." msgid_plural "" "Are you sure you want to delete ports \"%s\"? This action cannot be undone." msgstr[0] "你确认要删除端口\"%s\"吗?本操作无法恢复。" #, python-format msgid "" "Are you sure you want to delete portgroup \"%s\"? This action cannot be " "undone." msgid_plural "" "Are you sure you want to delete portgroups \"%s\"? This action cannot be " "undone." msgstr[0] "你确定要删除端口组\"%s\"?本操作无法恢复。" msgid "Attributes" msgstr "属性" msgid "Boot Device" msgstr "引导设备" msgid "Cancel" msgstr "取消" msgid "Chassis ID" msgstr "机架ID" msgid "Choose an Image" msgstr "选择一个镜像" msgid "Clean" msgstr "清理" msgid "Clean Node" msgstr "清理节点" msgid "Clean Step" msgstr "清理步骤" msgid "Clean node" msgstr "清理节点" msgid "Clean steps should be an non-empty array" msgstr "清理步骤应该是一个非空数组" msgid "Click link to view console" msgstr "点击链接查看控制台" msgid "Configuration" msgstr "配置" msgid "Console Enabled" msgstr "允许控制台" msgid "Console Info." msgstr "控制台信息。" msgid "Create Port" msgstr "创建端口" msgid "Create Portgroup" msgstr "创建端口组" msgid "Created At" msgstr "创建于" msgid "Current Interface" msgstr "当前接口" msgid "Defaults to ([^\"\\. ]+|\"[^\"]+\")" msgstr "默认为 ([^\"\\. ]+|\"[^\"]+\")" msgid "Delete Node" msgid_plural "Delete Nodes" msgstr[0] "删除节点" msgid "Delete Nodes" msgstr "删除多个节点" msgid "Delete Port" msgid_plural "Delete Ports" msgstr[0] "删除端口" msgid "Delete Portgroup" msgid_plural "Delete Portgroups" msgstr[0] "删除端口组" msgid "Delete Ports" msgstr "删除端口" msgid "Deploy Kernel" msgstr "部署内核" msgid "Deploy Ramdisk" msgstr "部署虚拟内存盘" msgid "Device" msgstr "设备" msgid "Driver" msgstr "驱动" msgid "Driver Details" msgstr "驱动详情" msgid "Driver Info" msgstr "驱动信息" msgid "Driver Interfaces" msgstr "驱动接口" msgid "Driver Validation" msgstr "驱动验证" msgid "" "Each cleaning step must be an object that contains \"interface\" and \"step" "\" properties" msgstr "每一步清理步骤必需是一个包含“接口”和“步骤”属性的对象" msgid "Edit" msgstr "编辑" msgid "Edit Node" msgstr "编辑节点" msgid "Edit Port" msgstr "编辑端口" msgid "Edit Portgroup" msgstr "编辑端口组" msgid "Enroll Node" msgstr "注册节点" msgid "Extra" msgstr "额外信息" msgid "Extra Property Name" msgstr "额外属性名称" msgid "Extras" msgstr "额外信息" msgid "General" msgstr "概要信息" msgid "Image Source" msgstr "镜像源" msgid "Indicates whether this port should be used when PXE booting this node" msgstr "当PXE应到该节点时,表明此端口是否应该被使用" msgid "Inject NMI" msgstr "注入NMI" msgid "Inspect" msgstr "检查" msgid "Inspection Finished At" msgstr "检查结束于" msgid "Inspection Started At" msgstr "检查开始于" msgid "Instance ID" msgstr "云主机ID" msgid "Instance Info" msgstr "实例信息" msgid "Instance Name" msgstr "实例名字" msgid "Instance Property Name" msgstr "实例属性名称" msgid "Interface" msgstr "接口" msgid "Kernel" msgstr "内核" msgid "Last Error" msgstr "最近的一次错误" msgid "" "Linux portgroup mode. For possible values refer to https://www.kernel.org/" "doc/Documentation/networking/bonding.txt" msgstr "" "Linux端口组模式。查看可能的值请参考https://www.kernel.org/doc/Documentation/" "networking/bonding.txt。" msgid "Local Link Connection" msgstr "本地链接连接" msgid "Local link connection" msgstr "本地链接连接" msgid "MAC Address" msgstr "MAC地址" msgid "MAC address" msgstr "MAC地址" msgid "MAC address for this port. Required." msgstr "需要该端口的MAC地址" msgid "MAC address for this portgroup." msgstr "该端口组的MAC地址。" msgid "MAC address or OpenFlow datapath ID" msgstr "MAC地址或OpenFlow datapath ID" msgid "Maintenance" msgstr "维护" msgid "Maintenance Reason" msgstr "维护原因" msgid "Mode" msgstr "模式" msgid "Move to" msgstr "移动" msgid "Name" msgstr "名称" msgid "Name for the portgroup." msgstr "为端口组命名。" msgid "Network Interface" msgstr "网络接口" msgid "No Instance" msgstr "没有实例" msgid "No network ports have been defined" msgstr "未定义网络端口" msgid "No portgroups have been defined" msgstr "未定义端口组" msgid "No reason given." msgstr "没有原因提供。" msgid "Node" msgstr "节点" #, python-format msgid "Node %s is already in target maintenance state." msgstr "节点\"%s\"已经处于目标维护状态" msgid "Node Driver" msgstr "节点驱动" msgid "Node ID" msgstr "节点ID" msgid "Node Info" msgstr "节点信息" msgid "Node Name" msgstr "节点名称" msgid "One of this, (.*) must be specified\\." msgstr "必须指定其中的一个 (.*)" msgid "Overview" msgstr "概览" msgid "PXE Enabled" msgstr "PXE启用" msgid "PXE enabled" msgstr "PXE启用" msgid "Persistent" msgstr "持久" msgid "Port successfully created" msgstr "端口创建成功" msgid "Portgroup" msgstr "端口组" msgid "Portgroup successfully created" msgstr "端口组创建成功" msgid "Portgroup that this port belongs to" msgstr "此端口所属的端口组" msgid "Portgroups" msgstr "端口组" msgid "Ports" msgstr "端口" msgid "Power State" msgstr "电源状态" msgid "Power off" msgstr "关闭电源" msgid "Power on" msgstr "打开电源" msgid "Properties" msgstr "属性" msgid "Property Name" msgstr "属性名称" msgid "Provide a list of cleaning steps in JSON format" msgstr "提供一个JSON格式的清理步骤列表" msgid "" "Provide a reason for why you are putting the selected node(s) into " "maintenance mode (optional)" msgstr "提供一个你为什么选择将节点置于维护模式的原因(可选)" msgid "Provision State" msgstr "配置状态" msgid "Provisioning State" msgstr "配置状态" msgid "Provisioning Status" msgstr "配置状态" msgid "Put Node(s) Into Maintenance Mode" msgstr "将节点置于维护模式" msgid "RAID Level" msgstr "RAID级别" msgid "Ramdisk" msgstr "内存盘" msgid "Reason" msgstr "原因" msgid "Reboot" msgstr "重启" msgid "Refresh" msgstr "刷新" msgid "Refresh page to see set boot device" msgstr "刷新页面来设置引导设备" msgid "Refresh page to see updated console details" msgstr "刷新页面查看更新的控制台细节" msgid "Refresh page to see updated power status" msgstr "刷新页面来确认电源状态是否更新" msgid "Refresh page." msgstr "刷新页面。" msgid "Required" msgstr "必需的" msgid "Reservation" msgstr "预留" msgid "Resource Class" msgstr "资源类" msgid "Root GB" msgstr "根磁盘 GB" msgid "Root Volume" msgstr "根卷" msgid "Root Volume." msgstr "根卷" msgid "SSH Address" msgstr "SSH 地址" msgid "SSH Key Contents" msgstr "SSH 密钥内容" msgid "SSH Key File" msgstr "SSH 密钥文件" msgid "SSH Password" msgstr "SSH 密码" msgid "SSH Port" msgstr "SSH端口" msgid "SSH Username" msgstr "SSH用户名" msgid "SSH terminal port" msgstr "SSH 终端端口" msgid "Select a Driver" msgstr "选择一种驱动" msgid "Select a boot device" msgstr "选择一个引导设备" msgid "Select a portgroup" msgstr "选择一个端口组" msgid "Set Boot Device" msgstr "设置引导设备" msgid "Set RAID Configuration" msgstr "设置RAID配置" msgid "Set Target RAID Config" msgstr "置目标RAID配置" msgid "Size GB" msgstr "大小 GB" msgid "Soft power off" msgstr "软关机" msgid "Soft reboot" msgstr "软重启" msgid "Specifies RAID Level." msgstr "指定RAID级别。" msgid "Specifies logical disk size in GiB. Required." msgstr "指定逻辑盘大小,单位GiB。(必须)" msgid "" "Specifies whether ports in this portgroup can be used as standalone ports." msgstr "指定在该端口组中的端口是否可以用作独立端口。" msgid "Specifies whether root volume or not." msgstr "指定是否为根卷。" msgid "Standalone Ports Supported" msgstr "独立端口支持" msgid "Storage Interface" msgstr "存储接口" msgid "Submit" msgstr "提交" #, python-format msgid "Successfully deleted node \"%s\"" msgid_plural "Successfully deleted nodes \"%s\"" msgstr[0] "成功删除节点\"%s\"" #, python-format msgid "Successfully deleted port \"%s\"" msgid_plural "Successfully deleted ports \"%s\"" msgstr[0] "删除端口\"%s\"成功" #, python-format msgid "Successfully deleted portgroup \"%s\"" msgid_plural "Successfully deleted portgroups \"%s\"" msgstr[0] "成功删除端口组\"%s\"" #, python-format msgid "Successfully updated node %s" msgstr "成功更新节点:“%s”。" #, python-format msgid "Successfully updated port %s" msgstr "成功更新端口:“%s”。" #, python-format msgid "Successfully updated portgroup %s" msgstr "成功更新端口组%s" msgid "Target Power State" msgstr "标记电源状态" msgid "Target Provision State" msgstr "标记配置状态" msgid "" "This field is disabled because a port cannot have any connectivity " "attributes (pxe_enabled, local_link_connection, portgroup_id) updated unless " "its associated node is in an enroll, inspecting, mangeable state; or in " "maintenance mode." msgstr "" "这些域被禁用了,因为端口不能有任何已更新的连接属性((pxe_enabled, " "local_link_connection, portgroup_id),除非节点处于注册,检查,可管理状态或处" "于维护模式。" msgid "UUID" msgstr "UUID" msgid "Unable to create node update patch." msgstr "不能创建节点更新补丁" #, python-format msgid "Unable to create node: %s" msgstr "无法创建Ironic节点: %s" msgid "Unable to create port update patch." msgstr "不能创建端口更新补丁" #, python-format msgid "Unable to create port: %s" msgstr "无法创建端口: %s" msgid "Unable to create portgroup update patch." msgstr "不能创建端口组更新补丁" #, python-format msgid "Unable to create portgroup: %s" msgstr "无法创建端口组: %s" #, python-format msgid "Unable to delete node \"%s\"" msgid_plural "Unable to delete nodes \"%s\"" msgstr[0] "无法删除节点\"%s\"" #, python-format msgid "Unable to delete node %s: %s" msgstr "无法删除Ironic节点\"%s\": %s" #, python-format msgid "Unable to delete port \"%s\"" msgid_plural "Unable to delete ports \"%s\"" msgstr[0] "无法删除端口\"%s\"" #, python-format msgid "Unable to delete port: %s" msgstr "无法删除端口: %s" #, python-format msgid "Unable to delete portgroup \"%s\"" msgid_plural "Unable to delete portgroups \"%s\"" msgstr[0] "无法删除端口组\"%s\"" #, python-format msgid "Unable to delete portgroup: %s" msgstr "无法删除端口组:%s" #, python-format msgid "Unable to get console for node %s: %s" msgstr "无法获取节点的控制台 %s: %s" #, python-format msgid "Unable to inject NMI: %s" msgstr "无法注入NMI:%s" #, python-format msgid "Unable to power off the node: %s" msgstr "无法关闭节点电源: %s" #, python-format msgid "Unable to retrieve Ironic drivers: %s" msgstr "无法获取Ironic驱动: %s" #, python-format msgid "Unable to retrieve Ironic node portgroups: %s" msgstr "无法获取Ironic节点端口组信息: %s" #, python-format msgid "Unable to retrieve Ironic nodes. %s" msgstr "无法获取Ironic节点信息: %s" #, python-format msgid "Unable to retrieve boot device for Ironic node. %s" msgstr "无法获取Ironic节点引导设备信息。%s" #, python-format msgid "Unable to retrieve driver properties: %s" msgstr "无法获取驱动属性: %s" #, python-format msgid "Unable to retrieve portgroup ports: %s" msgstr "无法获取端口组端口:%s" #, python-format msgid "Unable to retrieve supported boot devices for Ironic node. %s" msgstr "无法获取Ironic节点支持的引导设备信息。%s" #, python-format msgid "Unable to retrieve the Ironic node ports: %s" msgstr "无法获取Ironic节点端口信息: %s" #, python-format msgid "Unable to retrieve the Ironic node: %s" msgstr "无法获取Ironic节点信息: %s" #, python-format msgid "Unable to set Ironic node %s maintenance state: %s" msgstr "不能设置Ironic节点%s维护状态:%s" #, python-format msgid "Unable to set boot device: %s" msgstr "不能设置引导设备:%s" #, python-format msgid "Unable to set console mode: %s" msgstr "不能设置控制台模式:%s" #, python-format msgid "Unable to set node provision state: %s" msgstr "不能设置节点提供状态:%s" #, python-format msgid "Unable to set raid config: %s" msgstr "无法设置raid配置:%s" #, python-format msgid "Unable to update node %s: %s" msgstr "无法更新节点%s:%s" #, python-format msgid "Unable to update port %s: %s" msgstr "无法更新端口%s:%s" #, python-format msgid "Unable to update portgroup %s: %s" msgstr "无法更新端口组%s: %s" #, python-format msgid "Unable to validate node %s: %s" msgstr "无法验证节点%s:%s" msgid "Unable to validate the JSON input" msgstr "无法验证JSON输入" msgid "Update Node" msgstr "更新节点" msgid "Update Port" msgstr "更新端口" msgid "Update Portgroup" msgstr "更新端口组" msgid "Updated At" msgstr "已更新于" msgid "Valid" msgstr "有效" msgid "Virtualization Software" msgstr "虚拟化软件" msgid "default (?:value )?is ([^\"\\. ]+|\"[^\"]+\")" msgstr "默认值 (?:value )?是 ([^\"\\. ]+|\"[^\"]+\")" ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.88151 ironic-ui-6.3.0/ironic_ui/static/0000775000175000017500000000000000000000000016710 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.88151 ironic-ui-6.3.0/ironic_ui/static/dashboard/0000775000175000017500000000000000000000000020637 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.88151 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/0000775000175000017500000000000000000000000021727 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.89751 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/0000775000175000017500000000000000000000000023212 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/auto-focus.directive.js0000664000175000017500000000170200000000000027612 0ustar00zuulzuul00000000000000/* * Copyright 2016 Cray 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. */ (function () { 'use strict'; angular .module('horizon.dashboard.admin.ironic') .directive('autoFocus', AutoFocus); AutoFocus.$inject = ['$timeout']; function AutoFocus($timeout) { return { restrict: 'AC', link: function(scope, elem) { $timeout(function() { elem[0].focus(); }, 1000); } }; } })(); ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.89751 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/base-node/0000775000175000017500000000000000000000000025047 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/base-node/base-node.controller.js0000664000175000017500000002672300000000000031436 0ustar00zuulzuul00000000000000/* * Copyright 2016 Cray 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. */ (function() { 'use strict'; /** * Controller used to support operations on an Ironic node */ angular .module('horizon.dashboard.admin.ironic') .controller('BaseNodeController', BaseNodeController); BaseNodeController.$inject = [ '$uibModalInstance', 'horizon.app.core.openstack-service-api.ironic', 'horizon.app.core.openstack-service-api.glance', 'horizon.dashboard.admin.ironic.form-field.service', 'horizon.dashboard.admin.ironic.base-node.service', 'horizon.dashboard.admin.ironic.driver-property.service', 'horizon.dashboard.admin.ironic.graph.service', 'horizon.dashboard.admin.ironic.validHostNamePattern', 'horizon.dashboard.admin.ironic.driverInterfaces', '$log', '$q', 'ctrl' ]; function BaseNodeController($uibModalInstance, ironic, glance, formFieldService, baseNodeService, driverPropertyService, graphService, validHostNamePattern, driverInterfaces, $log, $q, ctrl) { ctrl.validHostNameRegex = new RegExp(validHostNamePattern); ctrl.drivers = null; ctrl.images = null; ctrl.loadingDriverProperties = false; ctrl.driverType = null; // Object containing the set of properties associated with the currently // selected driver ctrl.driverProperties = null; ctrl.driverPropertyGroups = null; // Dictionary of form-fields for supported interfaces indexed by interface // name for the currently selected driver ctrl.driverInterfaceFields = {}; ctrl.modalTitle = gettext("Node"); ctrl.submitButtonTitle = gettext("Submit"); /* A property-collection is a set of properties that will be displayed in the node view as a minimal browser ui that supports: - adding new properties - displaying the list of properties in the set - changing the value of properties Collection attributes: id: Name of the property inside the node object that is used to store the collection. formId: Name of the controller variable that can be used to access the property collection form. prompt: Label used to prompt the user to add properties to the collection. placeholder: Label used to guide the user in providiing property values. */ ctrl.propertyCollections = [ {id: "properties", formId: "properties_form", title: gettext("Properties"), addPrompt: gettext("Add Property"), placeholder: gettext("Property Name") }, {id: "extra", formId: "extra_form", title: gettext("Extras"), addPrompt: gettext("Add Extra"), placeholder: gettext("Extra Property Name") }]; // Node object suitable for Ironic api ctrl.node = { name: null, driver: null, driver_info: {}, resource_class: null }; // Initialize hardware interfaces angular.forEach(driverInterfaces, function(interfaceName) { ctrl.node[interfaceName + '_interface'] = null; }); angular.forEach(ctrl.propertyCollections, function(collection) { ctrl.node[collection.id] = {}; }); /** * @description Get the list of currently active Ironic drivers * * @return {void} */ ctrl._loadDrivers = function() { return ironic.getDrivers().then(function(drivers) { ctrl.drivers = drivers; }); }; /** * @description Get the list of images from Glance * * @return {void} */ ctrl._getImages = function() { glance.getImages().then(function(response) { ctrl.images = response.data.items; }); }; /** * @description Order driver properties in the form using the following * rules: * * (1) Properties that are related to one another should occupy adjacent * locations in the form * * (2) Required properties with no dependents should be located at the * top of the form * * @return {[]} Ordered list of groups of strongly related properties */ ctrl._sortDriverProperties = function() { // Build dependency graph between driver properties var graph = new graphService.Graph(); // Create vertices angular.forEach(ctrl.driverProperties, function(property, name) { graph.addVertex(name, property); }); /* eslint-disable no-unused-vars */ // Create edges angular.forEach(ctrl.driverProperties, function(property, name) { var activators = property.getActivators(); if (activators) { angular.forEach(activators, function(unused, activatorName) { graph.addEdge(name, activatorName); }); } }); /* eslint-enable no-unused-vars */ // Perform depth-first-search to find groups of related properties var groups = []; graph.dfs( function(vertexList, components) { // Sort properties so that those with the largest number of // immediate dependents are the top of the list vertexList.sort(function(vertex1, vertex2) { return vertex2.adjacents.length - vertex1.adjacents.length; }); // Build component and add to list var component = new Array(vertexList.length); angular.forEach(vertexList, function(vertex, index) { component[index] = vertex.data; }); components.push(component); }, groups); groups.sort(baseNodeService.compareDriverPropertyGroups); $log.debug("Found the following property groups: " + baseNodeService.driverPropertyGroupsToString(groups)); return groups; }; /** * @description Get the properties associated with a specified driver * * @param {string} driverName - Name of driver * @return {void} */ ctrl._loadDriverProperties = function(driverName) { ctrl.node.driver = null; ctrl.node.driver_info = {}; ctrl.loadingDriverProperties = true; ctrl.driverProperties = null; ctrl.driverPropertyGroups = null; return ironic.getDriverProperties(driverName).then(function(properties) { ctrl.node.driver = driverName; ctrl.driverProperties = {}; angular.forEach(properties, function(desc, property) { ctrl.driverProperties[property] = new driverPropertyService.DriverProperty(property, desc, ctrl.driverProperties); }); ctrl.driverPropertyGroups = ctrl._sortDriverProperties(); ctrl.loadingDriverProperties = false; }); }; /** * @description Cancel the current node operation * * @return {void} */ ctrl.cancel = function() { $uibModalInstance.dismiss('cancel'); }; /** * @description Check whether the specified property already exists * * @param {string} collectionId - Collection ID * @param {string} propertyName - Name of the property * @return {boolean} True if the property already exists, * otherwise false */ ctrl.collectionCheckPropertyUnique = function(collectionId, propertyName) { return !(propertyName in ctrl.node[collectionId]); }; /** * @description Delete a node metadata property * * @param {string} collectionId - Collection ID * @param {string} propertyName - Name of the property * @return {void} */ ctrl.collectionDeleteProperty = function(collectionId, propertyName) { delete ctrl.node[collectionId][propertyName]; }; /** * @description Check whether a specified driver property is * currently active * * @param {string} property - Driver property * @return {boolean} True if the property is active, false otherwise */ ctrl.isDriverPropertyActive = function(property) { return property.isActive(); }; /** * @description Check whether the node definition form is ready for * to be submitted. * * @return {boolean} True if the form is ready to be submitted, * otherwise false. */ ctrl.readyToSubmit = function() { var ready = true; if (ctrl.driverProperties) { for (var i = 0; i < ctrl.propertyCollections.length; i++) { var collection = ctrl.propertyCollections[i]; if (ctrl[collection.formId].$invalid) { ready = false; break; } } } else { ready = false; } return ready; }; /** * @description Load details for a specified driver. * Includes driver type and supported interfaces. * * @param {string} driverName - driver name * @return {void} */ ctrl._loadDriverDetails = function(driverName) { // Re-initialize driver related properties ctrl.driverType = null; angular.forEach(driverInterfaces, function(interfaceName) { ctrl.node[interfaceName + '_interface'] = null; }); ctrl.driverInterfaceFields = {}; return ironic.getDriverDetails(driverName).then(function(details) { ctrl.driverType = details.type; // Extract interface information for dynamic drivers angular.forEach(driverInterfaces, function(interfaceName) { var enabled = 'enabled_' + interfaceName + '_interfaces'; if (angular.isDefined(details[enabled]) && details[enabled] !== null) { var options = []; angular.forEach(details[enabled], function(value) { options.push({label: value, value: value}); }); ctrl.driverInterfaceFields[interfaceName] = new formFieldService.FormField( {type: 'radio', id: interfaceName, title: interfaceName, options: options, value: details['default_' + interfaceName + '_interface']}); } }); }); }; /** * @description Load a specified driver. * * @param {string} driverName - driver name * @return {promise} Promise that completes * when both properties and details are loaded. */ ctrl.loadDriver = function(driverName) { var promises = []; promises.push(ctrl._loadDriverProperties(driverName)); promises.push(ctrl._loadDriverDetails(driverName)); return $q.all(promises); }; } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/base-node/base-node.controller.spec.js0000664000175000017500000001066300000000000032363 0ustar00zuulzuul00000000000000/* * Copyright 2017 Cray 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. */ (function () { 'use strict'; describe('horizon.dashboard.admin.ironic.base-node', function () { var ironicBackendMockService, uibModalInstance, driverInterfaces; var ctrl = {}; beforeEach(module('horizon.dashboard.admin.ironic')); beforeEach(module('horizon.framework.util')); beforeEach(module(function($provide) { $provide.value('$uibModal', {}); })); beforeEach(module(function($provide) { uibModalInstance = { dismiss: jasmine.createSpy() }; $provide.value('$uibModalInstance', uibModalInstance); })); beforeEach(module(function($provide) { $provide.value('horizon.framework.widgets.toast.service', {}); })); beforeEach(module('horizon.app.core.openstack-service-api')); beforeEach(inject(function($injector) { ironicBackendMockService = $injector.get('horizon.dashboard.admin.ironic.backend-mock.service'); ironicBackendMockService.init(); var controller = $injector.get('$controller'); controller('BaseNodeController', {ctrl: ctrl}); })); beforeEach(inject(function($injector) { driverInterfaces = $injector.get('horizon.dashboard.admin.ironic.driverInterfaces'); })); afterEach(function() { ironicBackendMockService.postTest(); }); it('controller should be defined', function () { expect(ctrl).toBeDefined(); }); it('base construction', function () { expect(ctrl.drivers).toBeNull(); expect(ctrl.images).toBeNull(); expect(ctrl.loadingDriverProperties).toBe(false); expect(ctrl.driverProperties).toBeNull(); expect(ctrl.driverInterfaceFields).toEqual({}); expect(ctrl.driverPropertyGroups).toBeNull(); expect(ctrl.modalTitle).toBeDefined(); angular.forEach(ctrl.propertyCollections, function(collection) { expect(Object.getOwnPropertyNames(collection).sort()).toEqual( PROPERTY_COLLECTION_PROPERTIES.sort()); }); expect(ctrl.propertyCollections) .toContain(jasmine.objectContaining({id: "properties"})); expect(ctrl.propertyCollections) .toContain(jasmine.objectContaining({id: "extra"})); var node = { name: null, driver: null, driver_info: {}, properties: {}, extra: {}, resource_class: null}; angular.forEach(driverInterfaces, function(interfaceName) { node[interfaceName + '_interface'] = null; }); expect(ctrl.node).toEqual(node); expect(Object.getOwnPropertyNames(ctrl).sort()).toEqual( BASE_NODE_CONTROLLER_PROPERTIES.sort()); }); it('_loadDrivers', function () { ctrl._loadDrivers(); ironicBackendMockService.flush(); expect(ctrl.drivers).toEqual(ironicBackendMockService.getBaseDrivers()); }); it('_getImages', function () { ctrl._getImages(); ironicBackendMockService.flush(); expect(ctrl.images).toEqual(ironicBackendMockService.getImages()); }); it('cancel', function () { ctrl.cancel(); expect(uibModalInstance.dismiss).toHaveBeenCalledWith('cancel'); }); it('_loadDriverProperties', function() { var driverName = "ipmi"; ctrl._loadDriverProperties(driverName); var drivers = ironicBackendMockService.getDrivers(); ironicBackendMockService.flush(); expect(ctrl.node.driver).toEqual(driverName); expect(ctrl.node.driver).toEqual(drivers[driverName].details.name); expect(ctrl.node.driver_info).toEqual({}); expect(ctrl.driverPropertyGroups).toBeNonEmptyArray(); }); it('_loadDriverDetails', function() { var driverName = "ipmi"; ctrl._loadDriverDetails(driverName); ironicBackendMockService.flush(); var drivers = ironicBackendMockService.getDrivers(); expect(ctrl.driverType).toEqual(drivers[driverName].details.type); }); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/base-node/base-node.html0000664000175000017500000003254100000000000027577 0ustar00zuulzuul00000000000000 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/base-node/base-node.service.js0000664000175000017500000000620700000000000030706 0ustar00zuulzuul00000000000000/* * Copyright 2016 Cray 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. */ (function() { 'use strict'; angular .module('horizon.dashboard.admin.ironic') .factory('horizon.dashboard.admin.ironic.base-node.service', baseNodeService); baseNodeService.$inject = []; function baseNodeService() { var service = { driverPropertyGroupHasRequired: driverPropertyGroupHasRequired, driverPropertyGroupsToString: driverPropertyGroupsToString, compareDriverPropertyGroups: compareDriverPropertyGroups }; /** * @description Check whether a group contains required properties * * @param {DriverProperty[]} group - Property group * @return {boolean} Return true if the group contains required * properties, false otherwise */ function driverPropertyGroupHasRequired(group) { var hasRequired = false; for (var i = 0; i < group.length; i++) { if (group[i].required) { hasRequired = true; break; } } return hasRequired; } /** * @description Convert array of driver property groups to a string * * @param {array[]} groups - Array of driver property groups * @return {string} Output string */ function driverPropertyGroupsToString(groups) { var output = []; angular.forEach(groups, function(group) { var groupStr = []; angular.forEach(group, function(property) { groupStr.push(property.name); }); groupStr = groupStr.join(", "); output.push(['[', groupStr, ']'].join("")); }); output = output.join(", "); return ['[', output, ']'].join(""); } /** * @description Comparison function used to sort driver property groups * * @param {DriverProperty[]} group1 - First group * @param {DriverProperty[]} group2 - Second group * @return {integer} Return: * < 0 if group1 should precede group2 in an ascending ordering * > 0 if group2 should precede group1 * 0 if group1 and group2 are considered equal from ordering perspective */ function compareDriverPropertyGroups(group1, group2) { var group1HasRequired = driverPropertyGroupHasRequired(group1); var group2HasRequired = driverPropertyGroupHasRequired(group2); if (group1HasRequired === group2HasRequired) { if (group1.length === group2.length) { return group1[0].name.localeCompare(group2[0].name); } else { return group1.length - group2.length; } } else { return group1HasRequired ? -1 : 1; } return 0; } return service; } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/base-node/base-node.spec.js0000664000175000017500000000651600000000000030203 0ustar00zuulzuul00000000000000/** * Copyright 2016 Cray 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. */ (function() { "use strict"; describe( 'horizon.dashboard.admin.ironic.base-node.service', function() { var service, driverPropertyService; beforeEach(module('horizon.dashboard.admin.ironic')); beforeEach(inject(function($injector) { service = $injector.get('horizon.dashboard.admin.ironic.base-node.service'); driverPropertyService = $injector.get('horizon.dashboard.admin.ironic.driver-property.service'); })); it('defines the service', function() { expect(service).toBeDefined(); }); describe('DriverPropertyGroup', function() { it('driverPropertyGroupHasRequired', function () { var dp1 = new driverPropertyService.DriverProperty("dp-1", " Required.", []); var dp2 = new driverPropertyService.DriverProperty("dp-2", " ", []); expect(service.driverPropertyGroupHasRequired).toBeDefined(); expect(service.driverPropertyGroupHasRequired([])).toBe(false); expect(service.driverPropertyGroupHasRequired([dp1])).toBe(true); expect(service.driverPropertyGroupHasRequired([dp2])).toBe(false); expect(service.driverPropertyGroupHasRequired([dp1, dp2])).toBe(true); }); it('driverPropertyGroupsToString', function () { var dp1 = new driverPropertyService.DriverProperty("dp-1", " Required.", []); var dp2 = new driverPropertyService.DriverProperty("dp-2", " ", []); expect(service.driverPropertyGroupsToString).toBeDefined(); expect(service.driverPropertyGroupsToString([])).toBe("[]"); expect(service.driverPropertyGroupsToString([[dp1]])) .toBe("[[dp-1]]"); expect(service.driverPropertyGroupsToString([[dp1], [dp2]])) .toBe("[[dp-1], [dp-2]]"); }); it('compareDriverPropertyGroups', function () { var dp1 = new driverPropertyService.DriverProperty("dp-1", " Required.", []); var dp2 = new driverPropertyService.DriverProperty("dp-2", " ", []); expect(service.compareDriverPropertyGroups).toBeDefined(); expect(service.compareDriverPropertyGroups([dp1], [dp1])).toBe(0); expect(service.compareDriverPropertyGroups([dp1], [dp2])).toBe(-1); expect(service.compareDriverPropertyGroups([dp2], [dp1])).toBe(1); // smaller group precedes larger group expect(service.compareDriverPropertyGroups([dp1], [dp1, dp2])) .toBe(-1); // group order decided on lexographic comparison of names of first // property expect(service.compareDriverPropertyGroups([dp2, dp1], [dp1, dp2])) .toBe(1); }); }); }); })(); ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.89751 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/base-port/0000775000175000017500000000000000000000000025106 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/base-port/base-port.controller.js0000664000175000017500000001517500000000000031533 0ustar00zuulzuul00000000000000/* * Copyright 2016 Cray 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. */ (function() { 'use strict'; /** * Controller used to support operations on an Ironic port */ angular .module('horizon.dashboard.admin.ironic') .controller('BasePortController', BasePortController); BasePortController.$inject = [ '$uibModalInstance', 'horizon.dashboard.admin.ironic.validMacAddressPattern', 'horizon.dashboard.admin.ironic.validDatapathIdPattern', 'horizon.dashboard.admin.ironic.form-field.service', 'horizon.app.core.openstack-service-api.ironic', 'horizon.dashboard.admin.ironic.property-collection.service', 'ctrl', 'node']; /** * @description Utility class used to manage local-link-connection * form fields. * * @param {string} formFieldService - Provider service for creating * form fields. * @param {string} validMacAddressPattern - Regular expression * pattern used to test for valid mac addresses. * @param {string} validDatapathIdPattern - Regular expression * pattern used to test for valid datapath ids. * @return {void} */ function LocalLinkConnectionMgr(formFieldService, validMacAddressPattern, validDatapathIdPattern) { var mgr = this; mgr.port_id = new formFieldService.FormField( {id: 'port_id', title: 'port_id'}); mgr.switch_id = new formFieldService.FormField( {id: 'switch_id', title: 'switch_id', desc: gettext("MAC address or OpenFlow datapath ID"), pattern: new RegExp(validMacAddressPattern + '|' + validDatapathIdPattern)}); mgr.switch_info = new formFieldService.FormField( {id: 'switch_info', title: 'switch_info'}); mgr.fields = { port_id: mgr.port_id, switch_id: mgr.switch_id, switch_info: mgr.switch_info }; /** * Update the required property of each field based on current values * * @return {void} */ mgr.update = function() { var required = mgr.port_id.hasValue() || mgr.switch_id.hasValue(); mgr.port_id.required = required; mgr.switch_id.required = required; }; // Add form field value change handlers angular.forEach(mgr.fields, function(field) { field.change = mgr.update; }); /** * Generate an attribute object that conforms to the format * required for port creation using the Ironic client * * @return {object|null} local_link_connection attribute object. * A value of null is returned if the local-link-connection * information is incomplete. */ mgr.toPortAttr = function() { var attr = null; if (mgr.port_id.hasValue() && mgr.switch_id.hasValue()) { attr = {}; attr.port_id = mgr.port_id.value; attr.switch_id = mgr.switch_id.value; if (mgr.switch_info.hasValue()) { attr.switch_info = mgr.switch_info.value; } } return attr; }; /** * @description Set values of form fields; * * @param {object} values - Dictionary of values indexed by * property-name * @return {void} */ mgr.setValues = function(values) { angular.forEach(mgr.fields, function(field, propertyName) { if (angular.isDefined(values[propertyName])) { field.value = values[propertyName]; } }); }; /** * @description Disable the local-link-connection form fields. * * @param {string} reason - Optional reason for disabling fields. * @return {void} */ mgr.disable = function(reason) { angular.forEach(mgr.fields, function(item) { item.disable(reason); }); }; } function BasePortController($uibModalInstance, validMacAddressPattern, validDatapathIdPattern, formFieldService, ironic, propertyCollectionService, ctrl, node) { ctrl.address = new formFieldService.FormField({ id: "macAddress", title: gettext("MAC address"), desc: gettext("MAC address for this port. Required."), pattern: new RegExp(validMacAddressPattern), value: null, required: true, autoFocus: true }); ctrl.pxeEnabled = new formFieldService.FormField({ type: "radio", id: "pxeEnabled", title: gettext("PXE enabled"), desc: gettext( "Indicates whether this port should be used when PXE booting this node"), options: [{label: 'True', value: true}, {label: 'False', value: false}], value: true}); ctrl.portgroup_uuid = new formFieldService.FormField({ type: "select", id: "portgroup-uuid", title: gettext("Portgroup"), desc: gettext("Portgroup that this port belongs to"), portgroups: [], options: "portgroup.uuid as portgroup.name ? portgroup.name : portgroup.uuid for portgroup in field.portgroups", // eslint-disable-line max-len value: null}); // Object used to manage local-link-connection form fields ctrl.localLinkConnection = new LocalLinkConnectionMgr(formFieldService, validMacAddressPattern, validDatapathIdPattern); ironic.getPortgroups(node.uuid).then(function(portgroups) { var field = ctrl.portgroup_uuid; if (portgroups.length > 0) { field.portgroups.push({uuid: null, name: gettext("Select a portgroup")}); } field.portgroups = field.portgroups.concat(portgroups); if (portgroups.length === 0) { field.disable(); } }); ctrl.extra = new propertyCollectionService.PropertyCollection({ id: 'extra', title: gettext('Extras'), addPropertyLabel: gettext('Add Extra'), placeholder: gettext('Property Name') }); /** * Cancel the modal * * @return {void} */ ctrl.cancel = function() { $uibModalInstance.dismiss('cancel'); }; } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/base-port/base-port.controller.spec.js0000664000175000017500000001377400000000000032467 0ustar00zuulzuul00000000000000/* * Copyright 2017 Cray 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. */ (function () { 'use strict'; describe('horizon.dashboard.admin.ironic.base-port', function () { var uibModalInstance, ironicBackendMockService, ironicAPI; var ctrl = {}; beforeEach(module('horizon.framework.util')); beforeEach(module('horizon.dashboard.admin.ironic')); beforeEach(module(function($provide) { $provide.value('horizon.framework.widgets.toast.service', { add: function() {} }); })); beforeEach(module('horizon.app.core.openstack-service-api')); beforeEach(module(function($provide) { $provide.value('$uibModal', {}); })); beforeEach(module(function($provide) { uibModalInstance = { dismiss: jasmine.createSpy() }; $provide.value('$uibModalInstance', uibModalInstance); })); beforeEach(inject(function($injector) { ironicBackendMockService = $injector.get('horizon.dashboard.admin.ironic.backend-mock.service'); ironicBackendMockService.init(); ironicAPI = $injector.get('horizon.app.core.openstack-service-api.ironic'); ironicAPI.createNode( {driver: ironicBackendMockService.params.defaultDriver}) .then(function(response) { var node = response.data; var controller = $injector.get('$controller'); controller('BasePortController', {ctrl: ctrl, node: node}); }); ironicBackendMockService.flush(); })); afterEach(function() { ironicBackendMockService.postTest(); }); it('controller should be defined', function () { expect(ctrl).toBeDefined(); }); it('base construction', function () { expect(Object.getOwnPropertyNames(ctrl).sort()).toEqual( BASE_PORT_CONTROLLER_PROPERTIES.sort()); angular.forEach( ['address', 'pxeEnabled', 'portgroup_uuid'], function(propertyName) { expect(Object.keys(ctrl[propertyName])).toContain('value'); }); expect(Object.keys(ctrl.extra)).toContain('properties'); }); it('localLinkConnectionMgr', function () { var props = ['port_id', 'switch_id', 'switch_info']; angular.forEach( props, function(propertyName) { expect(ctrl.localLinkConnection[propertyName].constructor.name) .toBe('FormField'); expect(Object.keys(ctrl.localLinkConnection[propertyName])) .toContain('value'); }); expect(Object.keys(ctrl.localLinkConnection.fields).sort()) .toEqual(props.sort()); angular.forEach( props, function(propertyName) { expect(ctrl.localLinkConnection[propertyName]) .toEqual(ctrl.localLinkConnection.fields[propertyName]); }); expect(ctrl.localLinkConnection.update).toBeDefined(); expect(ctrl.localLinkConnection.toPortAttr).toBeDefined(); expect(ctrl.localLinkConnection.setValues).toBeDefined(); expect(ctrl.localLinkConnection.disable).toBeDefined(); }); it('localLinkConnectionMgr.update', function () { ctrl.localLinkConnection.update(); expect(ctrl.localLinkConnection.port_id.required).toBe(false); expect(ctrl.localLinkConnection.switch_id.required).toBe(false); }); it('localLinkConnectionMgr.setValues', function () { var values = {port_id: 'port-id', switch_id: '00:00:00:00:00:00', switch_info: 'switch-info'}; ctrl.localLinkConnection.setValues(values); angular.forEach( Object.keys(values), function(value, key) { if (ctrl.localLinkConnection.hasOwnProperty(key)) { expect(ctrl.localLinkConnection[key].value).toEqual(values[key]); } }); }); it('localLinkConnectionMgr.update - port_id has value', function () { ctrl.localLinkConnection.setValues({port_id: 'port-id'}); ctrl.localLinkConnection.update(); expect(ctrl.localLinkConnection.port_id.required).toBe(true); expect(ctrl.localLinkConnection.switch_id.required).toBe(true); }); it('localLinkConnectionMgr.update - switch_id has value', function () { ctrl.localLinkConnection.setValues({switch_id: '00:00:00:00:00:00'}); ctrl.localLinkConnection.update(); expect(ctrl.localLinkConnection.port_id.required).toBe(true); expect(ctrl.localLinkConnection.switch_id.required).toBe(true); }); it('localLinkConnectionMgr.toPortAttr - no values', function () { expect(ctrl.localLinkConnection.toPortAttr()).toBeNull(); }); it('localLinkConnectionMgr.toPortAttr - values', function () { var values = {port_id: 'port-id', switch_id: '00:00:00:00:00:00', switch_info: 'switch-info'}; ctrl.localLinkConnection.setValues(values); expect(ctrl.localLinkConnection.toPortAttr()).toEqual(values); }); it('localLinkConnectionMgr.disable', function () { function validateDisabled(state) { angular.forEach( ['port_id', 'switch_id', 'switch_info'], function(propertyName) { expect(ctrl.localLinkConnection[propertyName]). toEqual(jasmine.objectContaining({disabled: state})); }); } validateDisabled(false); ctrl.localLinkConnection.disable(); validateDisabled(true); }); it('cancel', function () { ctrl.cancel(); expect(uibModalInstance.dismiss).toHaveBeenCalledWith('cancel'); }); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/base-port/base-port.html0000664000175000017500000000314200000000000027670 0ustar00zuulzuul00000000000000 ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.89751 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/base-portgroup/0000775000175000017500000000000000000000000026163 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/base-portgroup/base-portgroup.controller.js0000664000175000017500000000727700000000000033671 0ustar00zuulzuul00000000000000/* * Copyright 2017 Cray 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. */ (function() { 'use strict'; /** * Controller used to support operations on an Ironic portgroup */ angular .module('horizon.dashboard.admin.ironic') .controller('BasePortgroupController', BasePortgroupController); BasePortgroupController.$inject = [ '$uibModalInstance', 'horizon.dashboard.admin.ironic.validMacAddressPattern', 'horizon.dashboard.admin.ironic.validDatapathIdPattern', 'horizon.dashboard.admin.ironic.form-field.service', 'horizon.dashboard.admin.ironic.property-collection.service', 'ctrl' ]; function BasePortgroupController($uibModalInstance, validMacAddressPattern, validDatapathIdPattern, formFieldService, propertyCollectionService, ctrl) { ctrl.address = new formFieldService.FormField({ id: "macAddress", title: gettext("MAC address"), desc: gettext("MAC address for this portgroup."), pattern: new RegExp(validMacAddressPattern), value: null, autoFocus: true }); ctrl.name = new formFieldService.FormField({ id: "portgroupName", title: gettext("Name"), desc: gettext("Name for the portgroup.") }); ctrl.standalone_ports_supported = new formFieldService.FormField({ type: "radio", id: "standalonePorts", title: gettext("Standalone Ports Supported"), desc: gettext( "Specifies whether ports in this portgroup can be used as standalone ports."), // eslint-disable-line max-len options: [{label: 'True', value: true}, {label: 'False', value: false}], value: true}); var modeOptions = function(modes) { var options = []; angular.forEach(modes, function(mode) { options.push({label:mode, value: mode}); }); return options; }; ctrl.mode = new formFieldService.FormField({ type: "radio", id: "mode", title: gettext("Mode"), desc: gettext("Linux portgroup mode. For possible values refer to https://www.kernel.org/doc/Documentation/networking/bonding.txt"), // eslint-disable-line max-len options: modeOptions(['balance-rr', 'active-backup', 'balance-xor', 'broadcast', '802.3ad', 'balance-tlb', 'balance-alb']), value: 'active-backup'}); ctrl.properties = new propertyCollectionService.PropertyCollection({ id: 'properties', title: gettext('Properties'), addPropertyLabel: gettext('Add Property'), placeholder: gettext('Property Name') }); ctrl.extra = new propertyCollectionService.PropertyCollection({ id: 'extra', title: gettext('Extras'), addPropertyLabel: gettext('Add Extra'), placeholder: gettext('Property Name') }); /** * Cancel the modal * * @return {void} */ ctrl.cancel = function() { $uibModalInstance.dismiss('cancel'); }; } })(); ././@PaxHeader0000000000000000000000000000021000000000000011446 xustar0000000000000000114 path=ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/base-portgroup/base-portgroup.controller.spec.js 22 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/base-portgroup/base-portgroup.controller.spe0000664000175000017500000000350500000000000034032 0ustar00zuulzuul00000000000000/* * Copyright 2017 Cray 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. */ (function () { 'use strict'; describe('horizon.dashboard.admin.ironic.base-portgroup', function () { var uibModalInstance; var ctrl = {}; beforeEach(module('horizon.dashboard.admin.ironic')); beforeEach(module(function($provide) { $provide.value('$uibModal', {}); })); beforeEach(module(function($provide) { uibModalInstance = { dismiss: jasmine.createSpy() }; $provide.value('$uibModalInstance', uibModalInstance); })); beforeEach(inject(function($injector) { var controller = $injector.get('$controller'); controller('BasePortgroupController', {ctrl: ctrl}); })); it('controller should be defined', function () { expect(ctrl).toBeDefined(); }); it('base construction', function () { expect(Object.getOwnPropertyNames(ctrl).sort()).toEqual( BASE_PORTGROUP_CONTROLLER_PROPERTIES.sort()); angular.forEach( ['address', 'name', 'standalone_ports_supported', 'mode'], function(propertyName) { expect(Object.keys(ctrl[propertyName])).toContain('value'); }); }); it('cancel', function () { ctrl.cancel(); expect(uibModalInstance.dismiss).toHaveBeenCalledWith('cancel'); }); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/base-portgroup/base-portgroup.html0000664000175000017500000000265400000000000032031 0ustar00zuulzuul00000000000000 ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.89751 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/bootdevice/0000775000175000017500000000000000000000000025335 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/bootdevice/bootdevice.controller.js0000664000175000017500000000366200000000000032207 0ustar00zuulzuul00000000000000/* * Copyright 2017 Intel Corporation * * 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. */ (function() { 'use strict'; /** * @ngdoc controller * @name horizon.dashboard.admin.ironic:BootDeviceController * @ngController * * @description * Controller used to prompt the user for information associated with * setting the boot device of a node */ angular .module('horizon.dashboard.admin.ironic') .controller('BootDeviceController', BootDeviceController); BootDeviceController.$inject = [ '$uibModalInstance', 'horizon.app.core.openstack-service-api.ironic', 'node' ]; function BootDeviceController($uibModalInstance, ironic, node) { var ctrl = this; ctrl.modalTitle = gettext("Set Boot Device"); ironic.getSupportedBootDevices(node.uuid).then( function(bootDevices) { ctrl.supportedBootDevices = bootDevices; }); // Initialize form fields to current values ctrl.bootDevice = null; ctrl.persistent = 'False'; ironic.getBootDevice(node.uuid).then(function(device) { ctrl.bootDevice = device.boot_device; ctrl.persistent = device.persistent ? 'True' : 'False'; }); ctrl.cancel = function() { $uibModalInstance.dismiss('cancel'); }; ctrl.setSelectedBootDevice = function() { $uibModalInstance.close({device: ctrl.bootDevice, persistent: ctrl.persistent === 'True'}); }; } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/bootdevice/bootdevice.controller.spec.js0000664000175000017500000000623300000000000033135 0ustar00zuulzuul00000000000000/* * Copyright 2017 Cray 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. */ (function () { 'use strict'; describe('horizon.dashboard.admin.ironic.BootDeviceController', function () { var BOOT_DEVICE_CONTROLLER_PROPERTIES = [ 'bootDevice', 'cancel', 'modalTitle', 'persistent', 'setSelectedBootDevice', 'supportedBootDevices' ]; var uibModalInstance, ironicBackendMockService, node; var ctrl = {}; beforeEach(module('horizon.dashboard.admin.ironic')); beforeEach(module('horizon.framework.util')); beforeEach(module(function($provide) { $provide.value('$uibModal', {}); })); beforeEach(module(function($provide) { uibModalInstance = { close: jasmine.createSpy(), dismiss: jasmine.createSpy() }; $provide.value('$uibModalInstance', uibModalInstance); })); beforeEach(module(function($provide) { $provide.value('horizon.framework.widgets.toast.service', {}); })); beforeEach(module('horizon.app.core.openstack-service-api')); beforeEach(inject(function($injector) { ironicBackendMockService = $injector.get('horizon.dashboard.admin.ironic.backend-mock.service'); ironicBackendMockService.init(); var ironicAPI = $injector.get('horizon.app.core.openstack-service-api.ironic'); ironicAPI.createNode( {driver: ironicBackendMockService.params.defaultDriver}) .then(function(response) { node = response.data; var controller = $injector.get('$controller'); ctrl = controller('BootDeviceController', {node: node}); }); ironicBackendMockService.flush(); })); it('controller should be defined', function () { expect(ctrl).toBeDefined(); expect(Object.getOwnPropertyNames(ctrl).sort()).toEqual( BOOT_DEVICE_CONTROLLER_PROPERTIES.sort()); expect(ctrl.supportedBootDevices).toEqual( ironicBackendMockService.getNodeSupportedBootDevices(node.uuid)); var bootDevice = ironicBackendMockService.getNodeBootDevice(node.uuid); expect(ctrl.bootDevice).toEqual(bootDevice.boot_device); expect(ctrl.persistent).toEqual(bootDevice.persistent ? 'True' : 'False'); }); it('cancel', function () { ctrl.cancel(); expect(uibModalInstance.dismiss).toHaveBeenCalled(); }); it('setSelectedBootDevice', function () { ctrl.bootDevice = 'pxe'; ctrl.persistent = 'False'; ctrl.setSelectedBootDevice(); expect(uibModalInstance.close).toHaveBeenCalledWith( {device: ctrl.bootDevice, persistent: ctrl.persistent === 'True'}); }); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/bootdevice/bootdevice.html0000664000175000017500000000350100000000000030345 0ustar00zuulzuul00000000000000 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/bootdevice/bootdevice.service.js0000664000175000017500000000373700000000000031467 0ustar00zuulzuul00000000000000/* * Copyright 2017 Intel Corporation * * 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. */ (function() { 'use strict'; /* * @ngdoc service * @name horizon.dashboard.admin.ironic.bootdevice.service * @description Service for setting the boot device of a node */ angular .module('horizon.dashboard.admin.ironic') .factory('horizon.dashboard.admin.ironic.bootdevice.service', bootDeviceService); bootDeviceService.$inject = [ '$uibModal', 'horizon.dashboard.admin.ironic.basePath', 'horizon.app.core.openstack-service-api.ironic' ]; function bootDeviceService($uibModal, basePath, ironic) { var service = { setBootDevice: setBootDevice }; return service; /* * @description Set the boot device of a specified node * * @param {object} node - node object * @return {promise} */ function setBootDevice(node) { var promise; var options = { controller: "BootDeviceController as ctrl", backdrop: 'static', resolve: { node: function() { return node; } }, templateUrl: basePath + '/bootdevice/bootdevice.html' }; promise = $uibModal.open(options).result.then( function(result) { return ironic.nodeSetBootDevice(node.uuid, result.device, result.persistent); }); return promise; } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/bootdevice/bootdevice.service.spec.js0000664000175000017500000001036400000000000032412 0ustar00zuulzuul00000000000000/** * Copyright 2017 Cray 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. */ (function() { "use strict"; /** * @description Unit tests for the Ironic-UI boot-device service */ describe('horizon.dashboard.admin.ironic.bootdevice.service', function() { var $q, $uibModal, bootDeviceService, ironicAPI, ironicBackendMockService, defaultDriver; beforeEach(module('horizon.dashboard.admin.ironic')); beforeEach(module('horizon.framework.util')); beforeEach(module(function($provide) { $provide.value('$uibModal', { open: function() { return $q.when({device: 'pxe', persistent: true}); } }); })); beforeEach(module(function($provide) { $provide.value('horizon.framework.widgets.toast.service', { add: function() {} }); })); beforeEach(module('horizon.app.core.openstack-service-api')); beforeEach(inject(function($injector) { ironicBackendMockService = $injector.get('horizon.dashboard.admin.ironic.backend-mock.service'); ironicBackendMockService.init(); defaultDriver = ironicBackendMockService.params.defaultDriver; })); beforeEach(inject(function($injector) { $q = $injector.get('$q'); $uibModal = $injector.get('$uibModal'); ironicAPI = $injector.get('horizon.app.core.openstack-service-api.ironic'); bootDeviceService = $injector.get('horizon.dashboard.admin.ironic.bootdevice.service'); })); it('defines the bootDeviceService', function() { expect(bootDeviceService).toBeDefined(); expect(bootDeviceService.setBootDevice).toBeDefined(); }); afterEach(function() { ironicBackendMockService.postTest(); }); /** * @description Utility function that creates a node and returns * both it and its boot device * * @return {promise} Containing node and boot_device */ function createNode() { return ironicAPI.createNode({driver: defaultDriver}) .then(function(response) { return response.data; }) .then(function(node) { return ironicAPI.getBootDevice(node.uuid).then(function(device) { return {node: node, boot_device: device}; }); }); } it('setBootDevice', function() { var targetBootDevice = { device: "safe", persistent: false }; spyOn($uibModal, 'open').and.returnValue( {result: $q.when(targetBootDevice)}); createNode().then(function(data) { expect(data.node.boot_device).not.toEqual(targetBootDevice.device); bootDeviceService.setBootDevice(data.node) .then(function() { ironicAPI.getBootDevice(data.node.uuid).then(function(device) { expect(device).toEqual( {boot_device: targetBootDevice.device, persistent: targetBootDevice.persistent}); }); }) .catch(fail); }); ironicBackendMockService.flush(); }); it('setBootDevice - cancel', function() { spyOn($uibModal, 'open').and.returnValue( {result: $q.reject('cancel').catch(angular.noop)}); createNode().then(function(data) { bootDeviceService.setBootDevice(data.node) .then(fail) .catch(function() { ironicAPI.getBootDevice(data.node.uuid).then(function(device) { expect(device).toEqual(data.boot_device); }); }); }); ironicBackendMockService.flush(); }); }); })(); ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1709547098.90151 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/clean-node/0000775000175000017500000000000000000000000025217 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/clean-node/clean-node.controller.js0000664000175000017500000000406400000000000031750 0ustar00zuulzuul00000000000000/* * Copyright 2017 Cray 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. */ (function() { 'use strict'; /** * @ngdoc controller * @name horizon.dashboard.admin.ironic:CleanNodeController * @ngController * * @description * Controller used to prompt the user for a list of clean-steps * in JSON format that will be applied a node */ angular .module('horizon.dashboard.admin.ironic') .controller('CleanNodeController', CleanNodeController); CleanNodeController.$inject = [ '$uibModalInstance' ]; function CleanNodeController($uibModalInstance) { var ctrl = this; ctrl.errMsg = ''; ctrl.cancel = function() { $uibModalInstance.dismiss('cancel'); }; ctrl.clean = function(cleanSteps) { try { var steps = JSON.parse(cleanSteps); if (angular.isArray(steps) && steps.length > 0) { var valid = true; angular.forEach(steps, function(step) { if (angular.isUndefined(step.interface) || angular.isUndefined(step.step)) { valid = false; } }); if (valid) { $uibModalInstance.close(steps); } else { ctrl.errMsg = gettext('Each cleaning step must be an object that contains "interface" and "step" properties'); // eslint-disable-line max-len } } else { ctrl.errMsg = gettext('Clean steps should be an non-empty array'); } } catch (e) { ctrl.errMsg = gettext('Unable to validate the JSON input'); } }; } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1709547070.0 ironic-ui-6.3.0/ironic_ui/static/dashboard/admin/ironic/clean-node/clean-node.html0000664000175000017500000000224300000000000030113 0ustar00zuulzuul00000000000000