././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552382.0002701 magnum-ui-6.0.1/0000775000175000017500000000000000000000000013440 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/.eslintrc0000664000175000017500000000306300000000000015266 0ustar00zuulzuul00000000000000# Set up globals globals: angular: false extends: openstack # Most environment options are not explicitly enabled or disabled, only # included here for completeness' sake. They are commented out, because the # global updates.py script would otherwise override them during a global # requirements synchronization. # # Individual projects should choose which platforms they deploy to. env: # browser global variables. browser: true # Adds all of the Jasmine testing global variables for version 1.3 and 2.0. jasmine: true # Enable eslint-plugin-angular plugins: - angular # Below we adjust rules specific to horizon's usage of openstack's linting # rules, and its own plugin inclusions. rules: ############################################################################# # Disabled Rules from eslint-config-openstack ############################################################################# valid-jsdoc: [1, { requireParamDescription: false }] brace-style: 1 block-scoped-var: 1 callback-return: 1 consistent-return: 1 guard-for-in: 1 no-extra-parens: 1 no-new: 1 no-redeclare: 1 no-undefined: 1 no-unneeded-ternary: 1 no-use-before-define: 1 quote-props: 0 semi-spacing: 1 space-in-parens: 1 ############################################################################# # Angular Plugin Customization ############################################################################# angular/controller-as-vm: - 1 - "ctrl" # Remove after migrating to angular 1.4 or later. angular/no-cookiestore: - 1 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/.zuul.yaml0000664000175000017500000000066000000000000015403 0ustar00zuulzuul00000000000000- project: templates: - check-requirements - horizon-non-primary-django-jobs - horizon-nodejs10-jobs - openstack-lower-constraints-jobs-horizon - openstack-python3-ussuri-jobs-horizon - publish-openstack-docs-pti - release-notes-jobs-python3 check: jobs: - openstack-tox-py36: voting: false required-projects: - openstack/horizon ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552381.0 magnum-ui-6.0.1/AUTHORS0000664000175000017500000000455500000000000014521 0ustar00zuulzuul00000000000000Adrian Otto Akihiro Motoki Andreas Jaeger Andreas Jaeger Andrei Nistor Bharat Kunwar Bharat Kunwar Bradley Jones Cao Xuan Hoang Charles Short Doug Hellmann Erik Olof Gunnar Andersson Feilong Wang Flavio Percoco Ghanshyam Mann Hongbin Lu Ian Wienand Ivan Kolodyazhny Jake Yip Kenji Ishii Mateusz Kowalski Monty Taylor Nguyen Hung Phuong Nguyen Van Trung OTSUKA, Yuanying Ondřej Nový OpenStack Release Bot PrivateRookie <996514515@qq.com> Qian Min Chen Rob Cresswell Ryosuke Mizuno Sean McGinnis Shu Muto Shu Muto Simon Merrick Spyros Trigazis Sungjin Knag Tobias Urdin Vieri <15050873171@163.com> Vu Cong Tuan Xinliang Liu ZhijunWei avnish chenjiao fengbeihong gecong1973 howardlee huang.zhiping imran malik jacky06 manchandavishal melissaml nizam pengyuesheng qingszhao ricolin shangxiaobj shu-mutou ting.wang wangqi wangqiangbj xiangxinyong xiaojueguan yangle zhangdebo ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/CONTRIBUTING.rst0000664000175000017500000000107200000000000016101 0ustar00zuulzuul00000000000000If you would like to contribute to the development of OpenStack, you must follow the steps in this page: https://docs.openstack.org/infra/manual/developers.html Once those steps have been completed, changes to OpenStack should be submitted for review via the Gerrit tool, following the workflow documented at: https://docs.openstack.org/infra/manual/developers.html#development-workflow Pull requests submitted through GitHub will be ignored. Bugs should be filed on Storyboard, not GitHub: https://storyboard.openstack.org/#!/project/openstack/magnum-ui ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552381.0 magnum-ui-6.0.1/ChangeLog0000664000175000017500000004657000000000000015226 0ustar00zuulzuul00000000000000CHANGES ======= 6.0.1 ----- * Fix cluster resize * Fix npm jobs * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Update TOX\_CONSTRAINTS\_FILE for stable/ussuri * Update .gitreview for stable/ussuri 6.0.0 ----- * Imported Translations from Zanata * Use unittest.mock instead of third party mock * Imported Translations from Zanata * Add pytest requirement to fix jobs * Use default-worker instead of production\_group * Imported Translations from Zanata * Imported Translations from Zanata * Fix pyScss version in lower-constraints.txt * Remove six usage * Imported Translations from Zanata * Fix failure of installing magnum-ui plugin with devstack * Drop Django 1.11 support * Imported Translations from Zanata * translation: drop babel extractor definitions * Add requirements.txt to docs reqs * Improve cluster launch workflow * Register the Cluster Upgrade view * Add rolling upgrade ui * Add ui for resizing clusters * Add fedora-coreos distro * Set empty default value for docker\_storage\_driver * Add missing hidden option to cluster template * [ussuri][goal] Drop python 2.7 support and testing * Use Horizon project template for django jobs * Update master for stable/train * Generate PDF documentation * Update the constraints url 5.2.0 ----- * Update sphinx dependency * Imported Translations from Zanata * Changes for url transition to OpenDev * OpenDev Migration Patch * Dropping the py35 testing * Update master for stable/stein 5.1.0 ----- * Imported Translations from Zanata * Replace openstack.org git:// URLs with https:// * Imported Translations from Zanata * Add nodejs10 jobs on bionic * Switch to horizon-nodejs4-jobs template * Add release notes for stein * Update json module to jsonutils * Imported Translations from Zanata * Update hacking version * Update the bugs link to storyboard * Imported Translations from Zanata * Change openstack-dev to openstack-discuss * Bump horizon for Stein * Update http link to https link * Change openstack-dev to openstack-discuss * Imported Translations from Zanata * fix typo in releasenotes * Fix cluster update instead of cluster template update * fix text for master flavor / node flavor * Imported Translations from Zanata * Fix image URL for cluster template overview * Imported Translations from Zanata * Imported Translations from Zanata * Use initial maps for supported network and volume drivers * Display master\_flavor\_id and flavor\_id when updating cluster * Limit cluster update properties * Support api-version when building client * Add blueprints link in documents * fix tox python3 overrides * Imported Translations from Zanata * Add upper-constraints.txt into post-install * Support Calico as network driver for k8s * Disable rotate certificate * Cleanup .zuul.yaml * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * When selecting a image for cluster, many invalid images are shown. If a project has a lot of images, options can be quite long, and cause wrong selctiong by mistake. So I add a filter after fetching images, now images that has "os\_distro" property and it's value is one of "fedora-atomic", "coreos" and "ubuntu" are shown * Add swarm-mode as COE * Imported Translations from Zanata * Imported Translations from Zanata * Fix JS error on routed-details-view when execute show-certificate * switch documentation job to new PTI * import zuul job settings from project-config * Fix show certificate button returning invalid CA * Remove mox3 from doc/requirements.txt * Imported Translations from Zanata * Update reno for stable/rocky * Drop nose dependencies * Imported Translations from Zanata 5.0.0 ----- * Imported Translations from Zanata * Prepare to support python3.6 * fix tox python3 overrides * Add release notes for Rocky * Modify the 'tox.ini' file * Add Apple OS X ".DS\_Store" to ".gitignore" file * Modify the '.gitignore' file * Clear selections for table view * Add python3 django 1.11 job instead of django 2.0 job * Rename test files to test\_\* pattern * Imported Translations from Zanata * Fix postinstall for npm job * Add py35dj20 job * Imported Translations from Zanata * Remove mox3 from test-requirements.txt * Fix tox jobs and remove tox\_helper.sh * Fix unicode type judgment * Follow the new PTI for document build * Imported Translations from Zanata * Imported Translations from Zanata * Bump min version of magnumclient * Imported Translations from Zanata * Imported Translations from Zanata * Reproduce navigations * Install Horizon from git repository in tox test * Imported Translations from Zanata * Enable to update Lables for cluster template * Add update action for quotas * Add delete action for quota * Add create action for quotas * Add quotas panel for admin * Add releasenotes links to README * Drop testenvs using django<=1.10 from tox * Updated from global requirements * add lower-constraints job * Add documentation link to README * Updated from global requirements * Install horizon directly from pypi * Imported Translations from Zanata * Updated from global requirements * Updated from global requirements * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Update reno for stable/queens 4.0.0 ----- * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Add release notes for Queens * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Remove link to Stack * Updated from global requirements * Imported Translations from Zanata * Add javascript tests * Add stats and quota information for cluster table view * Use text-download service on horizon * Imported Translations from Zanata * Fix issue the deleted item is selected again with batch delete * Remove empty file * Imported Translations from Zanata * Fix update for labels * Add flavor, master flavor and labels for cluster create * Add insecure\_registry for cluster template * Add noValue filter for cluster template parameters * Show flavor\_id on cluster details view * Add APIs for Quotas * Imported Translations from Zanata * Add attributes for cluster to show * Use load-edit directive for Sign Certificate action * Add '.idea' into .gitignore * Imported Translations from Zanata * Remove setting of version/release from releasenotes * Updated from global requirements * Drop django\_openstack\_auth from requirements.txt * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Update and replace http with https for doc links * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Update reno for stable/pike 3.0.0 ----- * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Fixed typo * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Add release notes for Pike * Imported Translations from Zanata * Fix update action * Updated from global requirements * Imported Translations from Zanata * Imported Translations from Zanata * Use pbr autodoc feature rather than custom logic * Add configuration guide into docs * rearrange existing documentation to fit the new standard layout * Add REST API for stats list * Add CA rotate action for cluster * Add rollback option for cluster * Add docker volume size option for cluster * Imported Translations from Zanata * Fix URLs for each resource * Updated from global requirements * Switch from oslosphinx to openstackdocstheme * Updated from global requirements * Improve docs build * Clean up doc/ and releasenotes/ * Imported Translations from Zanata * hacking: Specify white list rules in noqa explicity * ignore nose test results * Imported Translations from Zanata * Imported Translations from Zanata * Fix html\_last\_updated\_fmt for Python3 * Modify some spelling mistakes * Updated from global requirements * Change inputs for networks of cluster template into pulldowns * Set keypair properly on Create Cluster dialog * Imported Translations from Zanata * Updated from global requirements * Updated from global requirements * Add dcos support for magnum-ui * Updated from global requirements * Fix breadcrumbs * Refresh test environment * Updated from global requirements * Updated from global requirements * Use detailRoute constant for path of details view * Updated from global requirements * Change http into https for home-page * Update test requirement * Updated from global requirements * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Update reno for stable/ocata * Remove support for py34 * Imported Translations from Zanata 2.2.0 ----- * Ocata summary release notes * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Remove Xstatic packages from requirements * Imported Translations from Zanata * Imported Translations from Zanata * Fixed typo in the name "Overlay" * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Fix typo * Add release notes for update actions * Add update action for cluster * Change cluster creating action for using json schema * Add update action for cluster template * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Add release notes for Ocata * Imported Translations from Zanata * Change cluster\_template creating action for using json schema * Updated from global requirements * Imported Translations from Zanata * Add Python 3.5 classifier and venv * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Using sys.exit(main()) instead of main() * Set reasonable name to browser title bar * Use horizon's common "views" for Angular * Imported Translations from Zanata * Update $modal to $uibModal * Imported Translations from Zanata * Imported Translations from Zanata * Use initAction instead initScope * Change creation actions to global * Imported Translations from Zanata * Create template without keypair and fix REST data * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Allow keypair in cluster creation * Remove mox in helpers.py * Imported Translations from Zanata * Imported Translations from Zanata * Show team and repo badges on README * Imported Translations from Zanata * Imported Translations from Zanata * Add CONTRIBUTING.rst * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Add javascript tests for deleteClustersDeleteService * Update karma coverage threshold values * Add javascript tests for clusterOverviewController * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Add javascript tests for clusterCreate * Change javascript tests for templateSpecController * Updated from global requirements * Imported Translations from Zanata * Add javascript tests for clusterSignCertificate model and service * Add javascript tests for clusterCreateInfoController * Don't include openstack/common in flake8 exclude list * Drop MANIFEST.in - it's not needed by pbr * Add javascript tests for clusterShowCertificateService * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Add javascript tests for ClusterTemplateCreateService * fix typo * Add javascript tests for templateOverviewController * Add javascript tests for ClusterTemplateModel * Imported Translations from Zanata * Add javascript tests for deleteClusterTemplateDeleteService * Imported Translations from Zanata * Imported Translations from Zanata * Enable release notes translation * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Add javascript tests for create label/network/spec * Add javascript tests for createClusterTemplateInfoController * Imported Translations from Zanata * Updated from global requirements * Add Apache 2.0 license to source file * Fix URL for release notes in docs * Updated from global requirements * Imported Translations from Zanata * Remove unnecessary magnum\_ui/models.py file * Move listFunction and add javascript tests for cluster services * Fix column label on cluster table * Use Chrome for JS unit tests * Imported Translations from Zanata * Imported Translations from Zanata * Add javascript test for magnum.service.js * Add release notes for Newton * Add javascript tests for actions.modules.js * Update home page link in cfg file 2.1.0 ----- * Imported Translations from Zanata * Add reno for releasenotes management * Ignore node\_modules in pep8 * Fix showing Cluster Template info on Cluster details * Imported Translations from Zanata * Add .mo to .gitignore * Restrain a unnecessary request when a user click a panel * Shorten panel group caption * Add a file in karma.conf to pass js tests * Clean imports in code * Cleanup the test settings * Imported Translations from Zanata * Enable test coverage in run\_test.sh and tox * Imported Translations from Zanata * Fix eslint errors on Clusters and the others * Reorder item actions for cluster * Use "cluster" and "cluster\_template" of magnumclient * Fix eslint errors on Cluster Templates * Setup JavaScript test environment * Imported Translations from Zanata * Add sign certificate action to cluster panel * Add show certification action to cluster panel * Imported Translations from Zanata * Imported Translations from Zanata * Add REST api for Certificates * Imported Translations from Zanata * Revirt removing REST API loading * Use BadRequest in REST API * Revert "Clean up $scope usage" * Imported Translations from Zanata 2.0.0 ----- * Fix tox and tests * Imported Translations from Zanata * Fix typo for bp/cluster-template-options * Imported Translations from Zanata * Fix typo * Clean up $scope usage * Add cluster template options * Rename bay and baymodel for 'Soft StringFreeze' milestone * Fix typo * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Use upper constraints for all jobs in tox.ini * Updated from global requirements * Add insecure/ca-cert option for magnumclient * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Use Horizon's Angular registry of Actions and Views * Updated from global requirements * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * Move enabled files * Rename service to 'container-infra' * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Updated from global requirements * Move magic-search bar out of the table structure * Updated from global requirements * Remove Container panel and action * Imported Translations from Zanata * Fix translation test * Imported Translations from Zanata * Remove version number to fix build 1.0.0 ----- * tox tests should respect upper-constraints.txt * Imported Translations from Zanata * Imported Translations from Zanata * Re-fix workflow styles * Fix workflow display and markup * Add Create Container action into Bay item action * Imported Translations from Zanata * Remove unused attribute "ssh\_authorized\_key" * Imported Translations from Zanata * Add setup description in DevStack * Fix Devstack and Magnum-ui interaction * Add DevStack plugin * Imported Translations from Zanata * Add actions to Bay detail view * Imported Translations from Zanata * Fix styles of table views * Add actions to Container detail view * Remove py27dj17 from tox.ini * Specify pbr version of magnum-ui * Imported Translations from Zanata * Imported Translations from Zanata * Add Create Bay action into BayModel item action * Refactor actions in Container table * Use action register service for BayModel actions * Refactor actions in Bay table * Remove unnecessary import lines from scss files * Remove unused pngmath Sphinx extension * Add missing tag in BayModel table view * Add actions to BayModel detail view * Remove unnecessary translate attribute for docker\_volume\_size * Add volume\_driver attribute to baymodel * Refactor actions in BayModel table view * Show human readable size and units * Imported Translations from Zanata * Update URLs to Django 1.8 style * Display "None" for "name" of the resource created without name * Add Bay Model Create View * Remove html5mode and hashPrefix setting from $locationProvider * Add link to bay view in create container dialog * Add link to baymodel view in create bay dialog * Replace deprecated library function os.popen() with subprocess * Imported Translations from Zanata * Add 'network-driver' and 'labels' to baymodel * Add stack\_id to bay detail view * Imported Translations from Zanata * Fix H405 violations * Use Horizon's plugin registration system * Add detail view for container * Change "a" tag to "button" tag for "Create" button * Imported Translations from Zanata * Support "null" to Bay Create Timeout in bay detail view * Imported Translations from Zanata * Imported Translations from Zanata * Remove py26 and py33 support from setup.cfg * Deprecated tox -downloadcache option removed * Add "WEBROOT" variable to "base" tag in template HTML * Imported Translations from Zanata * Remove unnecessary translate attribute from bay detail view * Imported Translations from Zanata * Add detail view for bay * Add detail view for baymodel * Add REST API to get single baymodel * Add REST API to get single container * Add REST API to get single bay * Imported Translations from Zanata * Add create action to containers panel * Remove unnecessary double quote from bay create dialog * Refactor translate attribute and gettext() in bay panel * Add {$$} markup into hz-page-header's header attribute * Remove extra "translate" attribute from bay-create workflow * Imported Translations from Zanata * Imported Translations from Zanata * Proper translation integration * Translation setup * Add Magic Search to Containers table * Add a panel and table to display Containers * Add Magic Search into Bay table * Add Magic Search into Bay Model table * Revice REST APIs * Add create action to bay panel * Add API for container create, delete, list, show * Add table view for Bay * Bay REST API * Fix select all button in table view * Add Bay Model Table View * The function name mistake in "api.rest.magnum" * API for Bays * API for BayModel * Add magnum api client * Fix setup.cfg * Initial skeleton repo * Added .gitreview ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/LICENSE0000664000175000017500000002363700000000000014460 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. ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552382.0002701 magnum-ui-6.0.1/PKG-INFO0000664000175000017500000000712500000000000014542 0ustar00zuulzuul00000000000000Metadata-Version: 1.1 Name: magnum-ui Version: 6.0.1 Summary: Magnum User Interface Home-page: https://docs.openstack.org/developer/magnum-ui/ Author: OpenStack Author-email: openstack-discuss@lists.openstack.org License: UNKNOWN Description: ======================== Team and repository tags ======================== .. image:: https://governance.openstack.org/tc/badges/magnum-ui.svg :target: https://governance.openstack.org/tc/reference/tags/index.html .. Change things from this point on ========= Magnum UI ========= Horizon plugin for Magnum * Free software: Apache license * Source: https://opendev.org/openstack/magnum-ui * Bugs: https://bugs.launchpad.net/magnum-ui * Documentation: https://docs.openstack.org/magnum-ui/latest/ * Release notes: https://docs.openstack.org/releasenotes/magnum-ui/ Enabling in DevStack -------------------- Add this repo as an external repository into your ``local.conf`` file:: [[local|localrc]] enable_plugin magnum-ui https://github.com/openstack/magnum-ui Manual Installation ------------------- Begin by cloning the Horizon and Magnum UI repositories:: git clone https://github.com/openstack/horizon git clone https://github.com/openstack/magnum-ui Create a virtual environment and install Horizon dependencies:: cd horizon python tools/install_venv.py Set up your ``local_settings.py`` file:: cp openstack_dashboard/local/local_settings.py.example openstack_dashboard/local/local_settings.py Open up the copied ``local_settings.py`` file in your preferred text editor. You will want to customize several settings: - ``OPENSTACK_HOST`` should be configured with the hostname of your OpenStack server. Verify that the ``OPENSTACK_KEYSTONE_URL`` and ``OPENSTACK_KEYSTONE_DEFAULT_ROLE`` settings are correct for your environment. (They should be correct unless you modified your OpenStack server to change them.) Install Magnum UI with all dependencies in your virtual environment:: tools/with_venv.sh pip install -e ../magnum-ui/ And enable it in Horizon:: cp ../magnum-ui/magnum_ui/enabled/_1370_project_container_infra_panel_group.py openstack_dashboard/local/enabled cp ../magnum-ui/magnum_ui/enabled/_1371_project_container_infra_clusters_panel.py openstack_dashboard/local/enabled cp ../magnum-ui/magnum_ui/enabled/_1372_project_container_infra_cluster_templates_panel.py openstack_dashboard/local/enabled To run horizon with the newly enabled Magnum UI plugin run:: python manage.py runserver 0.0.0.0:8080 to have the application start on port 8080 and the horizon dashboard will be available in your browser at http://localhost:8080/ 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 :: 3 Classifier: Programming Language :: Python :: 3.6 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/README.rst0000664000175000017500000000457700000000000015144 0ustar00zuulzuul00000000000000======================== Team and repository tags ======================== .. image:: https://governance.openstack.org/tc/badges/magnum-ui.svg :target: https://governance.openstack.org/tc/reference/tags/index.html .. Change things from this point on ========= Magnum UI ========= Horizon plugin for Magnum * Free software: Apache license * Source: https://opendev.org/openstack/magnum-ui * Bugs: https://bugs.launchpad.net/magnum-ui * Documentation: https://docs.openstack.org/magnum-ui/latest/ * Release notes: https://docs.openstack.org/releasenotes/magnum-ui/ Enabling in DevStack -------------------- Add this repo as an external repository into your ``local.conf`` file:: [[local|localrc]] enable_plugin magnum-ui https://github.com/openstack/magnum-ui Manual Installation ------------------- Begin by cloning the Horizon and Magnum UI repositories:: git clone https://github.com/openstack/horizon git clone https://github.com/openstack/magnum-ui Create a virtual environment and install Horizon dependencies:: cd horizon python tools/install_venv.py Set up your ``local_settings.py`` file:: cp openstack_dashboard/local/local_settings.py.example openstack_dashboard/local/local_settings.py Open up the copied ``local_settings.py`` file in your preferred text editor. You will want to customize several settings: - ``OPENSTACK_HOST`` should be configured with the hostname of your OpenStack server. Verify that the ``OPENSTACK_KEYSTONE_URL`` and ``OPENSTACK_KEYSTONE_DEFAULT_ROLE`` settings are correct for your environment. (They should be correct unless you modified your OpenStack server to change them.) Install Magnum UI with all dependencies in your virtual environment:: tools/with_venv.sh pip install -e ../magnum-ui/ And enable it in Horizon:: cp ../magnum-ui/magnum_ui/enabled/_1370_project_container_infra_panel_group.py openstack_dashboard/local/enabled cp ../magnum-ui/magnum_ui/enabled/_1371_project_container_infra_clusters_panel.py openstack_dashboard/local/enabled cp ../magnum-ui/magnum_ui/enabled/_1372_project_container_infra_cluster_templates_panel.py openstack_dashboard/local/enabled To run horizon with the newly enabled Magnum UI plugin run:: python manage.py runserver 0.0.0.0:8080 to have the application start on port 8080 and the horizon dashboard will be available in your browser at http://localhost:8080/ ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/babel-django.cfg0000664000175000017500000000005400000000000016425 0ustar00zuulzuul00000000000000[python: **.py] [django: templates/**.html] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/babel-djangojs.cfg0000664000175000017500000000006100000000000016760 0ustar00zuulzuul00000000000000[javascript: **.js] [angular: **/static/**.html] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9642718 magnum-ui-6.0.1/devstack/0000775000175000017500000000000000000000000015244 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/devstack/plugin.sh0000664000175000017500000000370000000000000017076 0ustar00zuulzuul00000000000000# plugin.sh - DevStack plugin.sh dispatch script magnum-ui MAGNUM_UI_DIR=$(cd $(dirname $BASH_SOURCE)/.. && pwd) function install_magnum_ui { # NOTE(shu-mutou): workaround for devstack bug: 1540328 # where devstack install 'test-requirements' but should not do it # for magnum-ui project as it installs Horizon from url. # Remove following two 'mv' commands when mentioned bug is fixed. mv $MAGNUM_UI_DIR/test-requirements.txt $MAGNUM_UI_DIR/_test-requirements.txt setup_develop ${MAGNUM_UI_DIR} mv $MAGNUM_UI_DIR/_test-requirements.txt $MAGNUM_UI_DIR/test-requirements.txt } function configure_magnum_ui { cp -a ${MAGNUM_UI_DIR}/magnum_ui/enabled/* ${DEST}/horizon/openstack_dashboard/local/enabled/ # NOTE: If locale directory does not exist, compilemessages will fail, # so check for an existence of locale directory is required. if [ -d ${MAGNUM_UI_DIR}/magnum_ui/locale ]; then (cd ${MAGNUM_UI_DIR}/magnum_ui; DJANGO_SETTINGS_MODULE=openstack_dashboard.settings $PYTHON ../manage.py compilemessages) fi } # check for service enabled if is_service_enabled magnum-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 Magnum UI" install_magnum_ui elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then # Configure after the other layer 1 and 2 services have been configured echo_summary "Configuring Magnum UI" configure_magnum_ui 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=1627552348.0 magnum-ui-6.0.1/devstack/settings0000664000175000017500000000007600000000000017032 0ustar00zuulzuul00000000000000# settings file for magnum-ui plugin enable_service magnum-ui ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9642718 magnum-ui-6.0.1/doc/0000775000175000017500000000000000000000000014205 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/doc/Makefile0000664000175000017500000001270000000000000015645 0ustar00zuulzuul00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Cisco.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Cisco.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/Cisco" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Cisco" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any error in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/doc/requirements.txt0000664000175000017500000000126200000000000017472 0ustar00zuulzuul00000000000000# The order of packages is significant, because pip processes them in the order # of appearance. Changing the order has an impact on the overall integration # process, which may cause wedges in the gate later. # Order matters to the pip dependency resolver, so sorting this file # changes how packages are installed. New dependencies should be # added in alphabetical order, however, some dependencies may need to # be installed in a specific order. # openstackdocstheme>=1.18.1 # Apache-2.0 reno>=2.5.0 # Apache-2.0 sphinx!=1.6.6,!=1.6.7,!=2.1.0,>=1.6.2;python_version>='3.4' # BSD sphinxcontrib-apidoc>=0.2.0 # BSD # NOTE: The following are required as horizon.test.settings loads it. ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9642718 magnum-ui-6.0.1/doc/source/0000775000175000017500000000000000000000000015505 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/doc/source/conf.py0000664000175000017500000002553700000000000017020 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. # # Horizon documentation build configuration file, created by # sphinx-quickstart on Thu Oct 27 11:38:59 2011. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. from __future__ import print_function import os import sys import django from magnum_ui import version as magnumui_ver BASE_DIR = os.path.dirname(os.path.abspath(__file__)) ROOT = os.path.abspath(os.path.join(BASE_DIR, "..", "..")) sys.path.insert(0, ROOT) # This is required for ReadTheDocs.org, but isn't a bad idea anyway. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'magnum_ui.test.settings') # 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() # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.insert(0, os.path.abspath('.')) # -- General configuration ---------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. # They can be extensions coming with Sphinx (named 'sphinx.ext.*') # or your custom ones. extensions = ['sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.viewcode', 'openstackdocstheme', 'sphinxcontrib.apidoc', ] # Add any paths that contain templates here, relative to this directory. # templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Magnum UI' copyright = u'2015, Cisco Systems, Inc.' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = magnumui_ver.version_info.version_string() # The full version, including alpha/beta/rc tags. release = magnumui_ver.version_info.release_string() # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['**/#*', '**~', '**/#*#'] # The reST default role (used for this markup: `text`) # to use for all documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] primary_domain = 'py' nitpicky = False # sphinxcontrib-apidoc apidoc_module_dir = '../../magnum_ui' apidoc_output_dir = 'contributor/api' apidoc_excluded_paths = [ 'test', ] # -- Options for HTML output -------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'openstackdocs' # openstackdocstheme options repository_name = 'openstack/magnum-ui' bug_project = 'magnum-ui' bug_tag = '' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = [''] # Must set this variable to include year, month, day, hours, and minutes. html_last_updated_fmt = '%Y-%m-%d %H:%M' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'Horizondoc' # -- Options for LaTeX output ------------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # openany: Skip blank pages in generated PDFs 'extraclassoptions': 'openany,oneside', 'makeindex': '', 'printindex': '', 'preamble': r'\setcounter{tocdepth}{3}', } # Disable usage of xindy https://bugzilla.redhat.com/show_bug.cgi?id=1643664 # Some distros are missing xindy 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-magnum-ui.tex', u'Magnum UI Documentation', u'OpenStack Foundation', 'howto', True), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output ------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', u'Magnum UI Documentation', 'Documentation for the Magnum UI plugin to the Openstack\ Dashboard (Horizon)', [u'OpenStack'], 1) ] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for Texinfo output ----------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'Horizon', u'Horizon Documentation', u'OpenStack', 'Horizon', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' # -- Options for Epub output -------------------------------------------------- # Bibliographic Dublin Core info. epub_title = u'Horizon' epub_author = u'OpenStack' epub_publisher = u'OpenStack' epub_copyright = u'2012, OpenStack' # The language of the text. It defaults to the language option # or en if the language is not set. # epub_language = '' # The scheme of the identifier. Typical schemes are ISBN or URL. # epub_scheme = '' # The unique identifier of the text. This can be an ISBN number # or the project homepage. # epub_identifier = '' # A unique identification for the text. # epub_uid = '' # A tuple containing the cover image and cover page html template filenames. # epub_cover = () # HTML files that should be inserted before the pages created by sphinx. # The format is a list of tuples containing the path and title. # epub_pre_files = [] # HTML files shat should be inserted after the pages created by sphinx. # The format is a list of tuples containing the path and title. # epub_post_files = [] # A list of files that should not be packed into the epub file. # epub_exclude_files = [] # The depth of the table of contents in toc.ncx. # epub_tocdepth = 3 # Allow duplicate toc entries. # epub_tocdup = True ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9642718 magnum-ui-6.0.1/doc/source/configuration/0000775000175000017500000000000000000000000020354 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/doc/source/configuration/index.rst0000664000175000017500000000625300000000000022223 0ustar00zuulzuul00000000000000============= Configuration ============= Magnum UI specific settings =========================== CLUSTER_TEMPLATE_GROUP_FILTERS ------------------------------ .. versionadded:: 5.3.0 (Ussuri) Default: ``None`` Examples: .. code-block:: python CLUSTER_TEMPLATE_GROUP_FILTERS = { "dev": ".*-dev-.*", "prod": ".*-prod-.*" } The settings expects a dictionary of group name, to group regex. When set allows a cloud provider to specify template groups for their cluster templates based on their naming convention. This helps limit users from upgrading their cluster to an invalid template that will not work based on their current template type. This filtering is only relevant when choosing a new template for upgrading a cluster. MAGNUM_INGRESS_CONTROLLERS -------------------------- .. versionadded:: 5.3.0 (Ussuri) Default: ``None`` Examples: .. code-block:: python MAGNUM_INGRESS_CONTROLLERS = [ { "name": "NGINX", "labels": { "ingress_controller": "nginx" } }, { "name": "Traefik", "labels": { "ingress_controller": "traefik" } }, { "name": "Octavia", "labels": { "ingress_controller": "octavia" } } ] This setting specifies which `Kubernetes Ingress Controllers `__ are supported by the deployed version of magnum and map directly to the response returned by the magnum-ui `api/container-infra/ingress_controllers` endpoint. MAGNUM_AVAILABLE_ADDONS ----------------------- .. versionadded:: 5.3.0 (Ussuri) Default: ``None`` Examples: .. code-block:: python MAGNUM_AVAILABLE_ADDONS = [ { "name": "Kubernetes Dashboard", "selected": True, "labels": { "kube_dashboard_enabled": True }, "labels_unselected": { "kube_dashboard_enabled": False } }, { "name": "Influx Grafana Dashboard", "selected": False, "labels": { "influx_grafana_dashboard_enabled": True }, "labels_unselected": { "influx_grafana_dashboard_enabled": False } } ] Specifies which 'Addon Software' is available or supported in the deployed version of magnum and specifies which labels need to be included in order to enable or disable the Software Addon. Examples of `Addon Software` include but are not limited to: * `Kubernetes Dashboard `__ * `Influx Grafana Dashboard `__ Values specified in the ``MAGNUM_AVAILABLE_ADDONS`` setting map directly to the values returned in the response of the `api/container-infra/available_addons` endpoint. Horizon Settings ================ For more configurations, see `Configuration Guide `__ in the Horizon documentation. ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9642718 magnum-ui-6.0.1/doc/source/contributor/0000775000175000017500000000000000000000000020057 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/doc/source/contributor/api.rst0000664000175000017500000000016500000000000021364 0ustar00zuulzuul00000000000000===================== Source Code Reference ===================== .. toctree:: :maxdepth: 1 :glob: api/* ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/doc/source/contributor/index.rst0000664000175000017500000000040300000000000021715 0ustar00zuulzuul00000000000000================= Contributor Guide ================= There is no topic specific to Magnum UI now. See `Horizon Developer Documents `__ ---- .. toctree:: :glob: :maxdepth: 1 api ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/doc/source/index.rst0000664000175000017500000000101100000000000017337 0ustar00zuulzuul00000000000000========= Magnum UI ========= Horizon plugin for Magnum * Free software: Apache license * Source: https://opendev.org/openstack/magnum-ui * Blueprints: https://blueprints.launchpad.net/magnum-ui * Bugs: https://bugs.launchpad.net/magnum-ui User Documentation ------------------ .. toctree:: :maxdepth: 2 install/index configuration/index Release Notes Contributor Guide ----------------- .. toctree:: :glob: :maxdepth: 2 contributor/index ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9642718 magnum-ui-6.0.1/doc/source/install/0000775000175000017500000000000000000000000017153 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/doc/source/install/index.rst0000664000175000017500000000355100000000000021020 0ustar00zuulzuul00000000000000============ Installation ============ Enabling in DevStack -------------------- Add this repo as an external repository into your ``local.conf`` file:: [[local|localrc]] enable_plugin magnum-ui https://github.com/openstack/magnum-ui Manual Installation ------------------- Begin by cloning the Horizon and Magnum UI repositories:: git clone https://github.com/openstack/horizon git clone https://github.com/openstack/magnum-ui Create a virtual environment and install Horizon dependencies:: cd horizon python tools/install_venv.py Set up your ``local_settings.py`` file:: cp openstack_dashboard/local/local_settings.py.example openstack_dashboard/local/local_settings.py Open up the copied ``local_settings.py`` file in your preferred text editor. You will want to customize several settings: - ``OPENSTACK_HOST`` should be configured with the hostname of your OpenStack server. Verify that the ``OPENSTACK_KEYSTONE_URL`` and ``OPENSTACK_KEYSTONE_DEFAULT_ROLE`` settings are correct for your environment. (They should be correct unless you modified your OpenStack server to change them.) Install Magnum UI with all dependencies in your virtual environment:: tools/with_venv.sh pip install -e ../magnum-ui/ And enable it in Horizon:: cp ../magnum-ui/magnum_ui/enabled/_1370_project_container_infra_panelgroup.py openstack_dashboard/local/enabled cp ../magnum-ui/magnum_ui/enabled/_1371_project_container_infra_clusters_panel.py openstack_dashboard/local/enabled cp ../magnum-ui/magnum_ui/enabled/_1372_project_container_infra_cluster_templates_panel.py openstack_dashboard/local/enabled To run horizon with the newly enabled Magnum UI plugin run:: python manage.py runserver 0.0.0.0:8080 to have the application start on port 8080 and the horizon dashboard will be available in your browser at http://localhost:8080/ ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/lower-constraints.txt0000664000175000017500000000551400000000000017703 0ustar00zuulzuul00000000000000alabaster==0.7.10 appdirs==1.4.3 asn1crypto==0.24.0 Babel==2.3.4 certifi==2018.1.18 cffi==1.11.5 chardet==3.0.4 cliff==2.11.0 cmd2==0.8.1 colorama==0.3.9 contextlib2==0.5.5 coverage==4.0 cryptography==2.1.4 debtcollector==1.19.0 decorator==4.2.1 deprecation==2.0 Django==2.2 django-appconf==1.0.2 django-babel==0.6.2 django-compressor==2.0 django-pyscss==2.0.2 docutils==0.14 dogpile.cache==0.6.5 dulwich==0.19.0 extras==1.0.0 fasteners==0.14.1 fixtures==3.0.0 flake8==2.5.5 futurist==1.6.0 hacking==0.12.0 horizon==17.1.0 idna==2.6 imagesize==1.0.0 iso8601==0.1.12 Jinja2==2.10 jmespath==0.9.3 jsonpatch==1.21 jsonpointer==2.0 jsonschema==2.6.0 keystoneauth1==3.4.0 linecache2==1.0.0 MarkupSafe==1.0 mccabe==0.2.1 mock==2.0.0 monotonic==1.4 msgpack==0.5.6 munch==2.2.0 netaddr==0.7.19 netifaces==0.10.6 nodeenv==0.9.4 openstackdocstheme==1.18.1 openstacksdk==0.12.0 os-client-config==1.29.0 os-service-types==1.2.0 osc-lib==1.10.0 oslo.concurrency==3.26.0 oslo.config==5.2.0 oslo.context==2.20.0 oslo.i18n==3.20.0 oslo.log==3.37.0 oslo.policy==1.34.0 oslo.serialization==2.18.0 oslo.utils==3.36.0 osprofiler==2.3.0 packaging==17.1 pbr==2.0.0 pep8==1.5.7 Pint==0.8.1 prettytable==0.7.2 pycparser==2.18 pyflakes==0.8.1 Pygments==2.2.0 pyinotify==0.9.6 pymongo==3.6.1 pyOpenSSL==17.5.0 pyparsing==2.2.0 pyperclip==1.6.0 pyScss==1.3.7 pytest==5.3.5 python-cinderclient==5.0.0 python-dateutil==2.7.0 python-glanceclient==2.9.1 python-heatclient==1.18.0 python-keystoneclient==3.22.0 python-magnumclient==2.15.0 # Apache-2.0 python-mimeparse==1.6.0 python-neutronclient==6.7.0 python-novaclient==10.1.0 python-swiftclient==3.5.0 pytz==2018.3 PyYAML==3.12 rcssmin==1.0.6 reno==2.5.0 requests==2.18.4 requestsexceptions==1.4.0 rfc3986==1.1.0 rjsmin==1.0.12 selenium==2.50.1 semantic-version==2.6.0 simplejson==3.13.2 six==1.11.0 snowballstemmer==1.2.1 Sphinx==1.6.2 sphinxcontrib-apidoc===0.2.0 sphinxcontrib-websupport==1.0.1 stevedore==1.28.0 termcolor==1.1.0 testtools==2.3.0 traceback2==1.4.0 unittest2==1.1.0 urllib3==1.22 warlock==1.3.0 WebOb==1.7.4 wrapt==1.10.11 XStatic==1.0.1 XStatic-Angular==1.5.8.0 XStatic-Angular-Bootstrap==2.2.0.0 XStatic-Angular-FileUpload==12.0.4.0 XStatic-Angular-Gettext==2.3.8.0 XStatic-Angular-lrdragndrop==1.0.2.2 XStatic-Angular-Schema-Form==0.8.13.0 XStatic-Bootstrap-Datepicker==1.3.1.0 XStatic-Bootstrap-SCSS==3.3.7.1 XStatic-bootswatch==3.3.7.0 XStatic-D3==3.5.17.0 XStatic-Font-Awesome==4.7.0.0 XStatic-Hogan==2.0.0.2 XStatic-Jasmine==2.4.1.1 XStatic-jQuery==1.10.2.1 XStatic-JQuery-Migrate==1.2.1.1 XStatic-jquery-ui==1.12.0.1 XStatic-JQuery.quicksearch==2.0.3.1 XStatic-JQuery.TableSorter==2.14.5.1 XStatic-JSEncrypt==2.3.1.1 XStatic-mdi==1.4.57.0 XStatic-objectpath==1.2.1.0 XStatic-Rickshaw==1.5.0.0 XStatic-roboto-fontface==0.5.0.0 XStatic-smart-table==1.4.13.2 XStatic-Spin==1.2.5.2 XStatic-term.js==0.0.7.0 XStatic-tv4==1.2.7.0 xvfbwrapper==0.1.3 ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9682717 magnum-ui-6.0.1/magnum_ui/0000775000175000017500000000000000000000000015421 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/__init__.py0000664000175000017500000000000000000000000017520 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9682717 magnum-ui-6.0.1/magnum_ui/api/0000775000175000017500000000000000000000000016172 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/api/__init__.py0000664000175000017500000000000000000000000020271 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/api/heat.py0000664000175000017500000000363500000000000017474 0ustar00zuulzuul00000000000000# Copyright 2015 Cisco Systems. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from __future__ import absolute_import import logging from django.conf import settings from horizon.utils.memoized import memoized from openstack_dashboard.api import base from heatclient import client as heat_client LOG = logging.getLogger(__name__) @memoized def heatclient(request, password=None): service_type = 'orchestration' openstack_api_versions = getattr(settings, 'OPENSTACK_API_VERSIONS', {}) api_version = openstack_api_versions.get(service_type, 1) insecure = getattr(settings, 'OPENSTACK_SSL_NO_VERIFY', False) cacert = getattr(settings, 'OPENSTACK_SSL_CACERT', None) endpoint = base.url_for(request, 'orchestration') kwargs = { 'token': request.user.token.id, 'insecure': insecure, 'ca_file': cacert, 'username': request.user.username, 'password': password } client = heat_client.Client(api_version, endpoint, **kwargs) client.format_parameters = format_parameters return client def format_parameters(params): parameters = {} for count, p in enumerate(params, 1): parameters['Parameters.member.%d.ParameterKey' % count] = p parameters['Parameters.member.%d.ParameterValue' % count] = params[p] return parameters def stack_get(request, stack_id): return heatclient(request).stacks.get(stack_id) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/api/magnum.py0000664000175000017500000002156000000000000020034 0ustar00zuulzuul00000000000000# Copyright 2015 Cisco Systems. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from __future__ import absolute_import import logging from django.conf import settings from horizon import exceptions from horizon.utils.memoized import memoized from openstack_dashboard.api import base from magnumclient.v1 import certificates from magnumclient.v1 import client as magnum_client from magnumclient.v1 import cluster_templates from magnumclient.v1 import clusters from magnumclient.v1 import quotas LOG = logging.getLogger(__name__) CLUSTER_TEMPLATE_CREATE_ATTRS = cluster_templates.CREATION_ATTRIBUTES CLUSTER_CREATE_ATTRS = clusters.CREATION_ATTRIBUTES CERTIFICATE_CREATE_ATTRS = certificates.CREATION_ATTRIBUTES QUOTA_CREATION_ATTRIBUTES = quotas.CREATION_ATTRIBUTES CLUSTER_UPDATE_ALLOWED_PROPERTIES = set(['/node_count']) def _cleanup_params(attrs, create, **params): args = {} for (key, value) in params.items(): if key in attrs: if value is None: if create: value = '' else: continue args[str(key)] = str(value) elif create: raise exceptions.BadRequest( "Key must be in %s" % ",".join(attrs)) if key == "labels": if isinstance(value, str): labels = {} vals = value.split(",") for v in vals: kv = v.split("=", 1) labels[kv[0]] = kv[1] args["labels"] = labels else: args["labels"] = value return args def _create_patches(old, new): """"Create patches for updating cluster template and cluster Returns patches include operations for each parameters to update values """ # old = {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D', 'e': 'E'} # new = {'a': 'A', 'c': 'c', 'd': None, 'e': '', 'f': 'F'} # patch = [ # {'op': 'add', 'path': '/f', 'value': 'F'} # {'op': 'remove', 'path': '/b'}, # {'op': 'remove', 'path': '/e'}, # {'op': 'remove', 'path': '/d'}, # {'op': 'replace', 'path': '/c', 'value': 'c'} # ] patch = [] for key in new: path = '/' + key if key in old and old[key] != new[key]: if new[key] is None or new[key] == '': patch.append({'op': 'remove', 'path': path}) else: patch.append({'op': 'replace', 'path': path, 'value': new[key]}) elif key not in old: patch.append({'op': 'add', 'path': path, 'value': new[key]}) for key in old: path = '/' + key if key not in new: patch.append({'op': 'remove', 'path': path}) # convert dict value for labels into string for p in patch: if 'value' in p: p['value'] = str(p['value']) return patch @memoized def magnumclient(request): magnum_url = "" service_type = 'container-infra' try: magnum_url = base.url_for(request, service_type) except exceptions.ServiceCatalogException: LOG.debug('No Container Infrastructure Management service is ' 'configured.') return None LOG.debug('magnumclient connection created using the token "%s" and url' '"%s"' % (request.user.token.id, magnum_url)) insecure = getattr(settings, 'OPENSTACK_SSL_NO_VERIFY', False) cacert = getattr(settings, 'OPENSTACK_SSL_CACERT', None) openstack_api_versions = getattr(settings, 'OPENSTACK_API_VERSIONS', {}) magnum_api_version = openstack_api_versions.get(service_type, 1.1) c = magnum_client.Client(username=request.user.username, project_id=request.user.tenant_id, input_auth_token=request.user.token.id, magnum_url=magnum_url, insecure=insecure, api_version=magnum_api_version, cacert=cacert) return c def cluster_template_create(request, **kwargs): args = _cleanup_params(CLUSTER_TEMPLATE_CREATE_ATTRS, True, **kwargs) return magnumclient(request).cluster_templates.create(**args) def cluster_template_update(request, id, **kwargs): new = _cleanup_params(CLUSTER_TEMPLATE_CREATE_ATTRS, True, **kwargs) old = magnumclient(request).cluster_templates.get(id).to_dict() old = _cleanup_params(CLUSTER_TEMPLATE_CREATE_ATTRS, False, **old) patch = _create_patches(old, new) return magnumclient(request).cluster_templates.update(id, patch) def cluster_template_delete(request, id): return magnumclient(request).cluster_templates.delete(id) def cluster_template_list(request, limit=None, marker=None, sort_key=None, sort_dir=None, detail=True): return magnumclient(request).cluster_templates.list( limit, marker, sort_key, sort_dir, detail) def cluster_template_show(request, id): return magnumclient(request).cluster_templates.get(id) def cluster_create(request, **kwargs): kwargs.pop("rollback") args = _cleanup_params(CLUSTER_CREATE_ATTRS, True, **kwargs) return magnumclient(request).clusters.create(**args) def cluster_update(request, id, **kwargs): rollback = kwargs.pop("rollback") new = _cleanup_params(CLUSTER_CREATE_ATTRS, True, **kwargs) old = magnumclient(request).clusters.get(id).to_dict() old = _cleanup_params(CLUSTER_CREATE_ATTRS, False, **old) patch = _create_patches(old, new) # NOTE(flwang): Now Magnum only support updating the node count for # cluster update action. So let's simplify it by only passing the # /node_count dict which can avoid many potential bugs. patch = [d for d in patch if d['path'] in CLUSTER_UPDATE_ALLOWED_PROPERTIES] return magnumclient(request).clusters.update(id, patch, rollback=rollback) def cluster_delete(request, id): return magnumclient(request).clusters.delete(id) def cluster_list(request, limit=None, marker=None, sort_key=None, sort_dir=None, detail=True): return magnumclient(request).clusters.list(limit, marker, sort_key, sort_dir, detail) def cluster_show(request, id): return magnumclient(request).clusters.get(id) def cluster_resize(request, cluster_id, node_count, nodes_to_remove=None, nodegroup=None): if nodes_to_remove is None: nodes_to_remove = [] # Note: Magnum client does not use any return statement so result will # be None unless an exception is raised. return magnumclient(request).clusters.resize( cluster_id, node_count, nodes_to_remove=nodes_to_remove, nodegroup=nodegroup) def cluster_upgrade(request, cluster_uuid, cluster_template, max_batch_size=1, nodegroup=None): return magnumclient(request).clusters.upgrade( cluster_uuid, cluster_template, max_batch_size=max_batch_size, nodegroup=None) def certificate_create(request, **kwargs): args = {} for (key, value) in kwargs.items(): if key in CERTIFICATE_CREATE_ATTRS: args[key] = value else: raise exceptions.BadRequest( "Key must be in %s" % ",".join(CERTIFICATE_CREATE_ATTRS)) return magnumclient(request).certificates.create(**args) def certificate_show(request, id): return magnumclient(request).certificates.get(id) def certificate_rotate(request, id): args = {"cluster_uuid": id} return magnumclient(request).certificates.rotate_ca(**args) def stats_list(request, project_id=None): return magnumclient(request).stats.list(project_id=project_id) def quotas_list(request, limit=None, marker=None, sort_key=None, sort_dir=None, all_tenants=True): return magnumclient(request).quotas.list( limit, marker, sort_key, sort_dir, all_tenants) def quotas_show(request, project_id, resource): return magnumclient(request).quotas.get(project_id, resource) def quotas_create(request, **kwargs): args = _cleanup_params(QUOTA_CREATION_ATTRIBUTES, True, **kwargs) return magnumclient(request).quotas.create(**args) def quotas_update(request, project_id, resource, **kwargs): return magnumclient(request).quotas.update(project_id, resource, kwargs) def quotas_delete(request, project_id, resource): return magnumclient(request).quotas.delete(project_id, resource) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9682717 magnum-ui-6.0.1/magnum_ui/api/rest/0000775000175000017500000000000000000000000017147 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/api/rest/__init__.py0000664000175000017500000000117700000000000021266 0ustar00zuulzuul00000000000000# Copyright 2016 Cisco Systems # # 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 REST modules here from . import magnum # noqa: F401 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/api/rest/magnum.py0000664000175000017500000003576700000000000021027 0ustar00zuulzuul00000000000000# Copyright 2015 Cisco Systems. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import logging import re from collections import defaultdict from django.conf import settings from django.http import HttpResponse from django.http import HttpResponseNotFound from django.views import generic from magnum_ui.api import heat from magnum_ui.api import magnum from openstack_dashboard import api from openstack_dashboard.api import neutron from openstack_dashboard.api.rest import urls from openstack_dashboard.api.rest import utils as rest_utils LOG = logging.getLogger(__name__) def change_to_id(obj): """Change key named 'uuid' to 'id' Magnum returns objects with a field called 'uuid' many of Horizons directives however expect objects to have a field called 'id'. """ obj['id'] = obj.pop('uuid') return obj @urls.register class IngressControllers(generic.View): url_regex = r'container_infra/ingress_controllers/' @rest_utils.ajax() def get(self, request): configured_controllers = getattr( settings, "MAGNUM_INGRESS_CONTROLLERS", []) available_controllers = [] for controller in configured_controllers: try: parsed = {} parsed["name"] = controller["name"] parsed["labels"] = controller["labels"] assert type(parsed["labels"]) is dict available_controllers.append(parsed) except KeyError as e: LOG.exception(e) except AssertionError as e: LOG.exception(e) return {"controllers": available_controllers} @urls.register class Addons(generic.View): url_regex = r'container_infra/available_addons/' @rest_utils.ajax() def get(self, request): available_addons = [] configured_addons = getattr( settings, "MAGNUM_AVAILABLE_ADDONS", []) for configured_addon in configured_addons: addon = {} try: addon["name"] = configured_addon["name"] addon["selected"] = configured_addon["selected"] assert type(addon["selected"]) is bool addon["labels"] = configured_addon["labels"] assert type(addon["labels"]) is dict available_addons.append(addon) except KeyError as e: LOG.exception(e) except AssertionError as e: LOG.exception(e) return {"addons": available_addons} @urls.register class ClusterTemplate(generic.View): """API for retrieving a single cluster template""" url_regex = r'container_infra/cluster_templates/(?P[^/]+)$' @rest_utils.ajax() def get(self, request, template_id): """Get a specific cluster template""" return change_to_id(magnum.cluster_template_show(request, template_id) .to_dict()) @rest_utils.ajax(data_required=True) def patch(self, request, template_id): """Update a Cluster Template. Returns the Cluster Template object on success. """ params = request.DATA updated_template = magnum.cluster_template_update( request, template_id, **params) return rest_utils.CreatedResponse( '/api/container_infra/cluster_template/%s' % template_id, updated_template.to_dict()) @urls.register class ClusterTemplates(generic.View): """API for Magnum Cluster Templates""" url_regex = r'container_infra/cluster_templates/$' @rest_utils.ajax() def get(self, request): """Get a list of the Cluster Templates for a project. The returned result is an object with property 'items' and each item under this is a Cluster Template. If a GET query param for 'related_to' is specified, and the setting for template filtering is set, then Horizon will only return template groups which the given template falls into, or all if none match. """ templates = magnum.cluster_template_list(request) template_filters = getattr( settings, "CLUSTER_TEMPLATE_GROUP_FILTERS", None) related_to_id = request.GET.get("related_to") if template_filters and related_to_id: templates_by_id = {t.uuid: t for t in templates} related_to = templates_by_id.get(related_to_id) if related_to: matched_groups = [] groups = defaultdict(list) for group, regex in template_filters.items(): pattern = re.compile(regex) if pattern.match(related_to.name): matched_groups.append(group) for template in templates: if pattern.match(template.name): groups[group].append(template) if matched_groups: new_templates = [] for group in matched_groups: new_templates += groups[group] templates = set(new_templates) return {'items': [change_to_id(n.to_dict()) for n in templates]} @rest_utils.ajax(data_required=True) def delete(self, request): """Delete one or more Cluster Templates by id. Returns HTTP 204 (no content) on successful deletion. """ for template_id in request.DATA: magnum.cluster_template_delete(request, template_id) @rest_utils.ajax(data_required=True) def post(self, request): """Create a new Cluster Template. Returns the new ClusterTemplate object on success. """ new_template = magnum.cluster_template_create(request, **request.DATA) return rest_utils.CreatedResponse( '/api/container_infra/cluster_template/%s' % new_template.uuid, new_template.to_dict()) @urls.register class Cluster(generic.View): """API for retrieving a single cluster""" url_regex = r'container_infra/clusters/(?P[^/]+)$' @rest_utils.ajax() def get(self, request, cluster_id): """Get a specific cluster""" return change_to_id(magnum.cluster_show(request, cluster_id).to_dict()) @rest_utils.ajax(data_required=True) def patch(self, request, cluster_id): """Update a Cluster. Returns the Cluster object on success. """ params = request.DATA updated_cluster = magnum.cluster_update( request, cluster_id, **params) return rest_utils.CreatedResponse( '/api/container_infra/cluster/%s' % cluster_id, updated_cluster.to_dict()) @urls.register class ClusterResize(generic.View): url_regex = r'container_infra/clusters/(?P[^/]+)/resize$' @rest_utils.ajax() def get(self, request, cluster_id): """Get cluster details for resize""" try: cluster = magnum.cluster_show(request, cluster_id).to_dict() except AttributeError as e: print(e) return HttpResponseNotFound() stack = heat.stack_get(request, cluster["stack_id"]) search_opts = {"name": "%s-" % stack.stack_name} servers = api.nova.server_list(request, search_opts=search_opts)[0] worker_nodes = [] for server in servers: if (server.name.startswith("%s-minion" % stack.stack_name) or server.name.startswith("%s-node" % stack.stack_name)): worker_nodes.append({"name": server.name, "id": server.id}) return {"cluster": change_to_id(cluster), "worker_nodes": worker_nodes} @rest_utils.ajax(data_required=True) def post(self, request, cluster_id): """Resize a cluster""" nodes_to_remove = request.DATA.get("nodes_to_remove", None) nodegroup = request.DATA.get("nodegroup", None) node_count = request.DATA.get("node_count") # Result will be 'None' unless error is raised response will be '204' try: return magnum.cluster_resize( request, cluster_id, node_count, nodes_to_remove=nodes_to_remove, nodegroup=nodegroup).to_dict() except AttributeError as e: # If cluster is not found magnum-client throws Attribute error # catch and respond with 404 print(e) return HttpResponseNotFound() @urls.register class ClusterUpgrade(generic.View): url_regex = r'container_infra/clusters/(?P[^/]+)/upgrade$' @rest_utils.ajax(data_required=True) def post(self, request, cluster_id): """Upgrade a cluster""" cluster_template = request.DATA.get("cluster_template") max_batch_size = request.DATA.get("max_batch_size", 1) nodegroup = request.DATA.get("nodegroup", None) return magnum.cluster_upgrade( request, cluster_id, cluster_template, max_batch_size=max_batch_size, nodegroup=nodegroup).to_dict() @urls.register class Clusters(generic.View): """API for Magnum Clusters""" url_regex = r'container_infra/clusters/$' @rest_utils.ajax() def get(self, request): """Get a list of the Clusters for a project. The returned result is an object with property 'items' and each item under this is a Cluster. """ result = magnum.cluster_list(request) return {'items': [change_to_id(n.to_dict()) for n in result]} @rest_utils.ajax(data_required=True) def delete(self, request): """Delete one or more Clusters by id. Returns HTTP 204 (no content) on successful deletion. """ for cluster_id in request.DATA: magnum.cluster_delete(request, cluster_id) @rest_utils.ajax(data_required=True) def post(self, request): """Create a new Cluster. Returns the new Cluster object on success. """ new_cluster = magnum.cluster_create(request, **request.DATA) return rest_utils.CreatedResponse( '/api/container_infra/cluster/%s' % new_cluster.uuid, new_cluster.to_dict()) @urls.register class Certificate(generic.View): """API for retrieving a single certificate""" url_regex = r'container_infra/certificates/(?P[^/]+)$' @rest_utils.ajax() def get(self, request, cluster_id): """Get a certificate from a cluster. Returns the CA.pem string on success """ ca = magnum.certificate_show(request, cluster_id) return ca.to_dict() @rest_utils.ajax(data_required=True) def delete(self, request, cluster_id): """Rotate a certificate from a clsuter. Returns HTTP 204 (no content) on successful deletion. """ magnum.certificate_rotate(request, cluster_id) @urls.register class Certificates(generic.View): """API for Magnum Certificates""" url_regex = r'container_infra/certificates/$' @rest_utils.ajax(data_required=True) def post(self, request): """Create a new Certificate. Returns the new Cert.pem string from csr for a cluster on success. """ new_cert = magnum.certificate_create(request, **request.DATA) return rest_utils.CreatedResponse( '/api/container_infra/certificates/', new_cert.to_dict()) @urls.register class Stats(generic.View): """API for Magnum Stats""" url_regex = r'container_infra/stats/$' @rest_utils.ajax() def get(self, request): """Get a list of the Stats. The returned result is an object with property 'items' and each item under this is a Stat. """ result = magnum.stats_list(request) return {'stats': {'clusters': result.clusters, 'nodes': result.nodes}} @urls.register class Quota(generic.View): """API for retrieving a single Quota""" url_regex =\ r'container_infra/quotas/(?P[^/]+)/(?P[^/]+)$' @rest_utils.ajax() def get(self, request, project_id, resource): """Get a specific quota""" try: return magnum.quotas_show(request, project_id, resource).to_dict() except AttributeError as e: LOG.exception(e) message = ("Quota could not be found: " "project_id %s resource %s" % (project_id, resource)) return HttpResponse(message, status=404) @rest_utils.ajax(data_required=True) def patch(self, request, project_id, resource): """Update a Quota. Returns the Quota object on success. """ params = request.DATA updated = magnum.quotas_update( request, **params) return rest_utils.CreatedResponse( ('/api/container_infra/quotas/%s/%s' % (project_id, resource)), updated.to_dict()) @rest_utils.ajax(data_required=True) def delete(self, request, project_id, resource): """Delete one Quota by id and resource. Returns HTTP 204 (no content) on successful deletion. """ magnum.quotas_delete(request, project_id, resource) @urls.register class Quotas(generic.View): """API for Magnum Quotas""" url_regex = r'container_infra/quotas/$' @rest_utils.ajax() def get(self, request): """Get a list of the Quotas for a project. The returned result is an object with property 'items' and each item under this is a Quota. """ result = magnum.quotas_list(request) return {'items': [n.to_dict() for n in result]} @rest_utils.ajax(data_required=True) def post(self, request): """Create a new Quota. Returns the new Quota object on success. """ created = magnum.quotas_create(request, **request.DATA) return rest_utils.CreatedResponse( ('/api/container_infra/quotas/%s/%s' % ( created.project_id, created.resource)), created.to_dict()) @urls.register class Networks(generic.View): """API for Neutron networks for Cluster Templates creation""" url_regex = r'container_infra/networks/$' @rest_utils.ajax() def get(self, request): """Get a list of the Networks for a project. Networks includes external and private. Also, each network has subnets. The returned result is an object with property 'items' and each item under this is a Network. """ tenant_id = request.user.tenant_id result = neutron.network_list_for_tenant(request, tenant_id, include_external=True) return {'items': [n.to_dict() for n in result]} ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9682717 magnum-ui-6.0.1/magnum_ui/content/0000775000175000017500000000000000000000000017073 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/content/__init__.py0000664000175000017500000000000000000000000021172 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9682717 magnum-ui-6.0.1/magnum_ui/content/cluster_templates/0000775000175000017500000000000000000000000022632 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/content/cluster_templates/__init__.py0000664000175000017500000000000000000000000024731 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/content/cluster_templates/panel.py0000664000175000017500000000142600000000000024306 0ustar00zuulzuul00000000000000# Copyright 2015 Cisco Systems, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.utils.translation import ugettext_lazy as _ import horizon class ClusterTemplates(horizon.Panel): name = _("Cluster Templates") slug = "cluster_templates" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/content/cluster_templates/tests.py0000664000175000017500000000144300000000000024350 0ustar00zuulzuul00000000000000# Copyright 2015 Cisco Systems # # 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 openstack_dashboard.test import helpers as test class ClusterTemplateTests(test.TestCase): # Unit tests for cluster template. def test_me(self): self.assertTrue(1 + 1 == 2) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/content/cluster_templates/urls.py0000664000175000017500000000176100000000000024176 0ustar00zuulzuul00000000000000# Copyright 2015 Cisco Systems # # 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.urls import url from django.utils.translation import ugettext_lazy as _ from horizon.browsers import views from magnum_ui.content.cluster_templates import panel title = _("Container Infra - Cluster Templates") page_title = panel.ClusterTemplates.name urlpatterns = [ url(r'^$', views.AngularIndexView.as_view(title=title, page_title=page_title), name='index'), ] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9722714 magnum-ui-6.0.1/magnum_ui/content/clusters/0000775000175000017500000000000000000000000020737 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/content/clusters/__init__.py0000664000175000017500000000000000000000000023036 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/content/clusters/panel.py0000664000175000017500000000162300000000000022412 0ustar00zuulzuul00000000000000# Copyright 2015 Cisco Systems # # 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 ugettext_lazy as _ import horizon # DO NOT REMOVE # This needs for register url of REST API. # Dashboard plugins load REST API from here. from magnum_ui.api.rest import magnum # noqa: F401 class Clusters(horizon.Panel): name = _("Clusters") slug = "clusters" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/content/clusters/tests.py0000664000175000017500000000142200000000000022452 0ustar00zuulzuul00000000000000# Copyright 2015 Cisco Systems # # 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 openstack_dashboard.test import helpers as test class ClusterTests(test.TestCase): # Unit tests for cluster. def test_me(self): self.assertTrue(1 + 1 == 2) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/content/clusters/urls.py0000664000175000017500000000172700000000000022305 0ustar00zuulzuul00000000000000# Copyright 2015 Cisco Systems # # 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.urls import url from django.utils.translation import ugettext_lazy as _ from horizon.browsers import views from magnum_ui.content.clusters import panel title = _("Container Infra - Clusters") page_title = panel.Clusters.name urlpatterns = [ url(r'^$', views.AngularIndexView.as_view(title=title, page_title=page_title), name='index'), ] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9722714 magnum-ui-6.0.1/magnum_ui/content/container_infra/0000775000175000017500000000000000000000000022234 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/content/container_infra/__init__.py0000664000175000017500000000000000000000000024333 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9722714 magnum-ui-6.0.1/magnum_ui/content/container_infra/quotas/0000775000175000017500000000000000000000000023550 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/content/container_infra/quotas/__init__.py0000664000175000017500000000000000000000000025647 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/content/container_infra/quotas/panel.py0000664000175000017500000000133700000000000025225 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. from django.utils.translation import ugettext_lazy as _ import horizon class Quotas(horizon.Panel): name = _("Quotas") slug = "container_infra.quotas" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/content/container_infra/quotas/urls.py0000664000175000017500000000170000000000000025105 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. from django.conf.urls import url from django.utils.translation import ugettext_lazy as _ from horizon.browsers import views from magnum_ui.content.container_infra.quotas import panel title = _("Container Infra - Quotas") page_title = panel.Quotas.name urlpatterns = [ url(r'^$', views.AngularIndexView.as_view(title=title, page_title=page_title), name='index'), ] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9722714 magnum-ui-6.0.1/magnum_ui/enabled/0000775000175000017500000000000000000000000017013 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/enabled/_1370_project_container_infra_panel_group.py0000664000175000017500000000232500000000000027462 0ustar00zuulzuul00000000000000# Copyright 2015 Cisco Systems. # # 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 ugettext_lazy as _ # The slug of the panel group to be added to HORIZON_CONFIG. Required. PANEL_GROUP = 'container_infra' # The display name of the PANEL_GROUP. Required. PANEL_GROUP_NAME = _('Container Infra') # The slug of the dashboard the PANEL_GROUP associated with. Required. PANEL_GROUP_DASHBOARD = 'project' ADD_INSTALLED_APPS = ['magnum_ui'] ADD_ANGULAR_MODULES = [ 'horizon.dashboard.container-infra' ] ADD_JS_FILES = [ 'horizon/lib/angular/angular-route.js' ] ADD_SCSS_FILES = [ 'dashboard/container-infra/container-infra.scss' ] AUTO_DISCOVER_STATIC_FILES = True ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/enabled/_1371_project_container_infra_clusters_panel.py0000664000175000017500000000173400000000000030176 0ustar00zuulzuul00000000000000# Copyright 2015 NEC Corporation, 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 slug of the panel to be added to HORIZON_CONFIG. Required. PANEL = 'clusters' # The slug of the panel group the PANEL is associated with. PANEL_GROUP = 'container_infra' # The slug of the dashboard the PANEL associated with. Required. PANEL_DASHBOARD = 'project' # Python panel class of the PANEL to be added. ADD_PANEL = 'magnum_ui.content.clusters.panel.Clusters' ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/enabled/_1372_project_container_infra_cluster_templates_panel.py0000664000175000017500000000176600000000000032077 0ustar00zuulzuul00000000000000# Copyright 2015 NEC Corporation, 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 slug of the panel to be added to HORIZON_CONFIG. Required. PANEL = 'cluster_templates' # The slug of the panel group the PANEL is associated with. PANEL_GROUP = 'container_infra' # The slug of the dashboard the PANEL associated with. Required. PANEL_DASHBOARD = 'project' # Python panel class of the PANEL to be added. ADD_PANEL = 'magnum_ui.content.cluster_templates.panel.ClusterTemplates' ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/enabled/_2370_admin_container_infra_panel_group.py0000664000175000017500000000163400000000000027107 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. from django.utils.translation import ugettext_lazy as _ # The slug of the panel group to be added to HORIZON_CONFIG. Required. PANEL_GROUP = 'container_infra' # The display name of the PANEL_GROUP. Required. PANEL_GROUP_NAME = _('Container Infra') # The slug of the dashboard the PANEL_GROUP associated with. Required. PANEL_GROUP_DASHBOARD = 'admin' ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/enabled/_2371_admin_container_infra_quotas_panel.py0000664000175000017500000000171200000000000027265 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. # The slug of the panel to be added to HORIZON_CONFIG. Required. PANEL = 'container_infra.quotas' # The slug of the panel group the PANEL is associated with. PANEL_GROUP = 'container_infra' # The slug of the dashboard the PANEL associated with. Required. PANEL_DASHBOARD = 'admin' # Python panel class of the PANEL to be added. ADD_PANEL = 'magnum_ui.content.container_infra.quotas.panel.Quotas' ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/enabled/__init__.py0000664000175000017500000000000000000000000021112 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/karma.conf.js0000664000175000017500000001264100000000000020002 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. */ 'use strict'; var fs = require('fs'); var path = require('path'); var child_process = require("child_process"); module.exports = function (config) { // This tox venv is setup in the post-install npm step var pythonVersion = "python3."; var stdout = child_process.execFileSync("python3", ["--version"]); pythonVersion += stdout.toString().split(".")[1]; var toxPath = '../.tox/karma/lib/' + pythonVersion + '/site-packages/'; console.log("Karma will check on directory: ", toxPath); process.env.PHANTOMJS_BIN = 'node_modules/phantomjs-prebuilt/bin/phantomjs'; 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', // 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/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 + 'xstatic/pkg/angular_fileupload/data/ng-file-upload.js', // TODO: These should be mocked. toxPath + 'horizon/static/horizon/js/horizon.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'], // browsers: ['Chrome'], browsers: ['PhantomJS'], browserNoActivityTimeout: 60000, reporters: ['progress', 'coverage', 'threshold'], plugins: [ 'karma-chrome-launcher', 'karma-phantomjs-launcher', 'karma-jasmine', '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: 85, // target 100 branches: 60, // target 100 functions: 80, // target 100 lines: 85 // target 100 } }); }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9562724 magnum-ui-6.0.1/magnum_ui/locale/0000775000175000017500000000000000000000000016660 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9562724 magnum-ui-6.0.1/magnum_ui/locale/cs/0000775000175000017500000000000000000000000017265 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9722714 magnum-ui-6.0.1/magnum_ui/locale/cs/LC_MESSAGES/0000775000175000017500000000000000000000000021052 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/cs/LC_MESSAGES/django.po0000664000175000017500000000136100000000000022655 0ustar00zuulzuul00000000000000# Stanislav Ulrych , 2016. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui 2.1.1.dev83\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2016-11-22 10:06+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-11-22 08:58+0000\n" "Last-Translator: Stanislav Ulrych \n" "Language-Team: Czech\n" "Language: cs\n" "X-Generator: Zanata 3.7.3\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" msgid "Cluster Templates" msgstr "Šablony clusterů" msgid "Clusters" msgstr "Clustery" msgid "Container Infra" msgstr "Infrastruktura kontejneru" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/cs/LC_MESSAGES/djangojs.po0000664000175000017500000002735600000000000023226 0ustar00zuulzuul00000000000000# Lenka Husáková , 2016. #zanata # Stanislav Ulrych , 2016. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2020-04-02 03:39+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-11-25 09:40+0000\n" "Last-Translator: Stanislav Ulrych \n" "Language-Team: Czech\n" "Language: cs\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" msgid "API Address" msgstr "Adresa API" msgid "API Server Port" msgstr "Port serveru API" msgid "An arbitrary human-readable name" msgstr "Libovolný čitelný název" msgid "" "Arbitrary labels in the form of key=value pairs to associate with a cluster " "templates. May be used multiple times." msgstr "" "Libovolné popisky ve tvaru klíč=hodnota asociované s šablonou clusteru. Může " "být použito vícekrát." msgid "COE" msgstr "COE" msgid "Cancel" msgstr "Zrušit" #, python-format msgid "Certificate %s was successfully signed." msgstr "Certifikát %s byl úspěšně podepsán." msgid "Choose a Cluster Template" msgstr "Zvolte šablonu clusteru" msgid "Choose a Container Orchestration Engine" msgstr "Zvolte technologii kontejnerové orchestrace" msgid "Choose a Flavor for the Master Node" msgstr "Zvolte typ pro hlavní uzel" msgid "Choose a Flavor for the Node" msgstr "Zvolte typ pro uzel" msgid "Choose a Keypair" msgstr "Zvolit klíč" msgid "Choose a Network Driver" msgstr "Zvolit ovladač sítě" msgid "Choose a Volume Driver" msgstr "Zvolit ovladač svazku" msgid "Choose an Image" msgstr "Zvolit obraz" msgid "Cinder" msgstr "Cinder" msgid "Cluster" msgstr "Cluster" #, python-format msgid "Cluster %s was successfully created." msgstr "Cluster %s byl úspěšně vytvořen." msgid "Cluster Create Timeout" msgstr "Časový limit pro clusteru" msgid "Cluster Distro" msgstr "Distribuce clusteru" msgid "Cluster Name" msgstr "Název clusteru" msgid "Cluster Template" msgstr "Šablona clusteru" msgid "Cluster Template Detail" msgstr "Detaily šablony clusteru" msgid "Cluster Template Name" msgstr "Jméno šablony clusteru" msgid "Cluster Templates" msgstr "Šablony clusterů" msgid "Cluster Type" msgstr "Typ clusteru" #, python-format msgid "Cluster template %s was successfully created." msgstr "Šablona clusteru %s byla úspěšně vytvořena." msgid "Clusters" msgstr "Clustery" msgid "Confirm Delete Cluster" msgid_plural "Confirm Delete Clusters" msgstr[0] "Potvrdit smazání clusteru" msgstr[1] "Potvrdit smazání clusterů" msgstr[2] "Potvrdit smazání clusterů" msgid "Confirm Delete Cluster Template" msgid_plural "Confirm Delete Cluster Templates" msgstr[0] "Potvrdit smazání šablony clusteru" msgstr[1] "Potvrdit smazání šablon clusterů" msgstr[2] "Potvrdit smazání šablon clusterů" msgid "Container Orchestration Engine" msgstr "Technologie kontejnerové orchestrace" msgid "Create" msgstr "Vytvořit" msgid "Create Cluster" msgstr "Vytvořit cluster" msgid "Create Cluster Template" msgstr "Vytvořit šablonu clusteru" msgid "Created" msgstr "Vytvořeno" msgid "DNS" msgstr "DNS" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Smazat cluster" msgstr[1] "Smazat clustery" msgstr[2] "Smazat clustery" msgid "Delete Cluster Template" msgid_plural "Delete Cluster Templates" msgstr[0] "Smazat šablonu clusteru" msgstr[1] "Smazat šablony clusterů" msgstr[2] "Smazat šablony clusterů" msgid "Delete Cluster Templates" msgstr "Smazat šablony clusterů" msgid "Delete Clusters" msgstr "Smazat clustery" #, python-format msgid "Deleted cluster template: %s." msgid_plural "Deleted cluster templates: %s." msgstr[0] "Smazaná šablona clusteru: %s." msgstr[1] "Smazané šablony clusterů: %s." msgstr[2] "Smazané šablony clusterů: %s." #, python-format msgid "Deleted cluster: %s." msgid_plural "Deleted clusters: %s." msgstr[0] "Smazán cluster: %s." msgstr[1] "Smazany clustery: %s." msgstr[2] "Smazano clustery: %s." msgid "Disable TLS" msgstr "Zakázat TLS" msgid "Disable TLS in the cluster template. Default: False" msgstr "Zakázat TLS v šabloně clusteru. Výchozí: Ne" msgid "Discovery URL" msgstr "Discovery URL" msgid "Docker" msgstr "Docker" msgid "Docker Storage Driver" msgstr "Docker Storage Driver" msgid "Docker Swarm" msgstr "Docker Swarm" msgid "Docker Volume Size" msgstr "Velikost svazku docker" msgid "Docker Volume Size (GB)" msgstr "Velikost svazku docker (GB)" msgid "Enable Registry" msgstr "Povolit registr" msgid "External Network ID" msgstr "ID externí sítě" msgid "Fixed Network" msgstr "Fixní síť" msgid "Flannel" msgstr "Flannel" msgid "Flavor" msgstr "Typ" msgid "Flavor ID" msgstr "ID Typu" msgid "Floating IP" msgstr "Floating IP" msgid "Floating IP Enabled" msgstr "Floating IP povolena" msgid "HTTP Proxy" msgstr "HTTP Proxy" msgid "HTTPS Proxy" msgstr "HTTPS Proxy" msgid "ID" msgstr "ID" msgid "Image" msgstr "Obraz" msgid "Image ID" msgstr "ID obrazu" msgid "" "Indicates whether created clusters should have a floating ip or not. " "Default: True" msgstr "" "Určuje, zda vytvořené clustery budou mít floating IP nebo ne. Výchozí: ne." msgid "" "Indicates whether created clusters should have a load balancer for master " "nodes or not. Default: False" msgstr "" "Určuje, zda vytvořené clustery budou mít load balancer pro hlavní uzly nebo " "ne. Výchozí: ne." msgid "Infinite" msgstr "Nekonečný" msgid "Info" msgstr "Informace" msgid "Keypair" msgstr "Klíč" msgid "Kubernetes" msgstr "Kubernetes" msgid "Labels" msgstr "Štítky" msgid "Make cluster template public. Default: False" msgstr "Zvěřejnit šablonu clusteru. Výchozí: Ne" msgid "Master Addresses" msgstr "Hlavní adresy" msgid "Master Flavor" msgstr "Hlavní typ" msgid "Master Flavor ID" msgstr "Hlavní typ ID" msgid "Master LB" msgstr "Master LB" msgid "Mesos" msgstr "Mesos" msgid "Miscellaneous" msgstr "Různé" msgid "Name" msgstr "Název" msgid "Network" msgstr "Síť" msgid "Network Driver" msgstr "Ovladač sítě" msgid "No Proxy" msgstr "Žádné proxy" msgid "Node Addresses" msgstr "Adresy uzlu" msgid "Node Count" msgstr "Počet uzlů" msgid "Node Spec" msgstr "Specifikace uzlu" msgid "Nodes" msgstr "Uzly" msgid "Overview" msgstr "Přehled" msgid "Public" msgstr "Veřejné" msgid "Record Properties" msgstr "Záznam vlastností" msgid "Registry Enabled" msgstr "Registr povolen" msgid "Rexray" msgstr "Rexray" msgid "Server Type" msgstr "Typ serveru" msgid "Show Certificate" msgstr "Ukázat certifikát" msgid "Sign Certificate" msgstr "Podepsat certifikát" msgid "Size" msgstr "Velikost" msgid "Specify the Container Orchestration Engine to use." msgstr "Zadejte technologii kontejnerové orchestrace k použití." msgid "" "Specify the nameserver to use for the cluster template. Default: 8.8.8.8" msgstr "Zadejte jmenný server pro použití v šabloně clusteru. Výchozí: 8.8.8.8" msgid "Specify the size in GB for the docker volume" msgstr "Zadejte velikost pro svazek docker v GB" msgid "Stack ID" msgstr "Stack ID" msgid "Status" msgstr "Stav" msgid "TLS Disabled" msgstr "TLS zakázáno" msgid "The DNS nameserver to use for this cluster template" msgstr "Server DNS pro použití v bay" msgid "The cluster node count." msgstr "Počet uzlů clusteru." msgid "The http_proxy address to use for nodes in cluster" msgstr "Adresa http_proxy, která bude použita v uzlech clusteru" msgid "The https_proxy address to use for nodes in cluster" msgstr "Adresa https_proxy, která bude použita v uzlech clusteru" msgid "The no_proxy address to use for nodes in cluster" msgstr "Adresa no_proxy, která bude použita v uzlech clusteru" msgid "The size in GB for Docker Volume. Default: 25" msgstr "Velikost v GB pro svazek docker. Výchozí: 25" msgid "This should really be named fixed-network-cidr. Default: 10.0.0.0/24" msgstr "Toto by se mělo jmenovat fixed-network-cidr. Výchozí: 10.0.0.0/24" msgid "Unable to create cluster template." msgstr "Nelze vytvořit šablonu clusteru." msgid "Unable to create cluster." msgstr "Nelze vytvořit cluster" #, python-format msgid "Unable to delete cluster template: %s." msgid_plural "Unable to delete cluster templates: %s." msgstr[0] "Nelze smazat šablonu clusteru: %s." msgstr[1] "Nelze smazat šablony clusterů: %s." msgstr[2] "Nelze smazat šablony clusterů: %s." #, python-format msgid "Unable to delete cluster: %s." msgid_plural "Unable to delete clusters: %s." msgstr[0] "Nelze smazat cluster: %s." msgstr[1] "Nelze smazat clustery: %s." msgstr[2] "Nelze smazat clustery: %s." #, python-format msgid "Unable to delete the cluster template with id: %(id)s" msgstr "Nelze smazat šablonu clusteru s id: %(id)s" msgid "Unable to delete the cluster templates." msgstr "Nelze smazat šablony clusterů." #, python-format msgid "Unable to delete the cluster with id: %(id)s" msgstr "Nelze smazat cluster s id: %(id)s" msgid "Unable to delete the clusters." msgstr "Nelze smazat clustery." msgid "Unable to retrieve the certificate." msgstr "Nelze získat certifikát." msgid "Unable to retrieve the cluster template." msgstr "Nelze získat šablonu clusteru." msgid "Unable to retrieve the cluster templates." msgstr "Nelze získat šablony clusterů." msgid "Unable to retrieve the cluster." msgstr "Nelze získat cluster." msgid "Unable to retrieve the clusters." msgstr "Nelze získat clustery." msgid "Unable to sign certificate." msgstr "Nelze podepsat certifikát." msgid "Updated" msgstr "Aktualizováno" msgid "Volume Driver" msgstr "Ovladač svazku" #, python-format msgid "You are not allowed to delete cluster templates: %s" msgstr "Nemáte oprávnění smazat šablony clusterů: %s" #, python-format msgid "You are not allowed to delete clusters: %s" msgstr "Nemáte oprávnění smazat clustery: %s" #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted clusters " "are not recoverable." msgstr[0] "" "Vybrali jste \"%s\". Prosím potvrďte svůj výběr. Smazaný cluster nelze " "obnovit." msgstr[1] "" "Vybrali jste \"%s\". Prosím potvrďte svůj výběr. Smazané clustery nelze " "obnovit." msgstr[2] "" "Vybrali jste \"%s\". Prosím potvrďte svůj výběr. Smazané clustery nelze " "obnovit." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "template is not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "templates are not recoverable." msgstr[0] "" "Vybrali jste \"%s\". Prosím potvrďte svůj výběr. Smazanou šablonu clusteru " "nelze obnovit." msgstr[1] "" "Vybrali jste \"%s\". Prosím potvrďte svůj výběr. Smazané šablony clusterů " "nelze obnovit." msgstr[2] "" "Vybrali jste \"%s\". Prosím potvrďte svůj výběr. Smazané šablony clusterů " "nelze obnovit." msgid "error" msgid_plural "errors" msgstr[0] "chyba" msgstr[1] "chyby" msgstr[2] "chyby" msgid "message" msgid_plural "messages" msgstr[0] "zpráva" msgstr[1] "zprávy" msgstr[2] "zpráv" msgid "submit" msgid_plural "submits" msgstr[0] "odeslání" msgstr[1] "odeslání" msgstr[2] "odeslání" msgid "success" msgid_plural "successes" msgstr[0] "úšpěch" msgstr[1] "úspěchy" msgstr[2] "úspěchy" msgid "title" msgid_plural "titles" msgstr[0] "název" msgstr[1] "názvy" msgstr[2] "názvů" msgid "{$ ctrl.cluster.create_timeout $} minute" msgid_plural "{$ ctrl.cluster.create_timeout $} minutes" msgstr[0] "{$ ctrl.cluster.create_timeout $} minuta" msgstr[1] "{$ ctrl.cluster.create_timeout $} minut" msgstr[2] "{$ ctrl.cluster.create_timeout $} minut" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9562724 magnum-ui-6.0.1/magnum_ui/locale/de/0000775000175000017500000000000000000000000017250 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9722714 magnum-ui-6.0.1/magnum_ui/locale/de/LC_MESSAGES/0000775000175000017500000000000000000000000021035 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/de/LC_MESSAGES/django.po0000664000175000017500000000175600000000000022650 0ustar00zuulzuul00000000000000# Frank Kloeker , 2017. #zanata # Robert Simai , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-05-10 05:31+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-05-11 02:25+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 "Cluster Templates" msgstr "Clustervorlagen" msgid "Clusters" msgstr "Cluster" msgid "Container Infra" msgstr "Container Infra" msgid "Container Infra - Cluster Templates" msgstr "Container Infra - Clustervorlagen" msgid "Container Infra - Clusters" msgstr "Container Infra - Cluster" msgid "Container Infra - Quotas" msgstr "Container Infra - Kontingente" msgid "Quotas" msgstr "Kontingente" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/de/LC_MESSAGES/djangojs.po0000664000175000017500000004734700000000000023213 0ustar00zuulzuul00000000000000# Frank Kloeker , 2016. #zanata # Robert Simai , 2016. #zanata # Andreas Jaeger , 2017. #zanata # Robert Simai , 2017. #zanata # Frank Kloeker , 2018. #zanata # Robert Simai , 2018. #zanata # Andreas Jaeger , 2020. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2020-04-24 18:39+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2020-04-25 09:22+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 "ADOPT COMPLETE" msgstr "ÜBERNAHME ABGESCHLOSSEN" msgid "API Address" msgstr "API Adresse" msgid "API Server Port" msgstr "API Server Port" msgid "Additional Labels" msgstr "Zusätzliche Label" msgid "Advanced" msgstr "Fortgeschritten" msgid "An arbitrary human-readable name" msgstr "Ein beliebiger menschenlesbarer Name" msgid "" "Arbitrary labels in the form of key=value pairs to associate with a cluster " "templates. May be used multiple times." msgstr "" "Beliebige Bezeichnungen in der Form Schlüssel=Wert, zu verbunden mit einer " "Clustervorlage. Kann mehrmals verwendet werden." msgid "Availability Zone" msgstr "Verfügbarkeitszone" msgid "CHECK COMPLETE" msgstr "ÜBERPRÜFUNG ABGESCHLOSSEN" msgid "COE" msgstr "COE" msgid "COE Version" msgstr "COE Version" msgid "CREATE COMPLETE" msgstr "ERSTELLUNG ABGESCHLOSSEN" msgid "CREATE FAILED" msgstr "ERSTELLUNG FEHLGESCHLAGEN" msgid "CREATE IN PROGRESS" msgstr "ERSTELLUNG IN ARBEIT" msgid "CSR" msgstr "CSR" msgid "Calico" msgstr "Calico" msgid "Cancel" msgstr "Abbrechen" #, python-format msgid "Certificate %s was successfully rotated." msgstr "Zertifikat %s wurde erfolgreich rotiert." #, python-format msgid "Certificate %s was successfully signed." msgstr "Zertifikat %s wurde erfolgreich signiert." msgid "Choose a Cluster Template" msgstr "Wähle eine Clustervorlage" msgid "Choose a Container Orchestration Engine" msgstr "Wählen Sie ein Container-Orchestrierungswerkzeug" msgid "Choose a External Network" msgstr "Wählen Sie ein externes Netzwerk" msgid "Choose a Flavor for the Master Node" msgstr "Wähle eine Variante für den Master-Knoten" msgid "Choose a Flavor for the Node" msgstr "Wähle eine Variante für den Knoten" msgid "Choose a Keypair" msgstr "Wählen Sie ein Schlüsselpaar" msgid "Choose a Network Driver" msgstr "Wählen Sie einen Netzwerktreiber" msgid "Choose a Private Network" msgstr "Wählen Sie ein privates Netzwerk" msgid "Choose a Private Network at first" msgstr "Wählen Sie zuerst ein privates Netzwerk aus" msgid "Choose a Private Subnet" msgstr "Wählen Sie ein privates Subnetz" msgid "Choose a Project" msgstr "Projekt auswählen" msgid "Choose a Volume Driver" msgstr "Wählen Sie einen Datenträger-Treiber" msgid "Choose an Image" msgstr "Wähle ein Abbild" msgid "Cinder" msgstr "Cinder" msgid "Cluster" msgstr "Cluster" #, python-format msgid "Cluster %s was successfully created." msgstr "Cluster %s wurde erfolgreich erstellt." msgid "Cluster Create Timeout" msgstr "Zeitlimit Clustererstellung" msgid "Cluster Distro" msgstr "Cluster Distro" msgid "Cluster Name" msgstr "Cluster Name" msgid "Cluster Template" msgstr "Clustervorlage" msgid "Cluster Template Detail" msgstr "Clustervorlage Detail" msgid "Cluster Template Name" msgstr "Cluster-Vorlagenname" msgid "Cluster Templates" msgstr "Clustervorlagen" msgid "Cluster Type" msgstr "Clustertyp" #, python-format msgid "Cluster template %s was successfully created." msgstr "Clustervorlage %s erfolgreich angelegt." #, python-format msgid "Cluster template %s was successfully updated." msgstr "Clustervorlage %s erfolgreich aktualisiert." msgid "Clusters" msgstr "Cluster" msgid "Confirm Delete Cluster" msgid_plural "Confirm Delete Clusters" msgstr[0] "Bestätige den Cluster zu löschen" msgstr[1] "Bestätige die Cluster zu löschen" msgid "Confirm Delete Cluster Template" msgid_plural "Confirm Delete Cluster Templates" msgstr[0] "Löschen der Clustervorlage bestätigen" msgstr[1] "Löschen der Clustervorlagen bestätigen" msgid "Confirm Delete Quota" msgid_plural "Confirm Delete Quotas" msgstr[0] "Kontingent löschen bestätigen" msgstr[1] "Kontingente löschen bestätigen" msgid "Container Orchestration Engine" msgstr "Container-Orchestrierungswerkzeug" msgid "Container Version" msgstr "Container Version" msgid "Create" msgstr "Erstellen" msgid "Create Cluster" msgstr "Erstelle Cluster" msgid "Create Cluster Template" msgstr "Clustervorlage erstellen" msgid "Create New Cluster" msgstr "Neuen Cluster erstellen" msgid "Create New Network" msgstr "Neues Netzwerk erstellen" msgid "Create Quota" msgstr "Kontingent erstellen" msgid "Created" msgstr "Erstellt" msgid "Created At" msgstr "Erstellt am" msgid "DC/OS" msgstr "DC/OS" msgid "DELETE COMPLETE" msgstr "LÖSCHUNG ABGESCHLOSSEN" msgid "DELETE FAILED" msgstr "LÖSCHUNG FEHLGESCHLAGEN" msgid "DELETE IN PROGRESS" msgstr "LÖSCHUNG IN ARBEIT" msgid "DNS" msgstr "DNS" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Cluster löschen" msgstr[1] "Cluster löschen" msgid "Delete Cluster Template" msgid_plural "Delete Cluster Templates" msgstr[0] "Clustervorlage löschen" msgstr[1] "Clustervorlagen löschen" msgid "Delete Cluster Templates" msgstr "Clustervorlagen löschen" msgid "Delete Clusters" msgstr "Cluster löschen" msgid "Delete Quota" msgid_plural "Delete Quotas" msgstr[0] "Kontingent löschen" msgstr[1] "Kontingente löschen" msgid "Delete Quotas" msgstr "Kontingente löschen" #, python-format msgid "Deleted cluster template: %s." msgid_plural "Deleted cluster templates: %s." msgstr[0] "Gelöschte Clustervorlage: %s." msgstr[1] "Gelöschte Clustervorlagen: %s." #, python-format msgid "Deleted cluster: %s." msgid_plural "Deleted clusters: %s." msgstr[0] "Gelöschter Cluster: %s." msgstr[1] "Gelöschte Cluster: %s." #, python-format msgid "Deleted quota: %s." msgid_plural "Deleted quotas: %s." msgstr[0] "Gelöschtes Kontingent: %s." msgstr[1] "Gelöschte Kontingente: %s." msgid "Details" msgstr "Details" msgid "Device Mapper" msgstr "Device Mapper" msgid "Disable TLS" msgstr "TLS deaktivieren" msgid "Disable TLS in the cluster template. Default: False" msgstr "Deaktiviere TLS in der Clustervorlage. Standard: Falsch" msgid "Discovery URL" msgstr "Discovery URL" msgid "Docker" msgstr "Docker" msgid "Docker Storage Driver" msgstr "Docker Storage-Treiber" msgid "Docker Swarm" msgstr "Docker Swarm" msgid "Docker Swarm Mode" msgstr "Docker Swarm Modus" msgid "Docker Volume Size" msgstr "Docker Datenträgergrösse" msgid "Docker Volume Size (GB)" msgstr "Docker Datenträgergrösse (GB)" msgid "Enable Registry" msgstr "Aktiviere Registry" msgid "Enable docker registry in the cluster temlate. Default: False" msgstr "Aktiviere Docker Registry in der Clustervorlage. Standard: Falsch" msgid "Exists" msgstr "Existiert" msgid "External Network ID" msgstr "Externe Netzwerk-ID" msgid "Fixed Network" msgstr "Fixes Netzwerk" msgid "Fixed Subnet" msgstr "Festes Subnetz" msgid "Flannel" msgstr "Flannel" msgid "Flavor" msgstr "Variante" msgid "Flavor ID" msgstr "Variante ID" msgid "Floating IP" msgstr "Floating IP" msgid "Floating IP Enabled" msgstr "Floating IP aktiviert" msgid "HTTP Proxy" msgstr "HTTP-Proxy" msgid "HTTPS Proxy" msgstr "HTTPS-Proxy" msgid "Hard Limit" msgstr "Hartes Limit" msgid "Hidden" msgstr "Versteckt" msgid "ID" msgstr "ID" msgid "Image" msgstr "Abbild" msgid "Image ID" msgstr "Abbild ID" msgid "" "Indicates whether created clusters should have a floating ip or not. " "Default: True" msgstr "" "Macht kenntlich, ob der erstellte Cluster eine Floating IP haben soll oder " "nicht. Standard: Wahr" msgid "" "Indicates whether created clusters should have a load balancer for master " "nodes or not. Default: False" msgstr "" "Macht kenntlich, ob der erstellte Cluster einen Loadbalancer für den Master-" "Knoten haben soll oder nicht. Standard: Falsch" msgid "Infinite" msgstr "Unendlich" msgid "Info" msgstr "Info" msgid "Ingress" msgstr "Ingress" msgid "Ingress Controller" msgstr "Ingress Kontroller" msgid "Insecure Registry" msgstr "Unsichere Registrierung" msgid "KEY1=VALUE1, KEY2=VALUE2..." msgstr "KEY1=VALUE1, KEY2=VALUE2..." msgid "Keypair" msgstr "Schlüsselpaar" msgid "Kubernetes" msgstr "Kubernetes" msgid "Labels" msgstr "Bezeichnungen" msgid "Limit for this resource." msgstr "Limit für die Ressource." msgid "Loading" msgstr "Laden" msgid "Make cluster template public. Default: False" msgstr "Clustervorlage öffentlich machen. Standard: Falsch" msgid "Management" msgstr "Management" msgid "Margin" msgstr "Spanne" msgid "Master Addresses" msgstr "Masteradressen" msgid "Master Count" msgstr "Anzahl Master" msgid "Master Flavor" msgstr "Master Variante" msgid "Master Flavor ID" msgstr "Master Variante ID" msgid "Master LB" msgstr "Master LB" msgid "Master LB Enabled" msgstr "Master LB aktiviert" msgid "Master Nodes" msgstr "Master-Knoten" msgid "Mesos" msgstr "Mesos" msgid "Miscellaneous" msgstr "Verschiedenes" msgid "Name" msgstr "Name" msgid "Name of the cluster" msgstr "Name des Clusters" msgid "Name of the cluster template." msgstr "Name für die Clustervorlage." msgid "Network" msgstr "Netzwerk" msgid "Network Access Control" msgstr "Netzwerkzugriffskontrolle" msgid "Network Driver" msgstr "Netzwerktreiber" msgid "New Cluster Template" msgstr "Neue Clustervorlage" msgid "No Proxy" msgstr "Kein Proxy" msgid "Node Addresses" msgstr "Knotenadressen" msgid "Node Count" msgstr "Knotenzähler" msgid "Node Flavor ID" msgstr "Knoten-Varianten-ID" msgid "Node Spec" msgstr "Knotenspezifikation" msgid "Nodes" msgstr "Knoten" msgid "None" msgstr "kein" msgid "Number of Worker Nodes" msgstr "Anzahl der Worker-Knoten" msgid "Overlay" msgstr "Overlay" msgid "Overview" msgstr "Übersicht" msgid "Project" msgstr "Projekt" msgid "Project ID" msgstr "Projekt-ID" msgid "Public" msgstr "Öffentlich" msgid "Quota" msgstr "Kontingent" #, python-format msgid "Quota %s was successfully created." msgstr "Kontingent %s wurde erfolgreich erstellt." #, python-format msgid "Quota %s/%s was successfully updated." msgstr "Kontingent %s/%s wurde erfolgreich aktualisiert." msgid "Quotas" msgstr "Kontingente" msgid "RESTORE COMPLETE" msgstr "WIEDERHERSTELLUNG ABGESCHLOSSEN" msgid "RESUME COMPLETE" msgstr "WIEDERAUFNAHME ABGESCHLOSSEN" msgid "ROLLBACK COMPLETE" msgstr "RÜCKABWICKLUNG ABGESCHLOSSEN" msgid "Record Properties" msgstr "Datensatzeigenschaften" msgid "Registry Enabled" msgstr "Registry aktiviert" msgid "Resize Cluster" msgstr "Größe des Clusters ändern" msgid "Resource" msgstr "Ressource" msgid "Rexray" msgstr "Rexray" msgid "Rotate Certificate" msgstr "Zertifikat rotieren" msgid "SNAPSHOT COMPLETE" msgstr "SCHATTENKOPIE ABGESCHLOSSEN" msgid "Server Type" msgstr "Servertyp" msgid "Show Certificate" msgstr "Zertifikat anzeigen" msgid "Sign Certificate" msgstr "Zertifikate signieren" msgid "Sign Certificate To Cluster: {$ ctrl.model.cluster_name $}" msgstr "Signiere Zertifikat für Cluster: {$ ctrl.model.cluster_name $}" msgid "Size" msgstr "Größe" msgid "Specify the Container Orchestration Engine to use." msgstr "Wählen Sie ein Container Orchestrierungswerkzeug." msgid "" "Specify the nameserver to use for the cluster template. Default: 8.8.8.8" msgstr "Geben Sie den Nameserver für die Clustervorlage an. Standard: 8.8.8.8" msgid "Specify the size in GB for the docker volume" msgstr "Gibt die Grösse des Docker Datenträgers in GB an" msgid "Stack" msgstr "Stapel" msgid "Stack Faults" msgstr "Stapelfehler" msgid "Stack ID" msgstr "Stack ID" msgid "Stats" msgstr "Stats" msgid "Status" msgstr "Status" msgid "Status Reason" msgstr "Statusgrund" msgid "TLS Disabled" msgstr "TLS deaktiviert" msgid "The DNS nameserver to use for this cluster template" msgstr "Der DNS Nameserver zur Benutzung in dieser Cluster Vorlage" msgid "The URL of docker registry." msgstr "Die URL der Docker-Registrierung" msgid "The cluster node count." msgstr "Die Anzahl der Clusterknoten." msgid "The http_proxy address to use for nodes in cluster" msgstr "Die http_proxy Adresse zur Benutzung von Knoten im Cluster" msgid "The https_proxy address to use for nodes in cluster" msgstr "Die https_proxy Adresse zur Benutzung von Knoten im Cluster" msgid "The name or UUID of the SSH keypair to load into the cluster nodes." msgstr "" "Der Name oder UUID des SSH Schlüsselpaares zum Laden in die Cluster-Knoten." msgid "The name or UUID of the base image to customize for the cluster." msgstr "Der Name oder UUID des Basis-Abbildes zum Anpassen für den Cluster." msgid "The no_proxy address to use for nodes in cluster" msgstr "Die no_proxy Adresse zur Benutzung von Knoten im Cluster" msgid "The nova flavor id to use when launching the cluster. Default: m1.small" msgstr "" "Die Nova Varianten-ID zur Benutzung beim Starten des Clusters. Standard: m1." "small" msgid "" "The nova flavor id to use when launching the master node of the cluster. " "Default: m1.small" msgstr "" "Die Nova Varianten-ID zur Benutzung beim Starten des Master-Knotens des " "Clusters. Standard: m1.small" msgid "The size in GB for Docker Volume. Default: 25" msgstr "Größe des Docker Datenträgers in GB. Standard: 25" msgid "This should really be named fixed-network-cidr. Default: 10.0.0.0/24" msgstr "" "Das sollte wirklich nach fixed-network-cidr benannt werden. Standard: " "10.0.0.0/24" msgid "UPDATE COMPLETE" msgstr "AKTUALISIERUNG ABGESCHLOSSEN" msgid "UPDATE FAILED" msgstr "AKTUALISIERUNG FEHLGESCHLAGEN" msgid "UPDATE IN PROGRESS" msgstr "AKTUALISIERUNG IN ARBEIT" msgid "Unable to create cluster template." msgstr "Clustervorlage kann nicht erstellt werden." msgid "Unable to create cluster." msgstr "Cluster kann nicht erzeugt werden." msgid "Unable to create quota." msgstr "Konnte Kontingent nicht erstellen." #, python-format msgid "Unable to delete cluster template: %s." msgid_plural "Unable to delete cluster templates: %s." msgstr[0] "Konnte Clustervorlage %s nicht löschen." msgstr[1] "Konnte Clustervorlagen %s nicht löschen." #, python-format msgid "Unable to delete cluster: %s." msgid_plural "Unable to delete clusters: %s." msgstr[0] "Der Cluster kann nicht gelöscht werden: %s." msgstr[1] "Die Cluster können nicht gelöscht werden: %s." #, python-format msgid "Unable to delete quota: %s." msgid_plural "Unable to delete quotas: %s." msgstr[0] "Kontingent kann nicht gelöscht werden: %s." msgstr[1] "Kontingente können nicht gelöscht werden: %s." #, python-format msgid "Unable to delete the cluster template with id: %(id)s" msgstr "Clustervorlage mit ID %(id)s kann nicht gelöscht werden" msgid "Unable to delete the cluster templates." msgstr "Clustervorlagen können nicht gelöscht werden." #, python-format msgid "Unable to delete the cluster with id: %(id)s" msgstr "Cluster mit der ID %(id)s kann nicht gelöscht werden." msgid "Unable to delete the clusters." msgstr "Die Cluster konnten nicht gelöscht werden." #, python-format msgid "" "Unable to delete the quota with project id: %(projectId)s and resource: " "%(resource)s." msgstr "" "Konnte Kontingent mit der Project-ID: %(projectId)s und Ressource: " "%(resource)s nicht löschen." msgid "Unable to retrieve the certificate." msgstr "Zertifikat kann nicht abgerufen werden." msgid "Unable to retrieve the cluster template." msgstr "Clustervorlage kann nicht abgerufen werden." msgid "Unable to retrieve the cluster templates." msgstr "Clustervorlagen können nicht abgerufen werden." msgid "Unable to retrieve the cluster." msgstr "Cluster kann nicht abgerufen werden." msgid "Unable to retrieve the clusters." msgstr "Cluster können nicht abgerufen werden." msgid "Unable to retrieve the networks." msgstr "Die Netzwerke können nicht abgerufen werden." msgid "Unable to retrieve the quota." msgstr "Konnte Kontingent nicht abrufen." msgid "Unable to retrieve the quotas." msgstr "Kontingente können nicht abgerufen werden." msgid "Unable to retrieve the stats." msgstr "Statistiken können nicht abgerufen werden." msgid "Unable to rotate the certificate." msgstr "Zertifikat kann nicht rotiert werden." msgid "Unable to sign certificate." msgstr "Zertifikat kann nicht signiert werden." msgid "Unable to update cluster template." msgstr "Clustervorlage kann nicht aktualisiert werden." msgid "Unable to update cluster." msgstr "Cluster kann nicht aktualisiert werden." msgid "Unable to update quota." msgstr "Konnte Kontingent nicht aktualisieren." msgid "Update Cluster Template" msgstr "Clustervorlage aktualisieren" msgid "Update Quota" msgstr "Kontingente aktualisieren" msgid "Updated" msgstr "Aktualisiert" msgid "Updated At" msgstr "Aktualisiert am" msgid "Use an Existing Network" msgstr "Benutze existierendes Netzwerk" msgid "Used {$ ctrl.stats.clusters $} of {$ ctrl.quota.clusters $}" msgstr "Benutzt {$ ctrl.stats.clusters $} von {$ ctrl.quota.clusters $}" msgid "Volume Driver" msgstr "Datenträgertreiber" msgid "Worker Nodes" msgstr "Worker-Knoten" #, python-format msgid "You are not allowed to delete cluster templates: %s" msgstr "Sie sind nicht zum Löschen von Clustevorlagen berechtigt: %s" #, python-format msgid "You are not allowed to delete clusters: %s" msgstr "Sie sind nicht zum Löschen von Clustern berechtigt: %s" #, python-format msgid "You are not allowed to delete quotas: %s" msgstr "Sie haben keine Berechtigung zum Löschen von Kontingenten: %s" #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted clusters " "are not recoverable." msgstr[0] "" "Sie haben ausgewählt: \"%s\". Bitte bestätigen Sie Ihre Auswahl. Gelöschter " "Cluster kann nicht wiederhergestellt werden." msgstr[1] "" "Sie haben ausgewählt: \"%s\". Bitte bestätigen Sie Ihre Auswahl. Gelöschte " "Cluster können nicht wiederhergestellt werden." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "template is not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "templates are not recoverable." msgstr[0] "" "Sie haben ausgewählt: \"%s\". Bitte bestätigen Sie Ihre Auswahl. Gelöschte " "Clustervorlage kann nicht wiederhergestellt werden." msgstr[1] "" "Sie haben ausgewählt: \"%s\". Bitte bestätigen Sie Ihre Auswahl. Gelöschte " "Clustervorlagen können nicht wiederhergestellt werden." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted quota is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted quotas are " "not recoverable." msgstr[0] "" "Sie haben \"%s\" ausgewählt. Bitte bestätigen Sie Ihre Auswahl. Gelöschtes " "Kontingent känn nicht wiederhergestellt werden." msgstr[1] "" "Sie haben \"%s\" ausgewählt. Bitte bestätigen Sie Ihre Auswahl. Gelöschte " "Kontingente können nicht wiederhergestellt werden." msgid "as follows:" msgstr "wie folgt:" msgid "error" msgid_plural "errors" msgstr[0] "Fehler" msgstr[1] "Fehler" msgid "message" msgid_plural "messages" msgstr[0] "Nachricht" msgstr[1] "Nachrichten" msgid "submit" msgid_plural "submits" msgstr[0] "Übergabe" msgstr[1] "Übergaben" msgid "success" msgid_plural "successes" msgstr[0] "Erfolg" msgstr[1] "Erfolge" msgid "title" msgid_plural "titles" msgstr[0] "Titel" msgstr[1] "Titel" msgid "{$ ctrl.cluster.create_timeout $} minute" msgid_plural "{$ ctrl.cluster.create_timeout $} minutes" msgstr[0] "{$ ctrl.cluster.create_timeout $} Minute" msgstr[1] "{$ ctrl.cluster.create_timeout $} Minuten" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9562724 magnum-ui-6.0.1/magnum_ui/locale/en_AU/0000775000175000017500000000000000000000000017647 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9722714 magnum-ui-6.0.1/magnum_ui/locale/en_AU/LC_MESSAGES/0000775000175000017500000000000000000000000021434 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/en_AU/LC_MESSAGES/djangojs.po0000664000175000017500000003110700000000000023575 0ustar00zuulzuul00000000000000# Tom Fifield , 2016. #zanata # Ian Y. Choi , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2020-04-02 03:39+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-05 08:29+0000\n" "Last-Translator: Ian Y. Choi \n" "Language-Team: English (Australia)\n" "Language: en_AU\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "ADOPT COMPLETE" msgstr "ADOPT COMPLETE" msgid "API Address" msgstr "API Address" msgid "API Server Port" msgstr "API Server Port" msgid "An arbitrary human-readable name" msgstr "An arbitrary human-readable name" msgid "" "Arbitrary labels in the form of key=value pairs to associate with a cluster " "templates. May be used multiple times." msgstr "" "Arbitrary labels in the form of key=value pairs to associate with a cluster " "templates. May be used multiple times." msgid "CHECK COMPLETE" msgstr "CHECK COMPLETE" msgid "COE" msgstr "COE" msgid "CREATE COMPLETE" msgstr "CREATE COMPLETE" msgid "CREATE FAILED" msgstr "CREATE FAILED" msgid "CREATE IN PROGRESS" msgstr "CREATE IN PROGRESS" msgid "Cancel" msgstr "Cancel" #, python-format msgid "Certificate %s was successfully signed." msgstr "Certificate %s was successfully signed." msgid "Choose a Cluster Template" msgstr "Choose a Cluster Template" msgid "Choose a Container Orchestration Engine" msgstr "Choose a Container Orchestration Engine" msgid "Choose a Flavor for the Master Node" msgstr "Choose a Flavour for the Master Node" msgid "Choose a Flavor for the Node" msgstr "Choose a Flavour for the Node" msgid "Choose a Keypair" msgstr "Choose a Keypair" msgid "Choose a Network Driver" msgstr "Choose a Network Driver" msgid "Choose a Volume Driver" msgstr "Choose a Volume Driver" msgid "Choose an Image" msgstr "Choose an Image" msgid "Cinder" msgstr "Cinder" msgid "Cluster" msgstr "Cluster" #, python-format msgid "Cluster %s was successfully created." msgstr "Cluster %s was successfully created." msgid "Cluster Create Timeout" msgstr "Cluster Create Timeout" msgid "Cluster Distro" msgstr "Cluster Distro" msgid "Cluster Name" msgstr "Cluster Name" msgid "Cluster Template" msgstr "Cluster Template" msgid "Cluster Template Detail" msgstr "Cluster Template Detail" msgid "Cluster Template Name" msgstr "Cluster Template Name" msgid "Cluster Templates" msgstr "Cluster Templates" msgid "Cluster Type" msgstr "Cluster Type" #, python-format msgid "Cluster template %s was successfully created." msgstr "Cluster template %s was successfully created." msgid "Clusters" msgstr "Clusters" msgid "Confirm Delete Cluster" msgid_plural "Confirm Delete Clusters" msgstr[0] "Confirm Delete Cluster" msgstr[1] "Confirm Delete Clusters" msgid "Confirm Delete Cluster Template" msgid_plural "Confirm Delete Cluster Templates" msgstr[0] "Confirm Delete Cluster Template" msgstr[1] "Confirm Delete Cluster Templates" msgid "Container Orchestration Engine" msgstr "Container Orchestration Engine" msgid "Create" msgstr "Create" msgid "Create Cluster" msgstr "Create Cluster" msgid "Create Cluster Template" msgstr "Create Cluster Template" msgid "Created" msgstr "Created" msgid "DELETE COMPLETE" msgstr "DELETE COMPLETE" msgid "DELETE FAILED" msgstr "DELETE FAILED" msgid "DELETE IN PROGRESS" msgstr "DELETE IN PROGRESS" msgid "DNS" msgstr "DNS" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Delete Cluster" msgstr[1] "Delete Clusters" msgid "Delete Cluster Template" msgid_plural "Delete Cluster Templates" msgstr[0] "Delete Cluster Template" msgstr[1] "Delete Cluster Templates" msgid "Delete Cluster Templates" msgstr "Delete Cluster Templates" msgid "Delete Clusters" msgstr "Delete Clusters" #, python-format msgid "Deleted cluster template: %s." msgid_plural "Deleted cluster templates: %s." msgstr[0] "Deleted cluster template: %s." msgstr[1] "Deleted cluster templates: %s." #, python-format msgid "Deleted cluster: %s." msgid_plural "Deleted clusters: %s." msgstr[0] "Deleted cluster: %s." msgstr[1] "Deleted clusters: %s." msgid "Device Mapper" msgstr "Device Mapper" msgid "Disable TLS" msgstr "Disable TLS" msgid "Disable TLS in the cluster template. Default: False" msgstr "Disable TLS in the cluster template. Default: False" msgid "Discovery URL" msgstr "Discovery URL" msgid "Docker" msgstr "Docker" msgid "Docker Storage Driver" msgstr "Docker Storage Driver" msgid "Docker Swarm" msgstr "Docker Swarm" msgid "Docker Volume Size" msgstr "Docker Volume Size" msgid "Docker Volume Size (GB)" msgstr "Docker Volume Size (GB)" msgid "Enable Registry" msgstr "Enable Registry" msgid "Enable docker registry in the cluster temlate. Default: False" msgstr "Enable docker registry in the cluster temlate. Default: False" msgid "External Network ID" msgstr "External Network ID" msgid "Fixed Network" msgstr "Fixed Network" msgid "Fixed Subnet" msgstr "Fixed Subnet" msgid "Flannel" msgstr "Flannel" msgid "Flavor" msgstr "Flavour" msgid "Flavor ID" msgstr "Flavour ID" msgid "Floating IP" msgstr "Floating IP" msgid "Floating IP Enabled" msgstr "Floating IP Enabled" msgid "HTTP Proxy" msgstr "HTTP Proxy" msgid "HTTPS Proxy" msgstr "HTTPS Proxy" msgid "ID" msgstr "ID" msgid "Image" msgstr "Image" msgid "Image ID" msgstr "Image ID" msgid "" "Indicates whether created clusters should have a floating ip or not. " "Default: True" msgstr "" "Indicates whether created clusters should have a floating ip or not. " "Default: True" msgid "" "Indicates whether created clusters should have a load balancer for master " "nodes or not. Default: False" msgstr "" "Indicates whether created clusters should have a load balancer for master " "nodes or not. Default: False" msgid "Infinite" msgstr "Infinite" msgid "Info" msgstr "Info" msgid "Keypair" msgstr "Keypair" msgid "Kubernetes" msgstr "Kubernetes" msgid "Labels" msgstr "Labels" msgid "Make cluster template public. Default: False" msgstr "Make cluster template public. Default: False" msgid "Master Addresses" msgstr "Master Addresses" msgid "Master Count" msgstr "Master Count" msgid "Master Flavor" msgstr "Master Flavour" msgid "Master Flavor ID" msgstr "Master Flavour ID" msgid "Master LB" msgstr "Master LB" msgid "Master LB Enabled" msgstr "Master LB Enabled" msgid "Mesos" msgstr "Mesos" msgid "Miscellaneous" msgstr "Miscellaneous" msgid "Name" msgstr "Name" msgid "Network" msgstr "Network" msgid "Network Driver" msgstr "Network Driver" msgid "No Proxy" msgstr "No Proxy" msgid "Node Addresses" msgstr "Node Addresses" msgid "Node Count" msgstr "Node Count" msgid "Node Spec" msgstr "Node Spec" msgid "Nodes" msgstr "Nodes" msgid "Overlay" msgstr "Overlay" msgid "Overview" msgstr "Overview" msgid "Public" msgstr "Public" msgid "RESTORE COMPLETE" msgstr "RESTORE COMPLETE" msgid "RESUME COMPLETE" msgstr "RESUME COMPLETE" msgid "ROLLBACK COMPLETE" msgstr "ROLLBACK COMPLETE" msgid "Record Properties" msgstr "Record Properties" msgid "Registry Enabled" msgstr "Registry Enabled" msgid "Rexray" msgstr "Rexray" msgid "SNAPSHOT COMPLETE" msgstr "SNAPSHOT COMPLETE" msgid "Server Type" msgstr "Server Type" msgid "Show Certificate" msgstr "Show Certificate" msgid "Sign Certificate" msgstr "Sign Certificate" msgid "Sign Certificate To Cluster: {$ ctrl.model.cluster_name $}" msgstr "Sign Certificate To Cluster: {$ ctrl.model.cluster_name $}" msgid "Size" msgstr "Size" msgid "Specify the Container Orchestration Engine to use." msgstr "Specify the Container Orchestration Engine to use." msgid "" "Specify the nameserver to use for the cluster template. Default: 8.8.8.8" msgstr "" "Specify the nameserver to use for the cluster template. Default: 8.8.8.8" msgid "Specify the size in GB for the docker volume" msgstr "Specify the size in GB for the docker volume" msgid "Stack ID" msgstr "Stack ID" msgid "Status" msgstr "Status" msgid "TLS Disabled" msgstr "TLS Disabled" msgid "The DNS nameserver to use for this cluster template" msgstr "The DNS nameserver to use for this cluster template" msgid "The cluster node count." msgstr "The cluster node count." msgid "The http_proxy address to use for nodes in cluster" msgstr "The http_proxy address to use for nodes in cluster" msgid "The https_proxy address to use for nodes in cluster" msgstr "The https_proxy address to use for nodes in cluster" msgid "The name or UUID of the SSH keypair to load into the cluster nodes." msgstr "The name or UUID of the SSH keypair to load into the cluster nodes." msgid "The name or UUID of the base image to customize for the cluster." msgstr "The name or UUID of the base image to customise for the cluster." msgid "The no_proxy address to use for nodes in cluster" msgstr "The no_proxy address to use for nodes in cluster" msgid "The nova flavor id to use when launching the cluster. Default: m1.small" msgstr "" "The nova flavour id to use when launching the cluster. Default: m1.small" msgid "" "The nova flavor id to use when launching the master node of the cluster. " "Default: m1.small" msgstr "" "The nova flavour id to use when launching the master node of the cluster. " "Default: m1.small" msgid "The size in GB for Docker Volume. Default: 25" msgstr "The size in GB for Docker Volume. Default: 25" msgid "This should really be named fixed-network-cidr. Default: 10.0.0.0/24" msgstr "This should really be named fixed-network-cidr. Default: 10.0.0.0/24" msgid "UPDATE COMPLETE" msgstr "UPDATE COMPLETE" msgid "UPDATE FAILED" msgstr "UPDATE FAILED" msgid "UPDATE IN PROGRESS" msgstr "UPDATE IN PROGRESS" msgid "Unable to create cluster template." msgstr "Unable to create cluster template." msgid "Unable to create cluster." msgstr "Unable to create cluster." #, python-format msgid "Unable to delete cluster template: %s." msgid_plural "Unable to delete cluster templates: %s." msgstr[0] "Unable to delete cluster template: %s." msgstr[1] "Unable to delete cluster templates: %s." #, python-format msgid "Unable to delete cluster: %s." msgid_plural "Unable to delete clusters: %s." msgstr[0] "Unable to delete cluster: %s." msgstr[1] "Unable to delete clusters: %s." #, python-format msgid "Unable to delete the cluster template with id: %(id)s" msgstr "Unable to delete the cluster template with id: %(id)s" msgid "Unable to delete the cluster templates." msgstr "Unable to delete the cluster templates." #, python-format msgid "Unable to delete the cluster with id: %(id)s" msgstr "Unable to delete the cluster with id: %(id)s" msgid "Unable to delete the clusters." msgstr "Unable to delete the clusters." msgid "Unable to retrieve the certificate." msgstr "Unable to retrieve the certificate." msgid "Unable to retrieve the cluster template." msgstr "Unable to retrieve the cluster template." msgid "Unable to retrieve the cluster templates." msgstr "Unable to retrieve the cluster templates." msgid "Unable to retrieve the cluster." msgstr "Unable to retrieve the cluster." msgid "Unable to retrieve the clusters." msgstr "Unable to retrieve the clusters." msgid "Unable to sign certificate." msgstr "Unable to sign certificate." msgid "Updated" msgstr "Updated" msgid "Volume Driver" msgstr "Volume Driver" #, python-format msgid "You are not allowed to delete cluster templates: %s" msgstr "You are not allowed to delete cluster templates: %s" #, python-format msgid "You are not allowed to delete clusters: %s" msgstr "You are not allowed to delete clusters: %s" #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted clusters " "are not recoverable." msgstr[0] "" "You have selected \"%s\". Please confirm your selection. Deleted cluster is " "not recoverable." msgstr[1] "" "You have selected \"%s\". Please confirm your selection. Deleted clusters " "are not recoverable." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "template is not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "templates are not recoverable." msgstr[0] "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "templates are not recoverable." msgstr[1] "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "templates are not recoverable." msgid "{$ ctrl.cluster.create_timeout $} minute" msgid_plural "{$ ctrl.cluster.create_timeout $} minutes" msgstr[0] "{$ ctrl.cluster.create_timeout $} minute" msgstr[1] "{$ ctrl.cluster.create_timeout $} minutes" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9562724 magnum-ui-6.0.1/magnum_ui/locale/en_GB/0000775000175000017500000000000000000000000017632 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9722714 magnum-ui-6.0.1/magnum_ui/locale/en_GB/LC_MESSAGES/0000775000175000017500000000000000000000000021417 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/en_GB/LC_MESSAGES/django.po0000664000175000017500000000177100000000000023227 0ustar00zuulzuul00000000000000# Andi Chandler , 2017. #zanata # Andi Chandler , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-04-17 01:53+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-17 11:30+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 "Cluster Templates" msgstr "Cluster Templates" msgid "Clusters" msgstr "Clusters" msgid "Container Infra" msgstr "Container Infra" msgid "Container Infra - Cluster Templates" msgstr "Container Infra - Cluster Templates" msgid "Container Infra - Clusters" msgstr "Container Infra - Clusters" msgid "Container Infra - Quotas" msgstr "Container Infra - Quotas" msgid "Quotas" msgstr "Quotas" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/en_GB/LC_MESSAGES/djangojs.po0000664000175000017500000006646600000000000023600 0ustar00zuulzuul00000000000000# Andi Chandler , 2016. #zanata # Andi Chandler , 2017. #zanata # Ian Y. Choi , 2017. #zanata # Andi Chandler , 2018. #zanata # Andi Chandler , 2019. #zanata # Andi Chandler , 2020. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2020-04-17 08:23+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2020-04-16 12:33+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 "This cluster is already on the latest compatible template" msgstr "This cluster is already on the latest compatible template" msgid "A batch cannot have less than one node." msgstr "A batch cannot have less than one node." msgid "" "A minimum number of Worker Nodes cannot be higher than the default number of " "Worker Nodes." msgstr "" "A minimum number of Worker Nodes cannot be higher than the default number of " "Worker Nodes." msgid "ADOPT COMPLETE" msgstr "ADOPT COMPLETE" msgid "API Address" msgstr "API Address" msgid "API Server Port" msgstr "API Server Port" msgid "Accessible on private network only" msgstr "Accessible on private network only" msgid "Accessible on the public internet" msgstr "Accessible on the public Internet" msgid "Additional Labels" msgstr "Additional Labels" msgid "Addon Software" msgstr "Addon Software" msgid "Addon software" msgstr "Addon software" msgid "Advanced" msgstr "Advanced" msgid "An arbitrary human-readable name" msgstr "An arbitrary human-readable name" msgid "" "Any addon software selected will be installed at the latest supported " "version when the cluster is deployed, but will not be upgraded automatically " "by rolling upgrades." msgstr "" "Any addon software selected will be installed at the latest supported " "version when the cluster is deployed, but will not be upgraded automatically " "by rolling upgrades." msgid "" "Arbitrary labels in the form of key=value pairs to associate with a cluster " "templates. May be used multiple times." msgstr "" "Arbitrary labels in the form of key=value pairs to associate with a cluster " "templates. May be used multiple times." msgid "Auto Healing" msgstr "Auto Healing" msgid "Auto Scaling" msgstr "Auto Scaling" msgid "" "Auto scaling requires the use of CPU and memory limits on the resource " "definition of Pods." msgstr "" "Auto scaling requires the use of CPU and memory limits on the resource " "definition of Pods." msgid "Auto-scale Worker Nodes" msgstr "Auto-scale Worker Nodes" msgid "Automatically Repair Unhealthy Nodes" msgstr "Automatically Repair Unhealthy Nodes" msgid "Availability Zone" msgstr "Availability Zone" msgid "CHECK COMPLETE" msgstr "CHECK COMPLETE" msgid "COE" msgstr "COE" msgid "COE Version" msgstr "COE Version" msgid "CREATE COMPLETE" msgstr "CREATE COMPLETE" msgid "CREATE FAILED" msgstr "CREATE FAILED" msgid "CREATE IN PROGRESS" msgstr "CREATE IN PROGRESS" msgid "CSR" msgstr "CSR" msgid "Calico" msgstr "Calico" msgid "Cancel" msgstr "Cancel" #, python-format msgid "Certificate %s was successfully rotated." msgstr "Certificate %s was successfully rotated." #, python-format msgid "Certificate %s was successfully signed." msgstr "Certificate %s was successfully signed." msgid "Choose a Cluster Template" msgstr "Choose a Cluster Template" msgid "Choose a Cluster Template to upgrade to" msgstr "Choose a Cluster Template to upgrade to" msgid "Choose a Container Orchestration Engine" msgstr "Choose a Container Orchestration Engine" msgid "Choose a External Network" msgstr "Choose a External Network" msgid "Choose a Flavor for the Master Node" msgstr "Choose a Flavour for the Master Node" msgid "Choose a Flavor for the Node" msgstr "Choose a Flavour for the Node" msgid "Choose a Flavor for the Worker Node" msgstr "Choose a Flavour for the Worker Node" msgid "Choose a Keypair" msgstr "Choose a Keypair" msgid "Choose a Network Driver" msgstr "Choose a Network Driver" msgid "Choose a Private Network" msgstr "Choose a Private Network" msgid "Choose a Private Network at first" msgstr "Choose a Private Network at first" msgid "Choose a Private Subnet" msgstr "Choose a Private Subnet" msgid "Choose a Project" msgstr "Choose a Project" msgid "Choose a Volume Driver" msgstr "Choose a Volume Driver" msgid "Choose an Availability Zone" msgstr "Choose an Availability Zone" msgid "Choose an Image" msgstr "Choose an Image" msgid "Choose an existing network" msgstr "Choose an existing network" msgid "Choose an ingress controller" msgstr "Choose an ingress controller" msgid "Choose nodes to remove (Optional)" msgstr "Choose nodes to remove (Optional)" msgid "Cinder" msgstr "Cinder" msgid "Cluster" msgstr "Cluster" #, python-format msgid "Cluster %s was successfully created." msgstr "Cluster %s was successfully created." msgid "Cluster API" msgstr "Cluster API" msgid "Cluster Create Timeout" msgstr "Cluster Create Timeout" msgid "Cluster Distro" msgstr "Cluster Distro" msgid "Cluster Name" msgstr "Cluster Name" msgid "Cluster Template" msgstr "Cluster Template" msgid "Cluster Template Detail" msgstr "Cluster Template Detail" msgid "Cluster Template Name" msgstr "Cluster Template Name" msgid "Cluster Templates" msgstr "Cluster Templates" msgid "Cluster Type" msgstr "Cluster Type" msgid "Cluster is being resized." msgstr "Cluster is being resized." msgid "Cluster is being upgraded to the new Cluster template" msgstr "Cluster is being upgraded to the new Cluster template" #, python-format msgid "Cluster template %s was successfully created." msgstr "Cluster template %s was successfully created." #, python-format msgid "Cluster template %s was successfully updated." msgstr "Cluster template %s was successfully updated." msgid "Clusters" msgstr "Clusters" msgid "Confirm Delete Cluster" msgid_plural "Confirm Delete Clusters" msgstr[0] "Confirm Delete Cluster" msgstr[1] "Confirm Delete Clusters" msgid "Confirm Delete Cluster Template" msgid_plural "Confirm Delete Cluster Templates" msgstr[0] "Confirm Delete Cluster Template" msgstr[1] "Confirm Delete Cluster Templates" msgid "Confirm Delete Quota" msgid_plural "Confirm Delete Quotas" msgstr[0] "Confirm Delete Quota" msgstr[1] "Confirm Delete Quotas" msgid "Container Orchestration Engine" msgstr "Container Orchestration Engine" msgid "Container Version" msgstr "Container Version" msgid "Create" msgstr "Create" msgid "Create Cluster" msgstr "Create Cluster" msgid "Create Cluster Template" msgstr "Create Cluster Template" msgid "Create New Cluster" msgstr "Create New Cluster" msgid "Create New Network" msgstr "Create New Network" msgid "Create Quota" msgstr "Create Quota" msgid "Created" msgstr "Created" msgid "Created At" msgstr "Created At" msgid "DC/OS" msgstr "DC/OS" msgid "DELETE COMPLETE" msgstr "DELETE COMPLETE" msgid "DELETE FAILED" msgstr "DELETE FAILED" msgid "DELETE IN PROGRESS" msgstr "DELETE IN PROGRESS" msgid "DNS" msgstr "DNS" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Delete Cluster" msgstr[1] "Delete Clusters" msgid "Delete Cluster Template" msgid_plural "Delete Cluster Templates" msgstr[0] "Delete Cluster Template" msgstr[1] "Delete Cluster Templates" msgid "Delete Cluster Templates" msgstr "Delete Cluster Templates" msgid "Delete Clusters" msgstr "Delete Clusters" msgid "Delete Quota" msgid_plural "Delete Quotas" msgstr[0] "Delete Quota" msgstr[1] "Delete Quotas" msgid "Delete Quotas" msgstr "Delete Quotas" #, python-format msgid "Deleted cluster template: %s." msgid_plural "Deleted cluster templates: %s." msgstr[0] "Deleted cluster template: %s." msgstr[1] "Deleted cluster templates: %s." #, python-format msgid "Deleted cluster: %s." msgid_plural "Deleted clusters: %s." msgstr[0] "Deleted cluster: %s." msgstr[1] "Deleted clusters: %s." #, python-format msgid "Deleted quota: %s." msgid_plural "Deleted quotas: %s." msgstr[0] "Deleted quota: %s." msgstr[1] "Deleted quotas: %s." msgid "Details" msgstr "Details" msgid "Device Mapper" msgstr "Device Mapper" msgid "Disable TLS" msgstr "Disable TLS" msgid "Disable TLS in the cluster template. Default: False" msgstr "Disable TLS in the cluster template. Default: False" msgid "Discovery URL" msgstr "Discovery URL" msgid "Docker" msgstr "Docker" msgid "Docker Storage Driver" msgstr "Docker Storage Driver" msgid "Docker Swarm" msgstr "Docker Swarm" msgid "Docker Swarm Mode" msgstr "Docker Swarm Mode" msgid "Docker Volume Size" msgstr "Docker Volume Size" msgid "Docker Volume Size (GB)" msgstr "Docker Volume Size (GB)" msgid "Enable Registry" msgstr "Enable Registry" msgid "Enable docker registry in the cluster temlate. Default: False" msgstr "Enable docker registry in the cluster template. Default: False" msgid "Exists" msgstr "Exists" msgid "External Network ID" msgstr "External Network ID" msgid "Fixed Network" msgstr "Fixed Network" msgid "Fixed Subnet" msgstr "Fixed Subnet" msgid "Flannel" msgstr "Flannel" msgid "Flavor" msgstr "Flavour" msgid "Flavor ID" msgstr "Flavour ID" msgid "Flavor of Master Nodes" msgstr "Flavour of Master Nodes" msgid "Flavor of Worker Nodes" msgstr "Flavour of Worker Nodes" msgid "Floating IP" msgstr "Floating IP" msgid "Floating IP Enabled" msgstr "Floating IP Enabled " msgid "HTTP Proxy" msgstr "HTTP Proxy" msgid "HTTPS Proxy" msgstr "HTTPS Proxy" msgid "Hard Limit" msgstr "Hard Limit" msgid "Hidden" msgstr "Hidden" msgid "I do want to override Template and Workflow Labels" msgstr "I do want to override Template and Workflow Labels" msgid "ID" msgstr "ID" msgid "" "If Kubernetes is unable to schedule a Pod due to insuficient CPU or memory " "in the cluster, a worker node will be added, as long as the maximum number " "of worker nodes has not been reached." msgstr "" "If Kubernetes is unable to schedule a Pod due to insufficient CPU or memory " "in the cluster, a worker node will be added, as long as the maximum number " "of worker nodes has not been reached." msgid "" "If enabled, the minimum and maximum number of worker nodes must be specified." msgstr "" "If enabled, the minimum and maximum number of worker nodes must be specified." #, python-format msgid "" "If the aggregate resource limits of all existing Pods is lower than 50% of " "the cluster capacity, a worker node will be removed, as long as the minimum " "number of worker nodes has not been reached." msgstr "" "If the aggregate resource limits of all existing Pods is lower than 50% of " "the cluster capacity, a worker node will be removed, as long as the minimum " "number of worker nodes has not been reached." msgid "Image" msgstr "Image" msgid "Image ID" msgstr "Image ID" msgid "" "Indicates whether created clusters should have a floating ip or not. " "Default: True" msgstr "" "Indicates whether created clusters should have a floating IP or not. " "Default: True" msgid "" "Indicates whether created clusters should have a load balancer for master " "nodes or not. Default: False" msgstr "" "Indicates whether created clusters should have a load balancer for master " "nodes or not. Default: False" msgid "Infinite" msgstr "Infinite" msgid "Info" msgstr "Info" msgid "Ingress" msgstr "Ingress" msgid "Ingress Controller" msgstr "Ingress Controller" msgid "Insecure Registry" msgstr "Insecure Registry" msgid "" "Invalid format. Must be a comma-separated key-value string: key=value," "key2=value2" msgstr "" "Invalid format. Must be a comma-separated key-value string: key=value," "key2=value2" msgid "It is generally not recommended to give public access." msgstr "It is generally not recommended to give public access." msgid "KEY1=VALUE1, KEY2=VALUE2..." msgstr "KEY1=VALUE1, KEY2=VALUE2..." msgid "Keypair" msgstr "Keypair" msgid "Kubernetes" msgstr "Kubernetes" msgid "Labels" msgstr "Labels" msgid "Limit for this resource." msgstr "Limit for this resource." msgid "Loading" msgstr "Loading" msgid "Make cluster template public. Default: False" msgstr "Make cluster template public. Default: False" msgid "" "Making the Kubernetes API accessible from anywhere on the public internet is " "convenient, but may represent a security risk. [When selecting this " "option, it is recommended to limit access to a trusted IP address range.]" msgstr "" "Making the Kubernetes API accessible from anywhere on the public internet is " "convenient, but may represent a security risk. [When selecting this " "option, it is recommended to limit access to a trusted IP address range.]" msgid "" "Making the Kubernetes API accessible from the private network only is the " "most secure option (the default), but access will be limited to compute " "instances on the same private network or a VPN to that network." msgstr "" "Making the Kubernetes API accessible from the private network only is the " "most secure option (the default), but access will be limited to compute " "instances on the same private network or a VPN to that network." msgid "Management" msgstr "Management" msgid "Margin" msgstr "Margin" msgid "Master Addresses" msgstr "Master Addresses" msgid "Master Count" msgstr "Master Count" msgid "Master Flavor" msgstr "Master Flavour" msgid "Master Flavor ID" msgstr "Master Flavour ID" msgid "Master LB" msgstr "Master LB" msgid "Master LB Enabled" msgstr "Master LB Enabled" msgid "Master Nodes" msgstr "Master Nodes" msgid "Maximum Batch Size" msgstr "Maximum Batch Size" msgid "Maximum number of Worker Nodes" msgstr "Maximum number of Worker Nodes" msgid "Mesos" msgstr "Mesos" msgid "Minimum Number of Worker Nodes" msgstr "Minimum Number of Worker Nodes" msgid "Miscellaneous" msgstr "Miscellaneous" msgid "Name" msgstr "Name" msgid "Name of the cluster" msgstr "Name of the cluster" msgid "Name of the cluster template." msgstr "Name of the cluster template." msgid "Network" msgstr "Network" msgid "Network Access Control" msgstr "Network Access Control" msgid "Network Driver" msgstr "Network Driver" msgid "New Cluster Template" msgstr "New Cluster Template" msgid "No Proxy" msgstr "No Proxy" msgid "Node Addresses" msgstr "Node Addresses" msgid "Node Count" msgstr "Node Count" msgid "Node Flavor ID" msgstr "Node Flavour ID" msgid "Node Spec" msgstr "Node Spec" msgid "Nodes" msgstr "Nodes" msgid "None" msgstr "None" msgid "Number of Master Nodes" msgstr "Number of Master Nodes" msgid "Number of Worker Nodes" msgstr "Number of Worker Nodes" msgid "Overlay" msgstr "Overlay" msgid "" "Overriding labels already defined by cluster template orworkflow might " "result in unpredictable behaviour." msgstr "" "Overriding labels already defined by cluster template or workflow might " "result in unpredictable behaviour." msgid "Overview" msgstr "Overview" msgid "" "Please note that updates may cause application downtime if workloads " "deployed to Kubernetes are not following the best practices outlined in the " "documentation (for example, not using multiple replicas)." msgstr "" "Please note that updates may cause application downtime if workloads " "deployed to Kubernetes are not following the best practices outlined in the " "documentation (for example, not using multiple replicas)." msgid "Project" msgstr "Project" msgid "Project ID" msgstr "Project ID" msgid "Public" msgstr "Public" msgid "Quota" msgstr "Quota" #, python-format msgid "Quota %s was successfully created." msgstr "Quota %s was successfully created." #, python-format msgid "Quota %s/%s was successfully updated." msgstr "Quota %s/%s was successfully updated." msgid "Quotas" msgstr "Quotas" msgid "RESTORE COMPLETE" msgstr "RESTORE COMPLETE" msgid "RESUME COMPLETE" msgstr "RESUME COMPLETE" msgid "ROLLBACK COMPLETE" msgstr "ROLLBACK COMPLETE" msgid "Record Properties" msgstr "Record Properties" msgid "Registry Enabled" msgstr "Registry Enabled" msgid "Resize Cluster" msgstr "Resize Cluster" msgid "Resource" msgstr "Resource" msgid "Rexray" msgstr "Rexray" msgid "Rolling Cluster Upgrade" msgstr "Rolling Cluster Upgrade" msgid "Rotate Certificate" msgstr "Rotate Certificate" msgid "SNAPSHOT COMPLETE" msgstr "SNAPSHOT COMPLETE" msgid "Security Updates" msgstr "Security Updates" msgid "Server Type" msgstr "Server Type" msgid "Show Certificate" msgstr "Show Certificate" msgid "Sign Certificate" msgstr "Sign Certificate" msgid "Sign Certificate To Cluster: {$ ctrl.model.cluster_name $}" msgstr "Sign Certificate To Cluster: {$ ctrl.model.cluster_name $}" msgid "Size" msgstr "Size" msgid "" "Specify additional kube_labels to apply to the cluster or override labels " "set by the cluster template. Overriding labels set by the cluster template " "may result in your cluster being misconfigured, unstable or unable to be " "created." msgstr "" "Specify additional kube_labels to apply to the cluster or override labels " "set by the cluster template. Overriding labels set by the cluster template " "may result in your cluster being misconfigured, unstable or unable to be " "created." msgid "Specify the Container Orchestration Engine to use." msgstr "Specify the Container Orchestration Engine to use." msgid "" "Specify the nameserver to use for the cluster template. Default: 8.8.8.8" msgstr "" "Specify the nameserver to use for the cluster template. Default: 8.8.8.8" msgid "Specify the size in GB for the docker volume" msgstr "Specify the size in GB for the docker volume" msgid "Stack" msgstr "Stack" msgid "Stack Faults" msgstr "Stack Faults" msgid "Stack ID" msgstr "Stack ID" msgid "Stats" msgstr "Stats" msgid "Status" msgstr "Status" msgid "Status Reason" msgstr "Status Reason" msgid "TLS Disabled" msgstr "TLS Disabled" msgid "The DNS nameserver to use for this cluster template" msgstr "The DNS nameserver to use for this cluster template" msgid "The URL of docker registry." msgstr "The URL of Docker registry." msgid "The cluster node count." msgstr "The cluster node count." msgid "The http_proxy address to use for nodes in cluster" msgstr "The http_proxy address to use for nodes in cluster" msgid "The https_proxy address to use for nodes in cluster" msgstr "The https_proxy address to use for nodes in cluster" msgid "" "The key=value pair string is case insensitive and will be converted to lower " "case." msgstr "" "The key=value pair string is case insensitive and will be converted to lower " "case." msgid "" "The maximum number of Worker Nodes a new cluster can auto-scale to cannot be " "less than the total amount of Worker Nodes." msgstr "" "The maximum number of Worker Nodes a new cluster can auto-scale to cannot be " "less than the total amount of Worker Nodes." msgid "" "The maximum number of Worker Nodes cannot be less than the default number of " "Worker Nodes and 1." msgstr "" "The maximum number of Worker Nodes cannot be less than the default number of " "Worker Nodes and 1." msgid "The maximum number of nodes in the batch has been exceeded." msgstr "The maximum number of nodes in the batch has been exceeded." msgid "" "The minimum number of Worker Nodes a new cluster can auto scale to cannot " "exceed the total amount of Worker Nodes." msgstr "" "The minimum number of Worker Nodes a new cluster can auto scale to cannot " "exceed the total amount of Worker Nodes." msgid "The name or UUID of the SSH keypair to load into the cluster nodes." msgstr "The name or UUID of the SSH keypair to load into the cluster nodes." msgid "The name or UUID of the base image to customize for the cluster." msgstr "The name or UUID of the base image to customise for the cluster." msgid "The no_proxy address to use for nodes in cluster" msgstr "The no_proxy address to use for nodes in cluster" msgid "The nova flavor id to use when launching the cluster. Default: m1.small" msgstr "" "The nova flavour id to use when launching the cluster. Default: m1.small" msgid "" "The nova flavor id to use when launching the master node of the cluster. " "Default: m1.small" msgstr "" "The nova flavour id to use when launching the master node of the cluster. " "Default: m1.small" msgid "The number of master nodes for the cluster" msgstr "The number of master nodes for the cluster" msgid "The number of worker nodes for the cluster" msgstr "The number of worker nodes for the cluster" msgid "The selected Cluster Template does not support multiple master nodes." msgstr "The selected Cluster Template does not support multiple master nodes." msgid "The size in GB for Docker Volume. Default: 25" msgstr "The size in GB for Docker Volume. Default: 25" msgid "This should really be named fixed-network-cidr. Default: 10.0.0.0/24" msgstr "This should really be named fixed-network-cidr. Default: 10.0.0.0/24" msgid "UPDATE COMPLETE" msgstr "UPDATE COMPLETE" msgid "UPDATE FAILED" msgstr "UPDATE FAILED" msgid "UPDATE IN PROGRESS" msgstr "UPDATE IN PROGRESS" msgid "Unable to create cluster template." msgstr "Unable to create cluster template." msgid "Unable to create cluster." msgstr "Unable to create cluster." msgid "Unable to create quota." msgstr "Unable to create quota." #, python-format msgid "Unable to delete cluster template: %s." msgid_plural "Unable to delete cluster templates: %s." msgstr[0] "Unable to delete cluster template: %s." msgstr[1] "Unable to delete cluster templates: %s." #, python-format msgid "Unable to delete cluster: %s." msgid_plural "Unable to delete clusters: %s." msgstr[0] "Unable to delete cluster: %s." msgstr[1] "Unable to delete clusters: %s." #, python-format msgid "Unable to delete quota: %s." msgid_plural "Unable to delete quotas: %s." msgstr[0] "Unable to delete quota: %s." msgstr[1] "Unable to delete quotas: %s." #, python-format msgid "Unable to delete the cluster template with id: %(id)s" msgstr "Unable to delete the cluster template with id: %(id)s" msgid "Unable to delete the cluster templates." msgstr "Unable to delete the cluster templates." #, python-format msgid "Unable to delete the cluster with id: %(id)s" msgstr "Unable to delete the cluster with id: %(id)s" msgid "Unable to delete the clusters." msgstr "Unable to delete the clusters." #, python-format msgid "" "Unable to delete the quota with project id: %(projectId)s and resource: " "%(resource)s." msgstr "" "Unable to delete the quota with project id: %(projectId)s and resource: " "%(resource)s." msgid "Unable to get cluster's working nodes." msgstr "Unable to get cluster's working nodes." msgid "Unable to perform rolling upgrade." msgstr "Unable to perform rolling upgrade." msgid "Unable to process `Additional Labels`. Not all labels will be applied." msgstr "Unable to process `Additional Labels`. Not all labels will be applied." #, python-format msgid "Unable to resize given cluster id: %(id)s." msgstr "Unable to resize given cluster id: %(id)s." msgid "Unable to retrieve available add-ons." msgstr "Unable to retrieve available add-ons." msgid "Unable to retrieve available ingress controllers." msgstr "Unable to retrieve available ingress controllers." msgid "Unable to retrieve the certificate." msgstr "Unable to retrieve the certificate." msgid "Unable to retrieve the cluster template." msgstr "Unable to retrieve the cluster template." msgid "Unable to retrieve the cluster templates." msgstr "Unable to retrieve the cluster templates." msgid "Unable to retrieve the cluster." msgstr "Unable to retrieve the cluster." msgid "Unable to retrieve the clusters." msgstr "Unable to retrieve the clusters." msgid "Unable to retrieve the networks." msgstr "Unable to retrieve the networks." msgid "Unable to retrieve the quota." msgstr "Unable to retrieve the quota." msgid "Unable to retrieve the quotas." msgstr "Unable to retrieve the quotas." msgid "Unable to retrieve the stats." msgstr "Unable to retrieve the stats." msgid "Unable to rotate the certificate." msgstr "Unable to rotate the certificate." msgid "Unable to sign certificate." msgstr "Unable to sign certificate." msgid "Unable to update cluster template." msgstr "Unable to update cluster template." msgid "Unable to update cluster." msgstr "Unable to update cluster." msgid "Unable to update quota." msgstr "Unable to update quota." msgid "Update Cluster Template" msgstr "Update Cluster Template" msgid "Update Quota" msgstr "Update Quota" msgid "Updated" msgstr "Updated" msgid "Updated At" msgstr "Updated At" msgid "Use an Existing Network" msgstr "Use an Existing Network" msgid "Used {$ ctrl.stats.clusters $} of {$ ctrl.quota.clusters $}" msgstr "Used {$ ctrl.stats.clusters $} of {$ ctrl.quota.clusters $}" msgid "Volume Driver" msgstr "Volume Driver" msgid "Worker Nodes" msgstr "Worker Nodes" #, python-format msgid "You are not allowed to delete cluster templates: %s" msgstr "You are not allowed to delete cluster templates: %s" #, python-format msgid "You are not allowed to delete clusters: %s" msgstr "You are not allowed to delete clusters: %s" #, python-format msgid "You are not allowed to delete quotas: %s" msgstr "You are not allowed to delete quotas: %s" msgid "You cannot auto-scale to less than a single Worker Node." msgstr "You cannot auto-scale to less than a single Worker Node." msgid "You cannot resize to less than a single Worker Node." msgstr "You cannot resize to less than a single Worker Node." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted clusters " "are not recoverable." msgstr[0] "" "You have selected \"%s\". Please confirm your selection. Deleted cluster is " "not recoverable." msgstr[1] "" "You have selected \"%s\". Please confirm your selection. Deleted clusters " "are not recoverable." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "template is not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "templates are not recoverable." msgstr[0] "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "template is not recoverable." msgstr[1] "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "templates are not recoverable." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted quota is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted quotas are " "not recoverable." msgstr[0] "" "You have selected \"%s\". Please confirm your selection. Deleted quota is " "not recoverable." msgstr[1] "" "You have selected \"%s\". Please confirm your selection. Deleted quotas are " "not recoverable." msgid "" "You may only select as many nodes as you are reducing the original node " "count by." msgstr "" "You may only select as many nodes as you are reducing the original node " "count by." msgid "as follows:" msgstr "as follows:" msgid "error" msgid_plural "errors" msgstr[0] "error" msgstr[1] "errors" msgid "key=value,key2=value2..." msgstr "key=value,key2=value2..." msgid "message" msgid_plural "messages" msgstr[0] "message" msgstr[1] "messages" msgid "submit" msgid_plural "submits" msgstr[0] "submit" msgstr[1] "submits" msgid "success" msgid_plural "successes" msgstr[0] "success" msgstr[1] "successes" msgid "title" msgid_plural "titles" msgstr[0] "title" msgstr[1] "titles" msgid "{$ ctrl.cluster.create_timeout $} minute" msgid_plural "{$ ctrl.cluster.create_timeout $} minutes" msgstr[0] "{$ ctrl.cluster.create_timeout $} minute" msgstr[1] "{$ ctrl.cluster.create_timeout $} minutes" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9562724 magnum-ui-6.0.1/magnum_ui/locale/fr/0000775000175000017500000000000000000000000017267 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9762714 magnum-ui-6.0.1/magnum_ui/locale/fr/LC_MESSAGES/0000775000175000017500000000000000000000000021054 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/fr/LC_MESSAGES/django.po0000664000175000017500000000170400000000000022660 0ustar00zuulzuul00000000000000# Gérald LONLAS , 2016. #zanata # Mateusz Kowalski , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui 2.2.1.dev79\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2017-08-01 03:14+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-01 08:38+0000\n" "Last-Translator: Mateusz Kowalski \n" "Language-Team: French\n" "Language: fr\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" msgid "Cluster Templates" msgstr "Modèles de cluster" msgid "Clusters" msgstr "Clusters" msgid "Container Infra" msgstr "Infrastructure de conteneur" msgid "Container Infra - Cluster Templates" msgstr "Infrastructure de conteneur - Modèles de cluster" msgid "Container Infra - Clusters" msgstr "Infrastructure de conteneur - Clusters" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/fr/LC_MESSAGES/djangojs.po0000664000175000017500000004000500000000000023212 0ustar00zuulzuul00000000000000# Gérald LONLAS , 2016. #zanata # Ian Y. Choi , 2017. #zanata # Mateusz Kowalski , 2017. #zanata # Pascal Larivée , 2017. #zanata # JF Taltavull , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2020-04-02 03:39+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-02-25 06:29+0000\n" "Last-Translator: Gérald LONLAS \n" "Language-Team: French\n" "Language: fr\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" msgid "ADOPT COMPLETE" msgstr "ADOPTION TERMINÉE" msgid "API Address" msgstr "Adresse de l'API" msgid "API Server Port" msgstr "Port du serveur de l'API" msgid "An arbitrary human-readable name" msgstr "Un nom arbitraire compréhensible" msgid "" "Arbitrary labels in the form of key=value pairs to associate with a cluster " "templates. May be used multiple times." msgstr "" "Libellés arbitraires sous forme de paires clé=valeur à associer à un modèle " "de cluster. Peut être utilisé plusieurs fois." msgid "CHECK COMPLETE" msgstr "VÉRIFICATION TERMINÉE" msgid "COE" msgstr "COE" msgid "COE Version" msgstr "Version du COE" msgid "CREATE COMPLETE" msgstr "CRÉATION TERMINÉE" msgid "CREATE FAILED" msgstr "ÉCHEC DE LA CRÉATION" msgid "CREATE IN PROGRESS" msgstr "CRÉATION EN COURS" msgid "Cancel" msgstr "Annuler" #, python-format msgid "Certificate %s was successfully rotated." msgstr "Le certificat %s a été mis à jour avec succès." #, python-format msgid "Certificate %s was successfully signed." msgstr "Le certificat %s a été signé avec succès." msgid "Choose a Cluster Template" msgstr "Choisir le modèle de cluster" msgid "Choose a Container Orchestration Engine" msgstr "Choisissez un moteur d'orchestration de conteneurs" msgid "Choose a External Network" msgstr "Choisissez la réseau externe" msgid "Choose a Flavor for the Master Node" msgstr "Choisissez un gabarit pour le nœud maître" msgid "Choose a Flavor for the Node" msgstr "Choisir un gabarit pour le noeud." msgid "Choose a Keypair" msgstr "Choisir une paire de clés" msgid "Choose a Network Driver" msgstr "Choisir un pilote réseau" msgid "Choose a Private Network" msgstr "Choisissez la réseau privé" msgid "Choose a Private Network at first" msgstr "Premièrement, choisissez la réseau privé" msgid "Choose a Private Subnet" msgstr "Choisissez la sous-réseau privé" msgid "Choose a Volume Driver" msgstr "Choisir un pilote de volume" msgid "Choose an Image" msgstr "Choisir une image" msgid "Cinder" msgstr "Cinder" msgid "Cluster" msgstr "Cluster" #, python-format msgid "Cluster %s was successfully created." msgstr "Le cluster %s a été créé avec succès." msgid "Cluster Create Timeout" msgstr "Délai d'attente à la création du cluster" msgid "Cluster Distro" msgstr "Cluster Distro" msgid "Cluster Name" msgstr "Nom du cluster" msgid "Cluster Template" msgstr "Modèle de cluster" msgid "Cluster Template Detail" msgstr "Détail du modèle de cluster" msgid "Cluster Template Name" msgstr "Nom du Modèle de Cluster" msgid "Cluster Templates" msgstr "Modèles de cluster" msgid "Cluster Type" msgstr "Type de cluster" #, python-format msgid "Cluster template %s was successfully created." msgstr "Le modèle de cluster %s a été créé avec succès." #, python-format msgid "Cluster template %s was successfully updated." msgstr "Le modèle de cluster %s a été mis à jour avec succès." msgid "Clusters" msgstr "Clusters" msgid "Confirm Delete Cluster" msgid_plural "Confirm Delete Clusters" msgstr[0] "Confirmer la suppression du cluster" msgstr[1] "Confirmer la suppression des clusters" msgid "Confirm Delete Cluster Template" msgid_plural "Confirm Delete Cluster Templates" msgstr[0] "Confirmer la suppression du modèle de cluster" msgstr[1] "Confirmer la suppression des modèles de cluster" msgid "Container Orchestration Engine" msgstr "Moteur d'orchestration de conteneurs" msgid "Create" msgstr "Créer" msgid "Create Cluster" msgstr "Créer le cluster" msgid "Create Cluster Template" msgstr "Créer un modèle de cluster" msgid "Created" msgstr "Créé" msgid "DC/OS" msgstr "DC/OS" msgid "DELETE COMPLETE" msgstr "SUPPRESSION TERMINÉE" msgid "DELETE FAILED" msgstr "ÉCHEC DE LA SUPPRESSION" msgid "DELETE IN PROGRESS" msgstr "SUPPRESSION EN COURS" msgid "DNS" msgstr "DNS" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Supprimer le cluster" msgstr[1] "Supprimer les clusters" msgid "Delete Cluster Template" msgid_plural "Delete Cluster Templates" msgstr[0] "Supprimer le modèle de cCluster" msgstr[1] "Supprimer les modèles de cluster" msgid "Delete Cluster Templates" msgstr "Supprimer les modèles de cluster" msgid "Delete Clusters" msgstr "Supprimer les clusters" #, python-format msgid "Deleted cluster template: %s." msgid_plural "Deleted cluster templates: %s." msgstr[0] "Modèle de cluster supprimé : %s" msgstr[1] "Modèles de cluster supprimés : %s" #, python-format msgid "Deleted cluster: %s." msgid_plural "Deleted clusters: %s." msgstr[0] "Cluster supprimé : %s" msgstr[1] "Clusters supprimés : %s" msgid "Device Mapper" msgstr "Device Mapper" msgid "Disable TLS" msgstr "Désactiver TLS" msgid "Disable TLS in the cluster template. Default: False" msgstr "Désactiver TLS dans le modèle du cluster. Par défaut : False" msgid "Discovery URL" msgstr "Discovery URL" msgid "Docker" msgstr "Docker" msgid "Docker Storage Driver" msgstr "Pilote du stockage Docker" msgid "Docker Swarm" msgstr "Docker Swarm" msgid "Docker Volume Size" msgstr "Taille du volume Docker" msgid "Docker Volume Size (GB)" msgstr "Taille du volume Docker (Go)" msgid "Enable Registry" msgstr "Activer le registre" msgid "Enable docker registry in the cluster temlate. Default: False" msgstr "" "Activer le registre Docker dans le modèle du cluster. Par défaut : False" msgid "Exists" msgstr "Existe" msgid "External Network ID" msgstr "ID du réseau externe" msgid "Fixed Network" msgstr "Réseau fixe" msgid "Fixed Subnet" msgstr "Sous-réseau fixe" msgid "Flannel" msgstr "Flannel" msgid "Flavor" msgstr "Gabarit" msgid "Flavor ID" msgstr "ID du gabarit" msgid "Floating IP" msgstr "IP flottantes" msgid "Floating IP Enabled" msgstr "IP flottantes activées" msgid "HTTP Proxy" msgstr "Proxy HTTP" msgid "HTTPS Proxy" msgstr "Proxy HTTPS" msgid "ID" msgstr "ID" msgid "Image" msgstr "Image" msgid "Image ID" msgstr "ID de l'image" msgid "" "Indicates whether created clusters should have a floating ip or not. " "Default: True" msgstr "" "Indique si le cluster créé devrait avoir une ip flottante. Défaut: Vrai" msgid "" "Indicates whether created clusters should have a load balancer for master " "nodes or not. Default: False" msgstr "" "Indique si le cluster créé devrait avoir un load balancer pour les nodes " "maîtresses . Défaut: Faux" msgid "Infinite" msgstr "Infini" msgid "Info" msgstr "Info" msgid "KEY1=VALUE1, KEY2=VALUE2..." msgstr "KEY1=VALUE1, KEY2=VALUE2..." msgid "Keypair" msgstr "Paire de clés" msgid "Kubernetes" msgstr "Kubernetes" msgid "Labels" msgstr "Libellés" msgid "Make cluster template public. Default: False" msgstr "Rendre le modèle de cluster public. Par défaut : False" msgid "Margin" msgstr "Marge" msgid "Master Addresses" msgstr "Adresse du nœud Master" msgid "Master Count" msgstr "Nombre de nœuds Master" msgid "Master Flavor" msgstr "Gabarit maître" msgid "Master Flavor ID" msgstr "ID Gabarit maître" msgid "Master LB" msgstr "LB maître" msgid "Master LB Enabled" msgstr "LB maître activé" msgid "Mesos" msgstr "Mesos" msgid "Miscellaneous" msgstr "Divers" msgid "Name" msgstr "Nom" msgid "Name of the cluster template." msgstr "Nom du modèle de cluster." msgid "Network" msgstr "Réseau" msgid "Network Driver" msgstr "Pilote réseau" msgid "No Proxy" msgstr "Pas de proxy" msgid "Node Addresses" msgstr "Adresse du nœud" msgid "Node Count" msgstr "Nombre de noeuds" msgid "Node Spec" msgstr "Spécification du nœud" msgid "Nodes" msgstr "Nœuds" msgid "Overlay" msgstr "Overlay" msgid "Overview" msgstr "Vue d'ensemble" msgid "Public" msgstr "Public" msgid "RESTORE COMPLETE" msgstr "RESTAURATION TERMINÉE" msgid "RESUME COMPLETE" msgstr "REPRISE TERMINÉE" msgid "ROLLBACK COMPLETE" msgstr "ANNULATION TERMINÉE" msgid "Record Properties" msgstr "Propriétés d'enregistrement" msgid "Registry Enabled" msgstr "Registre activé" msgid "Rexray" msgstr "Rexray" msgid "Rotate Certificate" msgstr "Mettez à jour le certificat" msgid "SNAPSHOT COMPLETE" msgstr "INSTANTANÉ TERMINÉE" msgid "Server Type" msgstr "Type de serveur" msgid "Show Certificate" msgstr "Afficher le certificat" msgid "Sign Certificate" msgstr "Signer le certificat" msgid "Sign Certificate To Cluster: {$ ctrl.model.cluster_name $}" msgstr "Signer un Certificat pour le cluster : {$ ctrl.model.cluster_name $}" msgid "Size" msgstr "Taille" msgid "Specify the Container Orchestration Engine to use." msgstr "Spécifiez le moteur d'orchestration de conteneurs à utiliser" msgid "" "Specify the nameserver to use for the cluster template. Default: 8.8.8.8" msgstr "" "Spécifier le nameserver à utiliser pour le modèle de cluster. Défaut : " "8.8.8.8" msgid "Specify the size in GB for the docker volume" msgstr "Spécifier la taille en Go pour le volume Docker." msgid "Stack ID" msgstr "ID Stack" msgid "Stats" msgstr "Stats" msgid "Status" msgstr "Statut" msgid "TLS Disabled" msgstr "TLS désactivé" msgid "The DNS nameserver to use for this cluster template" msgstr "Le DNS nameserver à utiliser pour ce modèle de cluster." msgid "The URL of docker registry." msgstr "URL de la registry docker" msgid "The cluster node count." msgstr "Nombre de noeuds du cluster" msgid "The http_proxy address to use for nodes in cluster" msgstr "L'adresse http_proxy à utiliser pour les nœuds du cluster" msgid "The https_proxy address to use for nodes in cluster" msgstr "Adresse https_proxy à utiliser pour les noeuds du cluster." msgid "The name or UUID of the SSH keypair to load into the cluster nodes." msgstr "" "Le nom ou le UUID de la keypair SSH à charger dans les nœuds du cluster" msgid "The name or UUID of the base image to customize for the cluster." msgstr "Le nom ou le UUID de l'image de base à personnaliser pour le cluster" msgid "The no_proxy address to use for nodes in cluster" msgstr "L'adresse no_proxy à utiliser pour les nœuds du cluster" msgid "The nova flavor id to use when launching the cluster. Default: m1.small" msgstr "" "L'ID du gabarit Nova à utiliser quand le cluster démarrera. Par défaut : m1." "small" msgid "" "The nova flavor id to use when launching the master node of the cluster. " "Default: m1.small" msgstr "" "L'ID du gabarit Nova à utiliser quand le nœud maître du cluster démarrera. " "Par défaut : m1.small" msgid "The size in GB for Docker Volume. Default: 25" msgstr "Taille en Go du volume Docker. Défaut : 25" msgid "This should really be named fixed-network-cidr. Default: 10.0.0.0/24" msgstr "Ceci devrait être nommé cidr-réseaux-fixe. Défaut: 10.0.0.0/24" msgid "UPDATE COMPLETE" msgstr "MISE À JOUR TERMINÉE" msgid "UPDATE FAILED" msgstr "ÉCHEC DE LA MISE À JOUR" msgid "UPDATE IN PROGRESS" msgstr "MISE À JOUR EN COURS" msgid "Unable to create cluster template." msgstr "Impossible de créer le modèle de cluster." msgid "Unable to create cluster." msgstr "Impossible de créer le cluster." msgid "Unable to create quota." msgstr "Impossible de créer le quota." #, python-format msgid "Unable to delete cluster template: %s." msgid_plural "Unable to delete cluster templates: %s." msgstr[0] "Impossible de supprimer le modèle de cluster : %s" msgstr[1] "Impossible de supprimer les modèles de cluster : %s" #, python-format msgid "Unable to delete cluster: %s." msgid_plural "Unable to delete clusters: %s." msgstr[0] "Impossible de supprimer le cluster : %s" msgstr[1] "Impossible de supprimer les clusters : %s" #, python-format msgid "Unable to delete the cluster template with id: %(id)s" msgstr "Impossible de supprimer le modèle de cluster avec l'ID : %(id)s" msgid "Unable to delete the cluster templates." msgstr "Impossible de supprimer les modèles de cluster." #, python-format msgid "Unable to delete the cluster with id: %(id)s" msgstr "Impossible de supprimer le cluster avec l'ID : %(id)s" msgid "Unable to delete the clusters." msgstr "Impossible de supprimer les clusters." msgid "Unable to retrieve the certificate." msgstr "Impossible de récupérer le certificat." msgid "Unable to retrieve the cluster template." msgstr "Impossible de récupérer le modèle de cluster." msgid "Unable to retrieve the cluster templates." msgstr "Impossible de récupérer les modèles de cluster." msgid "Unable to retrieve the cluster." msgstr "Impossible de récupérer le cluster." msgid "Unable to retrieve the clusters." msgstr "Impossible de récupérer les clusters." msgid "Unable to retrieve the networks." msgstr "Impossible de récupérer les réseaux." msgid "Unable to retrieve the quota." msgstr "Impossible de récupérer le quota." msgid "Unable to retrieve the quotas." msgstr "Impossible de récupérer les quotas." msgid "Unable to retrieve the stats." msgstr "Impossible de récupérer les statistiques." msgid "Unable to rotate the certificate." msgstr "Impossible de mettre à jour le certificat." msgid "Unable to sign certificate." msgstr "Impossible de signer le certificat." msgid "Unable to update cluster template." msgstr "Impossible de mettre à jour le modèle de cluster." msgid "Unable to update cluster." msgstr "Impossible de mettre à jour le cluster." msgid "Unable to update quota." msgstr "Impossible de mettre à jour le quota." msgid "Update Cluster Template" msgstr "Mettre à jour le modèle de cluster" msgid "Updated" msgstr "Mis à jour" msgid "Used {$ ctrl.stats.clusters $} of {$ ctrl.quota.clusters $}" msgstr "Utilisés {$ ctrl.stats.clusters $} sur {$ ctrl.quota.clusters $}" msgid "Volume Driver" msgstr "Pilote de volume" #, python-format msgid "You are not allowed to delete cluster templates: %s" msgstr "Vous n'êtes pas autorisé à supprimer les modèles de cluster : %s" #, python-format msgid "You are not allowed to delete clusters: %s" msgstr "Vous n'êtes pas autorisé à supprimer les clusters : %s" #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted clusters " "are not recoverable." msgstr[0] "" "Vous avez sélectionné \"%s\". Veuillez confirmer votre sélection. Le cluster " "supprimé ne sera pas récupérable." msgstr[1] "" "Vous avez sélectionné \"%s\". Veuillez confirmer votre sélection. Les " "clusters supprimés ne seront pas récupérable.." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "template is not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "templates are not recoverable." msgstr[0] "" "Vous avez sélectionné \"%s\". Veuillez confirmer votre sélection. Le modèle " "de cluster supprimé ne sera pas récupérable." msgstr[1] "" "Vous avez sélectionné \"%s\". Veuillez confirmer votre sélection. Les " "modèles de cluster supprimés ne seront pas récupérables." msgid "error" msgid_plural "errors" msgstr[0] "erreur" msgstr[1] "erreurs" msgid "message" msgid_plural "messages" msgstr[0] "message" msgstr[1] "messages" msgid "submit" msgid_plural "submits" msgstr[0] "soumission" msgstr[1] "soumissions" msgid "success" msgid_plural "successes" msgstr[0] "succès " msgstr[1] "succès" msgid "title" msgid_plural "titles" msgstr[0] "titre" msgstr[1] "titres" msgid "{$ ctrl.cluster.create_timeout $} minute" msgid_plural "{$ ctrl.cluster.create_timeout $} minutes" msgstr[0] "{$ ctrl.cluster.create_timeout $} minute" msgstr[1] "{$ ctrl.cluster.create_timeout $} minutes" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9562724 magnum-ui-6.0.1/magnum_ui/locale/id/0000775000175000017500000000000000000000000017254 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9762714 magnum-ui-6.0.1/magnum_ui/locale/id/LC_MESSAGES/0000775000175000017500000000000000000000000021041 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/id/LC_MESSAGES/django.po0000664000175000017500000000212200000000000022640 0ustar00zuulzuul00000000000000# suhartono , 2016. #zanata # suhartono , 2017. #zanata # suhartono , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-05-10 05:31+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-05-09 04:29+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 "Cluster Templates" msgstr "Cluster Templates (template klaster)" msgid "Clusters" msgstr "Clusters (klaster)" msgid "Container Infra" msgstr "Container Infra (infra kontainer)" msgid "Container Infra - Cluster Templates" msgstr "Container Infra - Cluster Templates" msgid "Container Infra - Clusters" msgstr "Container Infra - Clusters" msgid "Container Infra - Quotas" msgstr "Container Infra - Quotas" msgid "Quotas" msgstr "Quotas" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/id/LC_MESSAGES/djangojs.po0000664000175000017500000006760400000000000023215 0ustar00zuulzuul00000000000000# suhartono , 2016. #zanata # Ian Y. Choi , 2017. #zanata # suhartono , 2017. #zanata # suhartono , 2018. #zanata # suhartono , 2019. #zanata # suhartono , 2020. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2020-05-21 02:25+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2020-05-20 04:12+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 "This cluster is already on the latest compatible template" msgstr "This cluster is already on the latest compatible template" msgid "A batch cannot have less than one node." msgstr "Batch tidak boleh memiliki kurang dari satu node." msgid "" "A minimum number of Worker Nodes cannot be higher than the default number of " "Worker Nodes." msgstr "" "Jumlah minimum Worker Nodes tidak boleh lebih tinggi dari jumlah default " "Worker Nodes." msgid "ADOPT COMPLETE" msgstr "ADOPT COMPLETE (adopsi lengkap)" msgid "API Address" msgstr "API Address (alamat API)" msgid "API Server Port" msgstr "API Server Port" msgid "Accessible on private network only" msgstr "Dapat diakses hanya di jaringan pribadi" msgid "Accessible on the public internet" msgstr "Dapat diakses di internet publik" msgid "Additional Labels" msgstr "Additional Labels" msgid "Addon Software" msgstr "Addon Software" msgid "Addon software" msgstr "Perangkat lunak addon" msgid "Advanced" msgstr "Advanced" msgid "An arbitrary human-readable name" msgstr "nama human-readable sebarang" msgid "" "Any addon software selected will be installed at the latest supported " "version when the cluster is deployed, but will not be upgraded automatically " "by rolling upgrades." msgstr "" "Setiap perangkat lunak addon yang dipilih akan diinstal pada versi yang " "didukung terbaru ketika cluster disebarkan, tetapi tidak akan ditingkatkan " "secara otomatis dengan menggulirkan peningkatan (rolling upgrades)." msgid "" "Arbitrary labels in the form of key=value pairs to associate with a cluster " "templates. May be used multiple times." msgstr "" "Label sebarang dalam bentuk key-value pairs untuk mengasosiasikan dengan " "template klaster. Dapat digunakan beberapa kali." msgid "Auto Healing" msgstr "Auto Healing" msgid "Auto Scaling" msgstr "Auto Scaling" msgid "" "Auto scaling requires the use of CPU and memory limits on the resource " "definition of Pods." msgstr "" "Penskalaan otomatis memerlukan penggunaan CPU dan batas memori pada definisi " "sumber daya dari Pods." msgid "Auto-scale Worker Nodes" msgstr "Auto-scale Worker Nodes" msgid "Automatically Repair Unhealthy Nodes" msgstr "Automatically Repair Unhealthy Nodes" msgid "Availability Zone" msgstr "Availability Zone" msgid "CHECK COMPLETE" msgstr "CHECK COMPLETE (cek lengkap)" msgid "COE" msgstr "COE" msgid "COE Version" msgstr "COE Version" msgid "CREATE COMPLETE" msgstr "CREATE COMPLETE (pembuatan lengkap)" msgid "CREATE FAILED" msgstr "CREATE FAILED (pembuatan gagal)" msgid "CREATE IN PROGRESS" msgstr "CREATE IN PROGRESS (pembuatan sedang berjalan)" msgid "CSR" msgstr "CSR" msgid "Calico" msgstr "Calico" msgid "Cancel" msgstr "Cancel (membatalkan)" #, python-format msgid "Certificate %s was successfully rotated." msgstr "Sertifikat %s berhasil diputar." #, python-format msgid "Certificate %s was successfully signed." msgstr "Sertifikat %s berhasil ditandatangani." msgid "Choose a Cluster Template" msgstr "Pilih template cluster" msgid "Choose a Cluster Template to upgrade to" msgstr "Pilih Cluster Template untuk ditingkatkan" msgid "Choose a Container Orchestration Engine" msgstr "Pilih Container Orchestration Engine" msgid "Choose a External Network" msgstr "Pilih External Network" msgid "Choose a Flavor for the Master Node" msgstr "Pilih Flavor untuk Master Node" msgid "Choose a Flavor for the Node" msgstr "Pilih Flavor untuk Node" msgid "Choose a Flavor for the Worker Node" msgstr "Pilih Flavour for the Worker Node" msgid "Choose a Keypair" msgstr "Pilih Keypair" msgid "Choose a Network Driver" msgstr "Pilih driver jaringan" msgid "Choose a Private Network" msgstr "Pilih Private Network" msgid "Choose a Private Network at first" msgstr "Pilih Private Network pada awalnya" msgid "Choose a Private Subnet" msgstr "Pilih Private Subnet" msgid "Choose a Project" msgstr "Choose a Project" msgid "Choose a Volume Driver" msgstr "Pilih driver volume" msgid "Choose an Availability Zone" msgstr "Pilih Zona Ketersediaan (Availability Zone)" msgid "Choose an Image" msgstr "Pilih Image" msgid "Choose an existing network" msgstr "Pilih jaringan yang ada" msgid "Choose an ingress controller" msgstr "Pilih pengontrol ingress" msgid "Choose nodes to remove (Optional)" msgstr "Pilih node untuk dihapus (Opsional)" msgid "Cinder" msgstr "Cinder" msgid "Cluster" msgstr "Cluster (klaster)" #, python-format msgid "Cluster %s was successfully created." msgstr "Klaster %s berhasil dibuat." msgid "Cluster API" msgstr "Cluster API" msgid "Cluster Create Timeout" msgstr "Cluster Create Timeout (batas waktu pembuatan klaster)" msgid "Cluster Distro" msgstr "Cluster Distro (distro cluster)" msgid "Cluster Name" msgstr "Cluster Name (nama klaster)" msgid "Cluster Template" msgstr "Cluster Template" msgid "Cluster Template Detail" msgstr "Cluster Template Detail (rinci template klaster)" msgid "Cluster Template Name" msgstr "Cluster Template Name (nama template klaster)" msgid "Cluster Templates" msgstr "Cluster Templates (template klaster)" msgid "Cluster Type" msgstr "Cluster Type (tipe klaster)" msgid "Cluster is being resized." msgstr "Cluster sedang diubah ukurannya." msgid "Cluster is being upgraded to the new Cluster template" msgstr "Cluster sedang ditingkatkan ke templat Cluster baru" #, python-format msgid "Cluster template %s was successfully created." msgstr "Template klaster %s berhasil dibuat." #, python-format msgid "Cluster template %s was successfully updated." msgstr "Template klaster %s telah berhasil diperbarui." msgid "Clusters" msgstr "Clusters (klaster)" msgid "Confirm Delete Cluster" msgid_plural "Confirm Delete Clusters" msgstr[0] "Confirm Delete Cluster" msgid "Confirm Delete Cluster Template" msgid_plural "Confirm Delete Cluster Templates" msgstr[0] "Confirm Delete Cluster Template" msgid "Confirm Delete Quota" msgid_plural "Confirm Delete Quotas" msgstr[0] "Confirm Delete Quota" msgid "Container Orchestration Engine" msgstr "Container Orchestration Engine (mesin Orchestration kontainer)" msgid "Container Version" msgstr "Container Version" msgid "Create" msgstr "Create (buat)" msgid "Create Cluster" msgstr "Buat klaster" msgid "Create Cluster Template" msgstr "Create Cluster Template" msgid "Create New Cluster" msgstr "Create New Cluster" msgid "Create New Network" msgstr "Create New Network" msgid "Create Quota" msgstr "Create Quota" msgid "Created" msgstr "Created (dibuat)" msgid "Created At" msgstr "Created At" msgid "DC/OS" msgstr "DC/OS" msgid "DELETE COMPLETE" msgstr "DELETE COMPLETE (penghapusan lengkap)" msgid "DELETE FAILED" msgstr "DELETE FAILED (penghapusan gagal)" msgid "DELETE IN PROGRESS" msgstr "DELETE IN PROGRESS (penghapusan sedang berjalan)" msgid "DNS" msgstr "DNS" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Delete Cluster" msgid "Delete Cluster Template" msgid_plural "Delete Cluster Templates" msgstr[0] "Delete Cluster Template" msgid "Delete Cluster Templates" msgstr "Delete Cluster Templates (hapus template klaster)" msgid "Delete Clusters" msgstr "Delete Clusters (hapus klaster)" msgid "Delete Quota" msgid_plural "Delete Quotas" msgstr[0] "Delete Quota" msgid "Delete Quotas" msgstr "Delete Quotas" #, python-format msgid "Deleted cluster template: %s." msgid_plural "Deleted cluster templates: %s." msgstr[0] "Deleted cluster template: %s." #, python-format msgid "Deleted cluster: %s." msgid_plural "Deleted clusters: %s." msgstr[0] "Deleted cluster: %s." #, python-format msgid "Deleted quota: %s." msgid_plural "Deleted quotas: %s." msgstr[0] "Deleted quota: %s." msgid "Details" msgstr "Details" msgid "Device Mapper" msgstr "Device Mapper" msgid "Disable TLS" msgstr "Nonaktifkan TLS" msgid "Disable TLS in the cluster template. Default: False" msgstr "Menonaktifkan TLS dalam template klaster. Default: False" msgid "Discovery URL" msgstr "Discovery URL" msgid "Docker" msgstr "Docker" msgid "Docker Storage Driver" msgstr "Docker Storage Driver (driver penyimpanan docker)" msgid "Docker Swarm" msgstr "Docker Swarm" msgid "Docker Swarm Mode" msgstr "Docker Swarm Mode" msgid "Docker Volume Size" msgstr "Docker Volume Size (ukuran volume docker)" msgid "Docker Volume Size (GB)" msgstr "Docker Volume Size (GB)" msgid "Enable Registry" msgstr "Enable Registry (aktifkan registry)" msgid "Enable docker registry in the cluster temlate. Default: False" msgstr "Aktifkan registri docker di klaster template. Default: False" msgid "Exists" msgstr "Exists" msgid "External Network ID" msgstr "External Network ID (id jaringan eksternal)" msgid "Fixed Network" msgstr "Fixed Network (jaringan tetap)" msgid "Fixed Subnet" msgstr "Fixed Subnet (subnet tetap)" msgid "Flannel" msgstr "Flannel" msgid "Flavor" msgstr "Flavor" msgid "Flavor ID" msgstr "Flavor ID (ID flavor)" msgid "Flavor of Master Nodes" msgstr "Flavor of Master Nodes" msgid "Flavor of Worker Nodes" msgstr "Flavor of Worker Nodes" msgid "Floating IP" msgstr "Floating IP (IP mengambang)" msgid "Floating IP Enabled" msgstr "Floating IP Enabled (IP mengambang diaktifkan)" msgid "HTTP Proxy" msgstr "HTTP Proxy" msgid "HTTPS Proxy" msgstr "HTTPS Proxy" msgid "Hard Limit" msgstr "Hard Limit" msgid "Hidden" msgstr "Hidden" msgid "I do want to override Template and Workflow Labels" msgstr "Saya ingin mengganti Label Template dan Workflow" msgid "ID" msgstr "ID (id)" msgid "" "If Kubernetes is unable to schedule a Pod due to insuficient CPU or memory " "in the cluster, a worker node will be added, as long as the maximum number " "of worker nodes has not been reached." msgstr "" "Jika Kubernetes tidak dapat menjadwalkan Pod karena kekurangan CPU atau " "memori di cluster, node pekerja akan ditambahkan, selama jumlah maksimum " "node pekerja belum tercapai." msgid "" "If enabled, the minimum and maximum number of worker nodes must be specified." msgstr "" "Jika diaktifkan, jumlah minimum dan maksimum node pekerja harus ditentukan." #, python-format msgid "" "If the aggregate resource limits of all existing Pods is lower than 50% of " "the cluster capacity, a worker node will be removed, as long as the minimum " "number of worker nodes has not been reached." msgstr "" "Jika batas sumber daya agregat dari semua Pod yang ada lebih rendah dari " "50% dari kapasitas cluster, node pekerja akan dihapus, selama jumlah minimum " "node pekerja belum tercapai." msgid "Image" msgstr "Image" msgid "Image ID" msgstr "Image ID (ID image)" msgid "" "Indicates whether created clusters should have a floating ip or not. " "Default: True" msgstr "" "Menunjukkan apakah cluster yang dibuat harus memiliki ip mengambang atau " "tidak. Default: True" msgid "" "Indicates whether created clusters should have a load balancer for master " "nodes or not. Default: False" msgstr "" "Menunjukkan apakah cluster yang dibuat harus memiliki penyeimbang beban " "(load balancer) untuk node induk (master node) atau tidak. Default: False" msgid "Infinite" msgstr "Infinite (tak terbatas)" msgid "Info" msgstr "Info" msgid "Ingress" msgstr "Ingress" msgid "Ingress Controller" msgstr "Ingress Controller" msgid "Insecure Registry" msgstr "Registry tidak aman" msgid "" "Invalid format. Must be a comma-separated key-value string: key=value," "key2=value2" msgstr "" "Format yang tidak valid. Harus berupa string key-value yang dipisahkan koma: " "key=value,key2=value2" msgid "It is generally not recommended to give public access." msgstr "Biasanya tidak disarankan untuk memberikan akses publik." msgid "KEY1=VALUE1, KEY2=VALUE2..." msgstr "KEY1=VALUE1, KEY2=VALUE2..." msgid "Keypair" msgstr "Keypair (sepasang kunci)" msgid "Kubernetes" msgstr "Kubernetes" msgid "Labels" msgstr "Labels" msgid "Limit for this resource." msgstr "Batasi untuk sumber daya ini." msgid "Loading" msgstr "Loading" msgid "Make cluster template public. Default: False" msgstr "Membuat publik template klaster. Default: False" msgid "" "Making the Kubernetes API accessible from anywhere on the public internet is " "convenient, but may represent a security risk. [When selecting this " "option, it is recommended to limit access to a trusted IP address range.]" msgstr "" "Membuat API Kubernetes dapat diakses dari mana saja di internet publik " "adalah hal yang mudah, tetapi mungkin merupakan risiko keamanan. [When " "selecting this option, it is recommended to limit access to a trusted IP " "address range.]" msgid "" "Making the Kubernetes API accessible from the private network only is the " "most secure option (the default), but access will be limited to compute " "instances on the same private network or a VPN to that network." msgstr "" "Membuat API Kubernetes hanya dapat diakses dari jaringan pribadi adalah opsi " "yang paling aman (default), tetapi akses akan dibatasi untuk menghitung " "instance di jaringan pribadi yang sama atau VPN ke jaringan itu." msgid "Management" msgstr "Management" msgid "Margin" msgstr "Margin" msgid "Master Addresses" msgstr "Master Addresses (alamat induk)" msgid "Master Count" msgstr "Master Count (hitung induk)" msgid "Master Flavor" msgstr "Master Flavor" msgid "Master Flavor ID" msgstr "Master Flavor ID (ID flavor induk)" msgid "Master LB" msgstr "Master LB" msgid "Master LB Enabled" msgstr "Master LB Enabled (master LB diaktifkan)" msgid "Master Nodes" msgstr "Master Nodes" msgid "Maximum Batch Size" msgstr "Maximum Batch Size" msgid "Maximum number of Worker Nodes" msgstr "Jumlah maksimum dari Worker Nodes" msgid "Mesos" msgstr "Mesos" msgid "Minimum Number of Worker Nodes" msgstr "Minimum Number of Worker Nodes" msgid "Miscellaneous" msgstr "Miscellaneous (lain-lain)" msgid "Name" msgstr "Name (nama)" msgid "Name of the cluster" msgstr "Nama cluster" msgid "Name of the cluster template." msgstr "Nama dari template cluster." msgid "Network" msgstr "Network" msgid "Network Access Control" msgstr "Network Access Control" msgid "Network Driver" msgstr "Network Driver (driver jaringan)" msgid "New Cluster Template" msgstr "New Cluster Template" msgid "No Proxy" msgstr "No Proxy" msgid "Node Addresses" msgstr "Node Addresses (alamat simpul)" msgid "Node Count" msgstr "Node Count (hitung simpul)" msgid "Node Flavor ID" msgstr "Node Flavor ID" msgid "Node Spec" msgstr "Node Spec" msgid "Nodes" msgstr "Nodes (simpul)" msgid "None" msgstr "None" msgid "Number of Master Nodes" msgstr "Jumlah Master Nodes" msgid "Number of Worker Nodes" msgstr "Number of Worker Nodes" msgid "Overlay" msgstr "Overlay" msgid "" "Overriding labels already defined by cluster template orworkflow might " "result in unpredictable behaviour." msgstr "" "Mengganti label yang sudah ditentukan oleh templat klaster atau orworkflow " "dapat mengakibatkan perilaku yang tidak dapat diprediksi." msgid "Overview" msgstr "Overview (ikhtisar)" msgid "" "Please note that updates may cause application downtime if workloads " "deployed to Kubernetes are not following the best practices outlined in the " "documentation (for example, not using multiple replicas)." msgstr "" "Harap perhatikan bahwa pembaruan dapat menyebabkan waktu henti aplikasi jika " "beban kerja yang digunakan untuk Kubernetes tidak mengikuti praktik terbaik " "yang diuraikan dalam dokumentasi (misalnya, tidak menggunakan beberapa " "replika)." msgid "Project" msgstr "Project" msgid "Project ID" msgstr "Project ID" msgid "Public" msgstr "Public (publik)" msgid "Quota" msgstr "Quota" #, python-format msgid "Quota %s was successfully created." msgstr "Kuota %s berhasil dibuat." #, python-format msgid "Quota %s/%s was successfully updated." msgstr "Kuota %s/%s berhasil diperbarui." msgid "Quotas" msgstr "Quotas" msgid "RESTORE COMPLETE" msgstr "RESTORE COMPLETE (mengembalikan lengkap)" msgid "RESUME COMPLETE" msgstr "RESUME COMPLETE (melanjutkan lengkap)" msgid "ROLLBACK COMPLETE" msgstr "ROLLBACK COMPLETE (rollback lengkap)" msgid "Record Properties" msgstr "Record Properties (properti record)" msgid "Registry Enabled" msgstr "Registry Enabled (Registri diaktifkan)" msgid "Resize Cluster" msgstr "Resize Cluster" msgid "Resource" msgstr "Resource" msgid "Rexray" msgstr "Rexray" msgid "Rolling Cluster Upgrade" msgstr "Rolling Cluster Upgrade" msgid "Rotate Certificate" msgstr "Putar Sertifikat" msgid "SNAPSHOT COMPLETE" msgstr "SNAPSHOT COMPLETE (snapshot lengkap)" msgid "Security Updates" msgstr "Security Updates" msgid "Server Type" msgstr "Server Type (tipe server)" msgid "Show Certificate" msgstr "Show Certificate (tampilkan sertifikat)" msgid "Sign Certificate" msgstr "Sign Certificate" msgid "Sign Certificate To Cluster: {$ ctrl.model.cluster_name $}" msgstr "Sign Certificate To Cluster: {$ ctrl.model.cluster_name $}" msgid "Size" msgstr "Size (ukuran)" msgid "" "Specify additional kube_labels to apply to the cluster or override labels " "set by the cluster template. Overriding labels set by the cluster template " "may result in your cluster being misconfigured, unstable or unable to be " "created." msgstr "" "Tentukan kube_labels tambahan untuk diterapkan pada klaster atau timpa label " "yang ditetapkan oleh templat klaster. Mengganti label yang ditetapkan oleh " "templat klaster dapat mengakibatkan klaster Anda salah konfigurasi, tidak " "stabil atau tidak dapat dibuat." msgid "Specify the Container Orchestration Engine to use." msgstr "Tentukan Container Orchestration Engine untuk digunakan." msgid "" "Specify the nameserver to use for the cluster template. Default: 8.8.8.8" msgstr "" "Menentukan nameserver yang akan digunakan untuk template klaster. Default: " "8.8.8.8" msgid "Specify the size in GB for the docker volume" msgstr "Tentukan ukuran dalam GB untuk volume docker" msgid "Stack" msgstr "Stack" msgid "Stack Faults" msgstr "Stack Faults" msgid "Stack ID" msgstr "Stack ID (ID stack)" msgid "Stats" msgstr "Stats" msgid "Status" msgstr "Status (status)" msgid "Status Reason" msgstr "Status Reason" msgid "TLS Disabled" msgstr "TLS Disabled (TLS tidak aktif)" msgid "The DNS nameserver to use for this cluster template" msgstr "Nameserver DNS digunakan untuk template klaster ini." msgid "The URL of docker registry." msgstr "URL dari registry docker" msgid "The cluster node count." msgstr "Jumlah node klaster." msgid "The http_proxy address to use for nodes in cluster" msgstr "Alamat http_proxy digunakan untuk node dalam klaster" msgid "The https_proxy address to use for nodes in cluster" msgstr "Alamat http_proxy digunakan untuk node dalam klaster" msgid "" "The key=value pair string is case insensitive and will be converted to lower " "case." msgstr "" "The key=value pair string tidak sensitif huruf dan akan dikonversi ke huruf " "kecil." msgid "" "The maximum number of Worker Nodes a new cluster can auto-scale to cannot be " "less than the total amount of Worker Nodes." msgstr "" "Jumlah maksimum Worker Nodes yang dapat di-skala otomatis oleh cluster baru " "tidak boleh kurang dari jumlah total Worker Nodes." msgid "" "The maximum number of Worker Nodes cannot be less than the default number of " "Worker Nodes and 1." msgstr "" "Jumlah maksimum Worker Nodes tidak boleh kurang dari jumlah default Worker " "Nodes dan 1." msgid "The maximum number of nodes in the batch has been exceeded." msgstr "Jumlah maksimum node dalam kumpulan telah terlampaui." msgid "" "The minimum number of Worker Nodes a new cluster can auto scale to cannot " "exceed the total amount of Worker Nodes." msgstr "" "Jumlah minimum dari Worker Nodes yang dapat diukur secara otomatis oleh " "cluster baru tidak dapat melebihi jumlah total Worker Nodes." msgid "The name or UUID of the SSH keypair to load into the cluster nodes." msgstr "" "Nama atau UUID dari pasangan kunci (keypair) SSH untuk memuat ke node " "klaster." msgid "The name or UUID of the base image to customize for the cluster." msgstr "Nama atau UUID dari image dasar untuk menyesuaikan dengan klaster." msgid "The no_proxy address to use for nodes in cluster" msgstr "Alamat no_proxy digunakan untuk node dalam klaster" msgid "The nova flavor id to use when launching the cluster. Default: m1.small" msgstr "" "Id flavor nova untuk dgunakan ketika peluncuran klaster. Default: m1.small" msgid "" "The nova flavor id to use when launching the master node of the cluster. " "Default: m1.small" msgstr "" "id flavor nova untuk digunakan ketika peluncuran node master cluster. " "Default: m1.small" msgid "The number of master nodes for the cluster" msgstr "Jumlah node master untuk cluster" msgid "The number of worker nodes for the cluster" msgstr "Jumlah node pekerja untuk cluster" msgid "The selected Cluster Template does not support multiple master nodes." msgstr "Cluster Template yang dipilih tidak mendukung banyak node master." msgid "The size in GB for Docker Volume. Default: 25" msgstr "Ukuran dalam GB untuk Docker Volume. Default: 25" msgid "This should really be named fixed-network-cidr. Default: 10.0.0.0/24" msgstr "" "Ini harus benar-benar diberi nama fixed-network-cidr. Default: 10.0.0.0/24" msgid "UPDATE COMPLETE" msgstr "UPDATE COMPLETE (pembaharuan lengkap)" msgid "UPDATE FAILED" msgstr "UPDATE FAILED (pembaharuan gagal)" msgid "UPDATE IN PROGRESS" msgstr "UPDATE IN PROGRESS (pembaharuan sedang berjalan)" msgid "Unable to create cluster template." msgstr "Tidak dapat membuat template klaster." msgid "Unable to create cluster." msgstr "Tidak dapat membuat klaster." msgid "Unable to create quota." msgstr "Tidak dapat membuat kuota." #, python-format msgid "Unable to delete cluster template: %s." msgid_plural "Unable to delete cluster templates: %s." msgstr[0] "Unable to delete cluster template: %s." #, python-format msgid "Unable to delete cluster: %s." msgid_plural "Unable to delete clusters: %s." msgstr[0] "Unable to delete cluster: %s." #, python-format msgid "Unable to delete quota: %s." msgid_plural "Unable to delete quotas: %s." msgstr[0] "Unable to delete quota: %s." #, python-format msgid "Unable to delete the cluster template with id: %(id)s" msgstr "Tidak dapat menghapus template klaster dengan id: %(id)s" msgid "Unable to delete the cluster templates." msgstr "Tidak dapat menghapus template klaster." #, python-format msgid "Unable to delete the cluster with id: %(id)s" msgstr "Tidak dapat menghapus klaster dengan id: %(id)s" msgid "Unable to delete the clusters." msgstr "Tidak dapat menghapus klaster." #, python-format msgid "" "Unable to delete the quota with project id: %(projectId)s and resource: " "%(resource)s." msgstr "" "Tidak dapat menghapus kuota dengan project id: %(projectId)s dan resource: " "%(resource)s." msgid "Unable to get cluster's working nodes." msgstr "Tidak bisa mendapatkan node kerja cluster." msgid "Unable to perform rolling upgrade." msgstr "Tidak dapat melakukan peningkatan versi bergulir (rolling upgrade)." msgid "Unable to process `Additional Labels`. Not all labels will be applied." msgstr "" "Tidak dapat memproses `Additional Labels`. Tidak semua label akan " "diterapkan." #, python-format msgid "Unable to resize given cluster id: %(id)s." msgstr "Tidak dapat mengubah ukuran id cluster yang diberikan: %(id)s." msgid "Unable to retrieve available add-ons." msgstr "Tidak dapat mengambil pengaya (add-ons) yang tersedia." msgid "Unable to retrieve available ingress controllers." msgstr "Tidak dapat mengambil pengontrol masuk yang tersedia." msgid "Unable to retrieve the certificate." msgstr "Tidak dapat mengambil sertifikat." msgid "Unable to retrieve the cluster template." msgstr "Tidak dapat mengambil template klaster" msgid "Unable to retrieve the cluster templates." msgstr "Tidak dapat mengambil template klaster" msgid "Unable to retrieve the cluster." msgstr "Tidak dapat mengambil klaster." msgid "Unable to retrieve the clusters." msgstr "Tidak dapat mengambil klaster." msgid "Unable to retrieve the networks." msgstr "Tidak dapat mengambil jaringan." msgid "Unable to retrieve the quota." msgstr "Tidak dapat mengambil kuota." msgid "Unable to retrieve the quotas." msgstr "Tidak dapat mengambil kuota." msgid "Unable to retrieve the stats." msgstr "Tidak dapat mengambil statistik" msgid "Unable to rotate the certificate." msgstr "Tidak dapat memutar sertifikat" msgid "Unable to sign certificate." msgstr "Tidak dapat menandatangani sertifikat." msgid "Unable to update cluster template." msgstr "Tidak dapat memperbarui template klaster" msgid "Unable to update cluster." msgstr "Tidak dapat memperbarui klaster." msgid "Unable to update quota." msgstr "Tidak dapat memperbarui kuota." msgid "Update Cluster Template" msgstr "Perbaharui template klaster" msgid "Update Quota" msgstr "Update Quota" msgid "Updated" msgstr "Updated (diperbaharui)" msgid "Updated At" msgstr "Updated At" msgid "Use an Existing Network" msgstr "Use an Existing Network" msgid "Used {$ ctrl.stats.clusters $} of {$ ctrl.quota.clusters $}" msgstr "Used {$ ctrl.stats.clusters $} dari {$ ctrl.quota.clusters $}" msgid "Volume Driver" msgstr "Volume Driver (driver volume)" msgid "Worker Nodes" msgstr "Worker Nodes" #, python-format msgid "You are not allowed to delete cluster templates: %s" msgstr "Anda tidak diizinkan untuk menghapus klaster template: %s" #, python-format msgid "You are not allowed to delete clusters: %s" msgstr "Anda tidak diizinkan untuk menghapus cluster: %s" #, python-format msgid "You are not allowed to delete quotas: %s" msgstr "Anda tidak diizinkan untuk menghapus kuota: %s" msgid "You cannot auto-scale to less than a single Worker Node." msgstr "Anda tidak dapat skala otomatis hingga kurang dari satu Worker Node." msgid "You cannot resize to less than a single Worker Node." msgstr "Anda tidak dapat mengubah ukuran menjadi kurang dari satu Worker Node." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted clusters " "are not recoverable." msgstr[0] "" "You have selected \"%s\". Please confirm your selection. Deleted cluster is " "not recoverable." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "template is not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "templates are not recoverable." msgstr[0] "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "template is not recoverable." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted quota is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted quotas are " "not recoverable." msgstr[0] "" "You have selected \"%s\". Please confirm your selection. Deleted quota is " "not recoverable." msgid "" "You may only select as many nodes as you are reducing the original node " "count by." msgstr "" "Anda hanya dapat memilih sebanyak mungkin node yang Anda kurangi dari jumlah " "node semula." msgid "as follows:" msgstr "sebagai berikut:" msgid "error" msgid_plural "errors" msgstr[0] "kesalahan" msgid "key=value,key2=value2..." msgstr "key=value,key2=value2..." msgid "message" msgid_plural "messages" msgstr[0] "pesan" msgid "submit" msgid_plural "submits" msgstr[0] "serahkan" msgid "success" msgid_plural "successes" msgstr[0] "berhasil" msgid "title" msgid_plural "titles" msgstr[0] "judul" msgid "{$ ctrl.cluster.create_timeout $} minute" msgid_plural "{$ ctrl.cluster.create_timeout $} minutes" msgstr[0] "{$ ctrl.cluster.create_timeout $} minute" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9562724 magnum-ui-6.0.1/magnum_ui/locale/ja/0000775000175000017500000000000000000000000017252 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9762714 magnum-ui-6.0.1/magnum_ui/locale/ja/LC_MESSAGES/0000775000175000017500000000000000000000000021037 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/ja/LC_MESSAGES/django.po0000664000175000017500000000210300000000000022635 0ustar00zuulzuul00000000000000# Shu Muto , 2016. #zanata # Shu Muto , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-05-16 02:29+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-05-29 08:35+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 "Cluster Templates" msgstr "クラスターテンプレート" msgid "Clusters" msgstr "クラスター" msgid "Container Infra" msgstr "コンテナーインフラ" msgid "Container Infra - Cluster Templates" msgstr "コンテナーインフラ - クラスターテンプレート" msgid "Container Infra - Clusters" msgstr "コンテナーインフラ - クラスター" msgid "Container Infra - Quotas" msgstr "コンテナーインフラ - クォータ" msgid "Quotas" msgstr "クォータ" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/ja/LC_MESSAGES/djangojs.po0000664000175000017500000004652200000000000023207 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata # Shu Muto , 2016. #zanata # Shu Muto , 2017. #zanata # Shu Muto , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2020-04-02 03:39+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-11-14 07:53+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 "ADOPT COMPLETE" msgstr "導入完了" msgid "API Address" msgstr "API アドレス" msgid "API Server Port" msgstr "API サーバーのポート" msgid "An arbitrary human-readable name" msgstr "人間が読むことができる任意の名前。" msgid "" "Arbitrary labels in the form of key=value pairs to associate with a cluster " "templates. May be used multiple times." msgstr "" "クラスターテンプレートには、「key=value」形式で任意のラベルを関連付けできま" "す。複数個指定できます。" msgid "CHECK COMPLETE" msgstr "チェック完了" msgid "COE" msgstr "COE" msgid "COE Version" msgstr "COE バージョン" msgid "CREATE COMPLETE" msgstr "作成完了" msgid "CREATE FAILED" msgstr "作成に失敗" msgid "CREATE IN PROGRESS" msgstr "作成中" msgid "CSR" msgstr "CSR" msgid "Calico" msgstr "Calico" msgid "Cancel" msgstr "取り消し" #, python-format msgid "Certificate %s was successfully rotated." msgstr "証明書 %s が正常に更新されました。" #, python-format msgid "Certificate %s was successfully signed." msgstr "証明書 %s が正常に署名されました。" msgid "Choose a Cluster Template" msgstr "クラスターテンプレートを選択してください。" msgid "Choose a Container Orchestration Engine" msgstr "コンテナーオーケストレーションエンジンを選択してください" msgid "Choose a External Network" msgstr "外部ネットワークを選択してください" msgid "Choose a Flavor for the Master Node" msgstr "マスターノードのフレーバーを選択してください" msgid "Choose a Flavor for the Node" msgstr "ノードのフレーバーを選択してください" msgid "Choose a Keypair" msgstr "キーペアを選択してください" msgid "Choose a Network Driver" msgstr "ネットワークドライバーを選択してください" msgid "Choose a Private Network" msgstr "プライベートネットワークを選択してください" msgid "Choose a Private Network at first" msgstr "最初にプライベートネットワークを選択してください" msgid "Choose a Private Subnet" msgstr "プライベートサブネットを選択してください" msgid "Choose a Project" msgstr "プロジェクトを選択してください。" msgid "Choose a Volume Driver" msgstr "ボリュームドライバーを選択してください" msgid "Choose an Image" msgstr "イメージを選択してください" msgid "Cinder" msgstr "Cinder" msgid "Cluster" msgstr "クラスター" #, python-format msgid "Cluster %s was successfully created." msgstr "クラスター %s が正常に作成されました。" msgid "Cluster Create Timeout" msgstr "クラスター作成のタイムアウト" msgid "Cluster Distro" msgstr "クラスターのディストリビューション" msgid "Cluster Name" msgstr "クラスター名" msgid "Cluster Template" msgstr "クラスターテンプレート" msgid "Cluster Template Detail" msgstr "クラスターテンプレートの詳細" msgid "Cluster Template Name" msgstr "クラスターテンプレート名" msgid "Cluster Templates" msgstr "クラスターテンプレート" msgid "Cluster Type" msgstr "クラスター種別" #, python-format msgid "Cluster template %s was successfully created." msgstr "クラスターテンプレート %s が正常に作成されました。" #, python-format msgid "Cluster template %s was successfully updated." msgstr "クラスターテンプレート %s が正常に更新されました。" msgid "Clusters" msgstr "クラスター" msgid "Confirm Delete Cluster" msgid_plural "Confirm Delete Clusters" msgstr[0] "クラスターの削除の確認" msgid "Confirm Delete Cluster Template" msgid_plural "Confirm Delete Cluster Templates" msgstr[0] "クラスターテンプレートの削除の確認" msgid "Confirm Delete Quota" msgid_plural "Confirm Delete Quotas" msgstr[0] "クォータの削除の確認" msgid "Container Orchestration Engine" msgstr "コンテナーオーケストレーションエンジン" msgid "Container Version" msgstr "コンテナーバージョン" msgid "Create" msgstr "作成" msgid "Create Cluster" msgstr "クラスターの作成" msgid "Create Cluster Template" msgstr "クラスターテンプレートの作成" msgid "Create Quota" msgstr "クォータの作成" msgid "Created" msgstr "作成時刻" msgid "Created At" msgstr "作成時刻" msgid "DC/OS" msgstr "DC/OS" msgid "DELETE COMPLETE" msgstr "削除完了" msgid "DELETE FAILED" msgstr "削除に失敗" msgid "DELETE IN PROGRESS" msgstr "削除中" msgid "DNS" msgstr "DNS" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "クラスターの削除" msgid "Delete Cluster Template" msgid_plural "Delete Cluster Templates" msgstr[0] "クラスターテンプレートの削除" msgid "Delete Cluster Templates" msgstr "クラスターテンプレートの削除" msgid "Delete Clusters" msgstr "クラスターの削除" msgid "Delete Quota" msgid_plural "Delete Quotas" msgstr[0] "クォータの削除" msgid "Delete Quotas" msgstr "クォータの削除" #, python-format msgid "Deleted cluster template: %s." msgid_plural "Deleted cluster templates: %s." msgstr[0] "クラスターテンプレート %s を削除しました。" #, python-format msgid "Deleted cluster: %s." msgid_plural "Deleted clusters: %s." msgstr[0] "クラスター %s を削除しました。" #, python-format msgid "Deleted quota: %s." msgid_plural "Deleted quotas: %s." msgstr[0] "クォータ %s を削除しました。" msgid "Device Mapper" msgstr "Device Mapper" msgid "Disable TLS" msgstr "TLS の無効化" msgid "Disable TLS in the cluster template. Default: False" msgstr "" "このクラスターテンプレートにおいて、 TLS を無効にします。デフォルト: False" msgid "Discovery URL" msgstr "探索 URL" msgid "Docker" msgstr "Docker" msgid "Docker Storage Driver" msgstr "Docker のストレージドライバー" msgid "Docker Swarm" msgstr "Docker Swarm" msgid "Docker Swarm Mode" msgstr "Docker Swarm モード" msgid "Docker Volume Size" msgstr "Docker のボリューム容量" msgid "Docker Volume Size (GB)" msgstr "Docker のボリューム容量 (GB)" msgid "Enable Registry" msgstr "レジストリーの有効化" msgid "Enable docker registry in the cluster temlate. Default: False" msgstr "" "このクラスターテンプレートにおいて、 Docker のレジストリーを有効にします。デ" "フォルト: False" msgid "Exists" msgstr "使用" msgid "External Network ID" msgstr "外部ネットワーク ID" msgid "Fixed Network" msgstr "固定ネットワーク" msgid "Fixed Subnet" msgstr "固定サブネット" msgid "Flannel" msgstr "Flannel" msgid "Flavor" msgstr "フレーバー" msgid "Flavor ID" msgstr "フレーバー ID" msgid "Floating IP" msgstr "Floating IP" msgid "Floating IP Enabled" msgstr "Floating IP の有効化" msgid "HTTP Proxy" msgstr "HTTP プロキシー" msgid "HTTPS Proxy" msgstr "HTTPS プロキシー" msgid "Hard Limit" msgstr "上限値" msgid "ID" msgstr "ID" msgid "Image" msgstr "イメージ" msgid "Image ID" msgstr "イメージ ID" msgid "" "Indicates whether created clusters should have a floating ip or not. " "Default: True" msgstr "" "作成されるクラスターが Floating IP を持つかどうかを示します。デフォルト: True" msgid "" "Indicates whether created clusters should have a load balancer for master " "nodes or not. Default: False" msgstr "" "作成されるクラスターがマスターノード用のロードバランサーを持つかどうかを示し" "ます。デフォルト: False" msgid "Infinite" msgstr "無制限" msgid "Info" msgstr "情報" msgid "Insecure Registry" msgstr "セキュアーではないレジストリー" msgid "KEY1=VALUE1, KEY2=VALUE2..." msgstr "KEY1=VALUE1, KEY2=VALUE2..." msgid "Keypair" msgstr "キーペア" msgid "Kubernetes" msgstr "Kubernetes" msgid "Labels" msgstr "ラベル" msgid "Limit for this resource." msgstr "このリソースの上限" msgid "Make cluster template public. Default: False" msgstr "クラスターテンプレートをパブリックに設定します。デフォルト: False" msgid "Margin" msgstr "空き" msgid "Master Addresses" msgstr "マスターのアドレス" msgid "Master Count" msgstr "マスターの数" msgid "Master Flavor" msgstr "マスターノードのフレーバー" msgid "Master Flavor ID" msgstr "マスターノードのフレーバー ID" msgid "Master LB" msgstr "マスターノード LB" msgid "Master LB Enabled" msgstr "マスターノード LB の有効化" msgid "Mesos" msgstr "Mesos" msgid "Miscellaneous" msgstr "その他" msgid "Name" msgstr "名前" msgid "Name of the cluster template." msgstr "クラスターテンプレートの名前。" msgid "Network" msgstr "ネットワーク" msgid "Network Driver" msgstr "ネットワークドライバー" msgid "No Proxy" msgstr "プロキシーの例外" msgid "Node Addresses" msgstr "ノードのアドレス" msgid "Node Count" msgstr "ノードの数" msgid "Node Flavor ID" msgstr "ノードフレーバー ID" msgid "Node Spec" msgstr "ノードのスペック" msgid "Nodes" msgstr "ノード" msgid "None" msgstr "なし" msgid "Overlay" msgstr "Overlay" msgid "Overview" msgstr "概要" msgid "Project" msgstr "プロジェクト" msgid "Project ID" msgstr "プロジェクト ID" msgid "Public" msgstr "パブリック" msgid "Quota" msgstr "クォータ" #, python-format msgid "Quota %s was successfully created." msgstr "クォータ %s を作成しました。" #, python-format msgid "Quota %s/%s was successfully updated." msgstr "クォータ %s/%s が正常に更新されました。" msgid "Quotas" msgstr "クォータ" msgid "RESTORE COMPLETE" msgstr "リストア完了" msgid "RESUME COMPLETE" msgstr "再開完了" msgid "ROLLBACK COMPLETE" msgstr "ロールバック完了" msgid "Record Properties" msgstr "レコードのプロパティー" msgid "Registry Enabled" msgstr "レジストリーの有効化" msgid "Resource" msgstr "リソース" msgid "Rexray" msgstr "Rexray" msgid "Rotate Certificate" msgstr "証明書の更新" msgid "SNAPSHOT COMPLETE" msgstr "スナップショット作成完了" msgid "Server Type" msgstr "サーバー種別" msgid "Show Certificate" msgstr "証明書の表示" msgid "Sign Certificate" msgstr "証明書を署名する" msgid "Sign Certificate To Cluster: {$ ctrl.model.cluster_name $}" msgstr "証明書をクラスターに署名します: {$ ctrl.model.cluster_name $}" msgid "Size" msgstr "サイズ" msgid "Specify the Container Orchestration Engine to use." msgstr "使用するコンテナーオーケストレーションエンジンを指定してください。" msgid "" "Specify the nameserver to use for the cluster template. Default: 8.8.8.8" msgstr "クラスターテンプレートで使用するネームサーバーを指定してください。" msgid "Specify the size in GB for the docker volume" msgstr "Docker のボリュームのサイズを GB 単位で指定してください" msgid "Stack" msgstr "スタック" msgid "Stack Faults" msgstr "スタックの失敗" msgid "Stack ID" msgstr "スタック ID" msgid "Stats" msgstr "統計情報" msgid "Status" msgstr "ステータス" msgid "Status Reason" msgstr "ステータスの理由" msgid "TLS Disabled" msgstr "TLS の無効化" msgid "The DNS nameserver to use for this cluster template" msgstr "このクラスターテンプレートで使用する DNS ネームサーバー。" msgid "The URL of docker registry." msgstr "Docker レジストリーの URL" msgid "The cluster node count." msgstr "クラスターノードの数" msgid "The http_proxy address to use for nodes in cluster" msgstr "クラスターのノードに使用する http_proxy アドレス。" msgid "The https_proxy address to use for nodes in cluster" msgstr "クラスターのノードに使用する https_proxy アドレス。" msgid "The name or UUID of the SSH keypair to load into the cluster nodes." msgstr "このクラスターのノードにロードする SSH キーペアの名前または UUID。" msgid "The name or UUID of the base image to customize for the cluster." msgstr "" "このクラスターテンプレートで、カスタマイズのベースとなるイメージの名前または " "UUID。" msgid "The no_proxy address to use for nodes in cluster" msgstr "クラスターのノードで使用するプロキシー例外のアドレス。" msgid "The nova flavor id to use when launching the cluster. Default: m1.small" msgstr "" "クラスターを起動するときに使用する Nova のフレーバー ID。デフォルト: m1.small" msgid "" "The nova flavor id to use when launching the master node of the cluster. " "Default: m1.small" msgstr "" "クラスターのマスターノードを起動するときに使用する Nova のフレーバー ID。デ" "フォルト: m1.small" msgid "The size in GB for Docker Volume. Default: 25" msgstr "Docker のボリュームの GB 単位のサイズ。デフォルト: 25" msgid "This should really be named fixed-network-cidr. Default: 10.0.0.0/24" msgstr "" "固定ネットワークの CIDR を指定する必要があります。デフォルト: 10.0.0.0/24" msgid "UPDATE COMPLETE" msgstr "更新完了" msgid "UPDATE FAILED" msgstr "更新に失敗" msgid "UPDATE IN PROGRESS" msgstr "更新中" msgid "Unable to create cluster template." msgstr "クラスターテンプレートを作成できません。" msgid "Unable to create cluster." msgstr "クラスターを作成できません" msgid "Unable to create quota." msgstr "クォータを作成できません。" #, python-format msgid "Unable to delete cluster template: %s." msgid_plural "Unable to delete cluster templates: %s." msgstr[0] "クラスターテンプレートを削除できません: %s" #, python-format msgid "Unable to delete cluster: %s." msgid_plural "Unable to delete clusters: %s." msgstr[0] "クラスターを削除できません: %s" #, python-format msgid "Unable to delete quota: %s." msgid_plural "Unable to delete quotas: %s." msgstr[0] "クォータを削除できません: %s" #, python-format msgid "Unable to delete the cluster template with id: %(id)s" msgstr "ID %(id)s のクラスターテンプレートを削除できません。" msgid "Unable to delete the cluster templates." msgstr "クラスターテンプレートを削除できません。" #, python-format msgid "Unable to delete the cluster with id: %(id)s" msgstr "ID %(id)s のクラスターを削除できません。" msgid "Unable to delete the clusters." msgstr "クラスターを削除できません。" #, python-format msgid "" "Unable to delete the quota with project id: %(projectId)s and resource: " "%(resource)s." msgstr "" "次のプロジェクト ID のクォータを削除できません: %(projectId)s and resource: " "%(resource)s." msgid "Unable to retrieve the certificate." msgstr "証明書を取得できません。" msgid "Unable to retrieve the cluster template." msgstr "クラスターテンプレートを取得できません。" msgid "Unable to retrieve the cluster templates." msgstr "クラスターテンプレートを取得できません。" msgid "Unable to retrieve the cluster." msgstr "クラスターを取得できません。" msgid "Unable to retrieve the clusters." msgstr "クラスターの一覧を取得できません" msgid "Unable to retrieve the networks." msgstr "ネットワーク一覧を取得できません。" msgid "Unable to retrieve the quota." msgstr "クォータを取得できません。" msgid "Unable to retrieve the quotas." msgstr "クォータの一覧を取得できません。" msgid "Unable to retrieve the stats." msgstr "統計を取得できません。" msgid "Unable to rotate the certificate." msgstr "証明書を更新できません。" msgid "Unable to sign certificate." msgstr "証明書で署名できません。" msgid "Unable to update cluster template." msgstr "クラスターテンプレートを更新できません。" msgid "Unable to update cluster." msgstr "クラスターを更新できません。" msgid "Unable to update quota." msgstr "クォータを更新できません。" msgid "Update Cluster Template" msgstr "クラスターテンプレートの更新" msgid "Update Quota" msgstr "クォータの更新" msgid "Updated" msgstr "更新時刻" msgid "Updated At" msgstr "最終更新" msgid "Used {$ ctrl.stats.clusters $} of {$ ctrl.quota.clusters $}" msgstr "{$ ctrl.quota.clusters $} 中 {$ ctrl.stats.clusters $} 使用" msgid "Volume Driver" msgstr "ボリュームドライバー" #, python-format msgid "You are not allowed to delete cluster templates: %s" msgstr "クラスターテンプレートの削除は許可されていません: %s" #, python-format msgid "You are not allowed to delete clusters: %s" msgstr "クラスターの削除は許可されていません: %s" #, python-format msgid "You are not allowed to delete quotas: %s" msgstr "クォータの削除は許可されていません: %s" #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted clusters " "are not recoverable." msgstr[0] "" "\"%s\" を選択しました。選択内容を確認してください。削除されたクラスターは元に" "戻せません。" #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "template is not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "templates are not recoverable." msgstr[0] "" "\"%s\" を選択しました。選択内容を確認してください。削除されたクラスターテンプ" "レートは元に戻せません。" #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted quota is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted quotas are " "not recoverable." msgstr[0] "" "\"%s\" を選択しました。選択内容を確認してください。削除されたクォータは元に戻" "せません。" msgid "as follows:" msgstr "以下の通り:" msgid "error" msgid_plural "errors" msgstr[0] "エラー" msgid "message" msgid_plural "messages" msgstr[0] "メッセージ" msgid "submit" msgid_plural "submits" msgstr[0] "送信" msgid "success" msgid_plural "successes" msgstr[0] "成功" msgid "title" msgid_plural "titles" msgstr[0] "タイトル" msgid "{$ ctrl.cluster.create_timeout $} minute" msgid_plural "{$ ctrl.cluster.create_timeout $} minutes" msgstr[0] "{$ ctrl.cluster.create_timeout $} 分" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9562724 magnum-ui-6.0.1/magnum_ui/locale/ko_KR/0000775000175000017500000000000000000000000017665 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9762714 magnum-ui-6.0.1/magnum_ui/locale/ko_KR/LC_MESSAGES/0000775000175000017500000000000000000000000021452 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/ko_KR/LC_MESSAGES/django.po0000664000175000017500000000205100000000000023252 0ustar00zuulzuul00000000000000# Sungjin Kang , 2017. #zanata # ByungYeol Woo , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-04-25 10:07+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 10:36+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 "Cluster Templates" msgstr "클러스터 템플릿" msgid "Clusters" msgstr "클러스터" msgid "Container Infra" msgstr "컨테이너 인프라" msgid "Container Infra - Cluster Templates" msgstr "컨테이너 인프라 - 클러스터 템플릿" msgid "Container Infra - Clusters" msgstr "컨테이너 인프라 - 클러스터" msgid "Container Infra - Quotas" msgstr "컨테이너 인프라 - 할당량" msgid "Quotas" msgstr "할당량" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/ko_KR/LC_MESSAGES/djangojs.po0000664000175000017500000004400300000000000023612 0ustar00zuulzuul00000000000000# Sungjin Kang , 2016. #zanata # ByungYeol Woo , 2017. #zanata # Sungjin Kang , 2017. #zanata # ByungYeol Woo , 2018. #zanata # Ian Y. Choi , 2018. #zanata # Jaewook Oh , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2020-04-02 03:39+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-10-11 10:43+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 "ADOPT COMPLETE" msgstr "ADOPT COMPLETE" msgid "API Address" msgstr "API 주소" msgid "API Server Port" msgstr "API 서버 포트" msgid "An arbitrary human-readable name" msgstr "사람이 읽을 수 있는 임의의 이름" msgid "" "Arbitrary labels in the form of key=value pairs to associate with a cluster " "templates. May be used multiple times." msgstr "" "클러스터 템플릿과 연관시킬 키=값 쌍 형식의 임의 레이블입니다. 여러 번 사용할 " "수 있습니다." msgid "CHECK COMPLETE" msgstr "CHECK COMPLETE" msgid "COE" msgstr "COE" msgid "COE Version" msgstr "COE 버전" msgid "CREATE COMPLETE" msgstr "CREATE COMPLETE" msgid "CREATE FAILED" msgstr "CREATE FAILED" msgid "CREATE IN PROGRESS" msgstr "CREATE IN PROGRESS" msgid "CSR" msgstr "CSR" msgid "Calico" msgstr "Calico" msgid "Cancel" msgstr "취소" #, python-format msgid "Certificate %s was successfully rotated." msgstr "인증서 %s를 성공적으로 교체하였습니다." #, python-format msgid "Certificate %s was successfully signed." msgstr "클러스터 %s 를 성공적으로 서명하였습니다." msgid "Choose a Cluster Template" msgstr "클러스터 템플릿 선택" msgid "Choose a Container Orchestration Engine" msgstr "컨테이너 오케스트레이션 엔진 선택" msgid "Choose a External Network" msgstr "외부 네트워크 선택" msgid "Choose a Flavor for the Master Node" msgstr "마스터 노드에 대한 Flavor 선택" msgid "Choose a Flavor for the Node" msgstr "노드에 대한 Flavor 선택" msgid "Choose a Keypair" msgstr "키 페어 선택" msgid "Choose a Network Driver" msgstr "네트워크 드라이버 선택" msgid "Choose a Private Network" msgstr "Private 네트워크 선택" msgid "Choose a Private Network at first" msgstr "첫 Private 네트워크 선택" msgid "Choose a Private Subnet" msgstr "Private 서브넷 선택" msgid "Choose a Project" msgstr "프로젝트 선택" msgid "Choose a Volume Driver" msgstr "볼륨 드라이버 선택" msgid "Choose an Image" msgstr "이미지 선택" msgid "Cinder" msgstr "Cinder" msgid "Cluster" msgstr "클러스터" #, python-format msgid "Cluster %s was successfully created." msgstr "클러스터 %s 를 성공적으로 생성하였습니다." msgid "Cluster Create Timeout" msgstr "클러스터 생성 타임아웃" msgid "Cluster Distro" msgstr "클러스터 Distro" msgid "Cluster Name" msgstr "클러스터 이름" msgid "Cluster Template" msgstr "클러스터 템플릿" msgid "Cluster Template Detail" msgstr "클러스터 템플릿 세부사항" msgid "Cluster Template Name" msgstr "클러스터 템플릿 이름" msgid "Cluster Templates" msgstr "클러스터 템플릿" msgid "Cluster Type" msgstr "클러스터 유형" #, python-format msgid "Cluster template %s was successfully created." msgstr "클러스터 템플릿 %s 를 성공적으로 생성하였습니다." #, python-format msgid "Cluster template %s was successfully updated." msgstr "클러스터 템플릿 %s 가 성공적으로 업데이트 되었습니다." msgid "Clusters" msgstr "클러스터" msgid "Confirm Delete Cluster" msgid_plural "Confirm Delete Clusters" msgstr[0] "클러스터 삭제 확인" msgid "Confirm Delete Cluster Template" msgid_plural "Confirm Delete Cluster Templates" msgstr[0] "클러스터 템플릿 삭제 확인" msgid "Confirm Delete Quota" msgid_plural "Confirm Delete Quotas" msgstr[0] "할당량 삭제 확인" msgid "Container Orchestration Engine" msgstr "컨테이너 오케스트레이션 엔진" msgid "Container Version" msgstr "컨테이너 버전" msgid "Create" msgstr "생성" msgid "Create Cluster" msgstr "클러스터 생성" msgid "Create Cluster Template" msgstr "클러스터 템플릿 생성" msgid "Create Quota" msgstr "할당량 생성" msgid "Created" msgstr "생성됨" msgid "Created At" msgstr "생성 시점" msgid "DC/OS" msgstr "DC/OS" msgid "DELETE COMPLETE" msgstr "DELETE COMPLETE" msgid "DELETE FAILED" msgstr "DELETE FAILED" msgid "DELETE IN PROGRESS" msgstr "DELETE IN PROGRESS" msgid "DNS" msgstr "DNS" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "클러스터 삭제" msgid "Delete Cluster Template" msgid_plural "Delete Cluster Templates" msgstr[0] "클러스터 템플릿 삭제" msgid "Delete Cluster Templates" msgstr "클러스터 템플릿 삭제" msgid "Delete Clusters" msgstr "클러스터 삭제" msgid "Delete Quota" msgid_plural "Delete Quotas" msgstr[0] "할당량 삭제" msgid "Delete Quotas" msgstr "할당량 삭제" #, python-format msgid "Deleted cluster template: %s." msgid_plural "Deleted cluster templates: %s." msgstr[0] "클러스터 템플릿 삭제됨: %s." #, python-format msgid "Deleted cluster: %s." msgid_plural "Deleted clusters: %s." msgstr[0] "클러스터 삭제됨: %s." #, python-format msgid "Deleted quota: %s." msgid_plural "Deleted quotas: %s." msgstr[0] "할당량 삭제됨: %s" msgid "Device Mapper" msgstr "장치 Mapper" msgid "Disable TLS" msgstr "TLS 비활성화" msgid "Disable TLS in the cluster template. Default: False" msgstr "클러스터 템플릿에서 TLS를 사용하지 않게 설정하십시오. 기본값: False" msgid "Discovery URL" msgstr "검색 URL" msgid "Docker" msgstr "Docker" msgid "Docker Storage Driver" msgstr "Docker 스토리지 드라이버" msgid "Docker Swarm" msgstr "Docker Swarm" msgid "Docker Swarm Mode" msgstr "Docker Swarm 모드" msgid "Docker Volume Size" msgstr "Docker 볼륨 크기" msgid "Docker Volume Size (GB)" msgstr "Docker 볼륨 크기(GB)" msgid "Enable Registry" msgstr "레지스트리 활성화" msgid "Enable docker registry in the cluster temlate. Default: False" msgstr "클러스터 템플릿 내에서 docker 레지스트리를 활성화합니다. 기본값: False" msgid "Exists" msgstr "Exists" msgid "External Network ID" msgstr "외부 네트워크 ID" msgid "Fixed Network" msgstr "고정 네트워크" msgid "Fixed Subnet" msgstr "Fixed 서브넷" msgid "Flannel" msgstr "Flannel" msgid "Flavor" msgstr "Flavor" msgid "Flavor ID" msgstr "Flavor ID" msgid "Floating IP" msgstr "Floating IP" msgid "Floating IP Enabled" msgstr "Floating IP 활성화됨" msgid "HTTP Proxy" msgstr "HTTP 프록시" msgid "HTTPS Proxy" msgstr "HTTPS 프록시" msgid "Hard Limit" msgstr "최대 한도" msgid "ID" msgstr "ID" msgid "Image" msgstr "이미지" msgid "Image ID" msgstr "이미지 ID" msgid "" "Indicates whether created clusters should have a floating ip or not. " "Default: True" msgstr "" "생성된 클러스터가 floating ip를 가져야 하는지 여부를 가리킵니다. 기본값: " "False" msgid "" "Indicates whether created clusters should have a load balancer for master " "nodes or not. Default: False" msgstr "" "마스터 노드에 대해 생성된 클러스터가 로드 밸런서를 가져야 하는지 여부를 가리" "킵니다. 기본값: False" msgid "Infinite" msgstr "무제한" msgid "Info" msgstr "정보" msgid "Insecure Registry" msgstr "보안에 취약한 레지스트리" msgid "KEY1=VALUE1, KEY2=VALUE2..." msgstr "KEY1=VALUE1, KEY2=VALUE2..." msgid "Keypair" msgstr "키 페어" msgid "Kubernetes" msgstr "Kubernetes" msgid "Labels" msgstr "레이블" msgid "Limit for this resource." msgstr "이 자원에 대한 한계" msgid "Make cluster template public. Default: False" msgstr "클러스터를 공용으로 만듭니다. 기본값: False" msgid "Margin" msgstr "Margin" msgid "Master Addresses" msgstr "마스터 주소" msgid "Master Count" msgstr "마스터 수" msgid "Master Flavor" msgstr "마스터 Flavor" msgid "Master Flavor ID" msgstr "마스터 Flavor ID" msgid "Master LB" msgstr "마스터 LB" msgid "Master LB Enabled" msgstr "마스터 LB 활성화됨" msgid "Mesos" msgstr "Mesos" msgid "Miscellaneous" msgstr "기타" msgid "Name" msgstr "이름" msgid "Name of the cluster template." msgstr "클러스터 템플릿 이름" msgid "Network" msgstr "네트워크" msgid "Network Driver" msgstr "네트워크 드라이버" msgid "No Proxy" msgstr "프록시가 없음" msgid "Node Addresses" msgstr "노드 주소" msgid "Node Count" msgstr "노드 수" msgid "Node Flavor ID" msgstr "노드 Flavor ID" msgid "Node Spec" msgstr "노드 사양" msgid "Nodes" msgstr "노드" msgid "None" msgstr "없음" msgid "Overlay" msgstr "오버레이" msgid "Overview" msgstr "개요" msgid "Project" msgstr "프로젝트" msgid "Project ID" msgstr "프로젝트 ID" msgid "Public" msgstr "공용" msgid "Quota" msgstr "할당량" #, python-format msgid "Quota %s was successfully created." msgstr "할당량 %s이 성공적으로 생성되었습니다." #, python-format msgid "Quota %s/%s was successfully updated." msgstr "할댱량 %s/%s 이 성공적으로 업데이트 되었습니다." msgid "Quotas" msgstr "할당량" msgid "RESTORE COMPLETE" msgstr "RESTORE COMPLETE" msgid "RESUME COMPLETE" msgstr "RESUME COMPLETE" msgid "ROLLBACK COMPLETE" msgstr "ROLLBACK COMPLETE" msgid "Record Properties" msgstr "레코드 속성" msgid "Registry Enabled" msgstr "저장소가 사용됨" msgid "Resource" msgstr "자원" msgid "Rexray" msgstr "Rexray" msgid "Rotate Certificate" msgstr "인증서 교체" msgid "SNAPSHOT COMPLETE" msgstr "SNAPSHOT COMPLETE" msgid "Server Type" msgstr "서버 유형" msgid "Show Certificate" msgstr "인증서 보기" msgid "Sign Certificate" msgstr "인증서 서명" msgid "Sign Certificate To Cluster: {$ ctrl.model.cluster_name $}" msgstr "클러스터: {$ ctrl.model.cluster_name $} 에 인증서 서명" msgid "Size" msgstr "크기" msgid "Specify the Container Orchestration Engine to use." msgstr "사용할 컨테이너 오케스트레이션 엔진을 지정하십시오." msgid "" "Specify the nameserver to use for the cluster template. Default: 8.8.8.8" msgstr "클러스터 템플릿에 사용할 네임서버를 지정하십시오. 기본값: 8.8.8.8" msgid "Specify the size in GB for the docker volume" msgstr "Docker 볼륨에 대한 크기를 GB로 지정합니다" msgid "Stack" msgstr "스택" msgid "Stack Faults" msgstr "스택 장애" msgid "Stack ID" msgstr "스택 ID" msgid "Stats" msgstr "Stats" msgid "Status" msgstr "상태" msgid "Status Reason" msgstr "상태 원인" msgid "TLS Disabled" msgstr "TLS 가 사용되지 않음" msgid "The DNS nameserver to use for this cluster template" msgstr "이 클러스터 템플릿에 사용할 DNS 네임 서버입니다." msgid "The URL of docker registry." msgstr "Docker 레지스트리 URL." msgid "The cluster node count." msgstr "클러스터 노드 수입니다." msgid "The http_proxy address to use for nodes in cluster" msgstr "클러스터 노드에 사용할 http_proxy 주소입니다." msgid "The https_proxy address to use for nodes in cluster" msgstr "클러스터 노드에 사용할 https_proxy 주소입니다." msgid "The name or UUID of the SSH keypair to load into the cluster nodes." msgstr "클러스터 노드에 로드할 SSH 키 쌍의 이름이나 UUID입니다." msgid "The name or UUID of the base image to customize for the cluster." msgstr "클러스터에 맞게 사용자 정의할 기본 이미지의 이름 또는 UUID입니다." msgid "The no_proxy address to use for nodes in cluster" msgstr "클러스터 노드에 사용할 no_proxy 주소입니다." msgid "The nova flavor id to use when launching the cluster. Default: m1.small" msgstr "클러스터를 실행할 때 사용할 nova flavor id입니다. 기본값: m1.small" msgid "" "The nova flavor id to use when launching the master node of the cluster. " "Default: m1.small" msgstr "" "클러스터의 마스터 노드를 실행할 때 사용할 nova flavor입니다. 기본값: m1.small" msgid "The size in GB for Docker Volume. Default: 25" msgstr "Docker 볼륨의 크기(GB)입니다. 기본값: 25" msgid "This should really be named fixed-network-cidr. Default: 10.0.0.0/24" msgstr "" "실제로 fixed-network-cidr로 이름이 지정되어야 합니다. 기본값: 10.0.0.0/24" msgid "UPDATE COMPLETE" msgstr "UPDATE COMPLETE" msgid "UPDATE FAILED" msgstr "UPDATE FAILED" msgid "UPDATE IN PROGRESS" msgstr "UPDATE IN PROGRESS" msgid "Unable to create cluster template." msgstr "클러스터 템플릿을 생성할 수 없습니다." msgid "Unable to create cluster." msgstr "클러스터를 생성할 수 없습니다." msgid "Unable to create quota." msgstr "할당량을 생성할 수 없습니다." #, python-format msgid "Unable to delete cluster template: %s." msgid_plural "Unable to delete cluster templates: %s." msgstr[0] "클러스터 템플릿을 삭제할 수 없습니다: %s." #, python-format msgid "Unable to delete cluster: %s." msgid_plural "Unable to delete clusters: %s." msgstr[0] "클러스터를 삭제할 수 없습니다: %s." #, python-format msgid "Unable to delete quota: %s." msgid_plural "Unable to delete quotas: %s." msgstr[0] "할당량을 삭제할 수 없습니다: %s" #, python-format msgid "Unable to delete the cluster template with id: %(id)s" msgstr "클러스터 템플릿 ID 을 삭제할 수 없습니다: %(id)s" msgid "Unable to delete the cluster templates." msgstr "클러스터 템플릿을 삭제할 수 없습니다." #, python-format msgid "Unable to delete the cluster with id: %(id)s" msgstr "ID가 %(id)s인 클러스터를 삭제할 수 없습니다." msgid "Unable to delete the clusters." msgstr "클러스터를 삭제할 수 없습니다." #, python-format msgid "" "Unable to delete the quota with project id: %(projectId)s and resource: " "%(resource)s." msgstr "" "프로젝트 ID: %(projectId)s 및 자원: %(resource)s 에 대한 할당량을 삭제할 수 " "없습니다." msgid "Unable to retrieve the certificate." msgstr "인증서를 가져올 수 없습니다." msgid "Unable to retrieve the cluster template." msgstr "클러스터 템플릿을 가져올 수 없습니다." msgid "Unable to retrieve the cluster templates." msgstr "클러스터 템플릿을 가져올 수 없습니다." msgid "Unable to retrieve the cluster." msgstr "클러스터를 가져올 수 없습니다." msgid "Unable to retrieve the clusters." msgstr "클러스터를 가져올 수 없습니다." msgid "Unable to retrieve the networks." msgstr "네트워크를 검색할 수 없습니다." msgid "Unable to retrieve the quota." msgstr "해당 할당량을 가져올 수 없습니다." msgid "Unable to retrieve the quotas." msgstr "할당량을 가져올 수 없습니다." msgid "Unable to retrieve the stats." msgstr "통계를 검색할 수 없습니다." msgid "Unable to rotate the certificate." msgstr "인증서를 교체할 수 없습니다." msgid "Unable to sign certificate." msgstr "인증서에 서명할 수 없습니다." msgid "Unable to update cluster template." msgstr "클러스터 템플릿을 업데이트 할 수 없습니다." msgid "Unable to update cluster." msgstr "클러스터를 업데이트 할 수 없습니다." msgid "Unable to update quota." msgstr "할당량을 업데이트할 수 없습니다." msgid "Update Cluster Template" msgstr "클러스터 템플릿을 업데이트 합니다." msgid "Update Quota" msgstr "할당량 업데이트" msgid "Updated" msgstr "업데이트됨" msgid "Updated At" msgstr "갱신 시점" msgid "Used {$ ctrl.stats.clusters $} of {$ ctrl.quota.clusters $}" msgstr "{$ ctrl.quota.clusters $} 에서 {$ ctrl.stats.clusters $} 사용함" msgid "Volume Driver" msgstr "볼륨 드라이버" #, python-format msgid "You are not allowed to delete cluster templates: %s" msgstr "클러스터 템플릿 삭제가 허용되어 있지 않습니다: %s" #, python-format msgid "You are not allowed to delete clusters: %s" msgstr "클러스터 삭제가 허용되어 있지 않습니다: %s" #, python-format msgid "You are not allowed to delete quotas: %s" msgstr "할당량 삭제가 허용되지 않았습니다: %s" #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted clusters " "are not recoverable." msgstr[0] "" "\"%s\"을(를) 선택했습니다. 선택을 확인하십시오. 삭제한 클러스터는 복구할 수 " "없습니다." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "template is not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "templates are not recoverable." msgstr[0] "" "\"%s\"을(를) 선택했습니다. 선택을 확인하십시오. 삭제한 클러스터 템플릿은 복구" "할 수 없습니다." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted quota is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted quotas are " "not recoverable." msgstr[0] "" "\"%s\"를 선택했습니다. 선택을 확인하십시오. 삭제된 할당량은 복구할 수 없습니" "다." msgid "as follows:" msgstr "다음과 같이:" msgid "error" msgid_plural "errors" msgstr[0] "에러" msgid "message" msgid_plural "messages" msgstr[0] "메시지" msgid "submit" msgid_plural "submits" msgstr[0] "제출" msgid "success" msgid_plural "successes" msgstr[0] "완료" msgid "title" msgid_plural "titles" msgstr[0] "제목" msgid "{$ ctrl.cluster.create_timeout $} minute" msgid_plural "{$ ctrl.cluster.create_timeout $} minutes" msgstr[0] "{$ ctrl.cluster.create_timeout $} 분" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9562724 magnum-ui-6.0.1/magnum_ui/locale/pt_BR/0000775000175000017500000000000000000000000017666 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9762714 magnum-ui-6.0.1/magnum_ui/locale/pt_BR/LC_MESSAGES/0000775000175000017500000000000000000000000021453 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/pt_BR/LC_MESSAGES/django.po0000664000175000017500000000212700000000000023257 0ustar00zuulzuul00000000000000# Fernando Pimenta , 2017. #zanata # Fernando Pimenta , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-04-20 04:21+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-24 07:21+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 "Cluster Templates" msgstr "Modelos de Cluster" msgid "Clusters" msgstr "Clusters" msgid "Container Infra" msgstr "Infraestrutura de Contêiner" msgid "Container Infra - Cluster Templates" msgstr "Infraestrutura de Contêiner - Modelos de Cluster" msgid "Container Infra - Clusters" msgstr "Infraestrutura de Contêiner - Clusters" msgid "Container Infra - Quotas" msgstr "Infraestrutura de Contêiner - Quotas" msgid "Quotas" msgstr "Quotas" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/pt_BR/LC_MESSAGES/djangojs.po0000664000175000017500000004433300000000000023621 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata # Fernando Pimenta , 2017. #zanata # Ian Y. Choi , 2017. #zanata # Fernando Pimenta , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2020-04-02 03:39+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-24 07:28+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 "ADOPT COMPLETE" msgstr "ADOÇÃO FINALIZADA" msgid "API Address" msgstr "Endereço de API" msgid "API Server Port" msgstr "Porta do Servidor de API" msgid "An arbitrary human-readable name" msgstr "Um nome legível arbitrário" msgid "" "Arbitrary labels in the form of key=value pairs to associate with a cluster " "templates. May be used multiple times." msgstr "" "Etiquetas arbitrárias no formato de pares de chave=valor para associar com " "modelos de cluster. Pode ser utilizado várias vezes." msgid "CHECK COMPLETE" msgstr "VERIFICAÇÃO FINALIZADA" msgid "COE" msgstr "MOC" msgid "COE Version" msgstr "Versão COE" msgid "CREATE COMPLETE" msgstr "CRIAÇÃO FINALIZADA" msgid "CREATE FAILED" msgstr "CRIAÇÃO FALHOU" msgid "CREATE IN PROGRESS" msgstr "CRIAÇÃO EM PROGRESSO" msgid "CSR" msgstr "CSR" msgid "Cancel" msgstr "Cancelar" #, python-format msgid "Certificate %s was successfully rotated." msgstr "Certificado %s foi rotacionado com sucesso." #, python-format msgid "Certificate %s was successfully signed." msgstr "Certificado %s foi assinado com sucesso." msgid "Choose a Cluster Template" msgstr "Escolher Modelo de Cluster" msgid "Choose a Container Orchestration Engine" msgstr "Escolha um mecanismo de orquestração de Container" msgid "Choose a External Network" msgstr "Escolha uma Rede Externa" msgid "Choose a Flavor for the Master Node" msgstr "Escolha um Sabor para o Nó Principal" msgid "Choose a Flavor for the Node" msgstr "Escolha um Sabor para o nó" msgid "Choose a Keypair" msgstr "Escolha um par de chaves" msgid "Choose a Network Driver" msgstr "Escolha um driver de Rede:" msgid "Choose a Private Network" msgstr "Escolha uma Rede Privada" msgid "Choose a Private Network at first" msgstr "Escolha primeiro a Rede Privada" msgid "Choose a Private Subnet" msgstr "Escolha uma Subrede Privada" msgid "Choose a Project" msgstr "Escolher um Projeto" msgid "Choose a Volume Driver" msgstr "Escolha um Driver de Volume" msgid "Choose an Image" msgstr "Escolha uma imagem" msgid "Cinder" msgstr "Cinder" msgid "Cluster" msgstr "Cluster" #, python-format msgid "Cluster %s was successfully created." msgstr "Cluster %s foi criado com sucesso." msgid "Cluster Create Timeout" msgstr "Tempo Limite de Criação de Cluster" msgid "Cluster Distro" msgstr "Distribuição do Cluster" msgid "Cluster Name" msgstr "Nome do Cluster" msgid "Cluster Template" msgstr "Modelo de Cluster" msgid "Cluster Template Detail" msgstr "Detalhe do Modelo de Cluster" msgid "Cluster Template Name" msgstr "Nome do Modelo de Cluster" msgid "Cluster Templates" msgstr "Modelos de Cluster" msgid "Cluster Type" msgstr "Tipo de Cluster" #, python-format msgid "Cluster template %s was successfully created." msgstr "Modelo de cluster %s foi criado com sucesso." #, python-format msgid "Cluster template %s was successfully updated." msgstr "Modelo de cluster %s foi atualizado com sucesso." msgid "Clusters" msgstr "Clusters" msgid "Confirm Delete Cluster" msgid_plural "Confirm Delete Clusters" msgstr[0] "Confirmar Exclusão de Cluster" msgstr[1] "Confirmar Exclusão de Clusters" msgid "Confirm Delete Cluster Template" msgid_plural "Confirm Delete Cluster Templates" msgstr[0] "Confirmar Exclusão de Modelo de Cluster" msgstr[1] "Confirmar Exclusão de Modelos de Cluster" msgid "Confirm Delete Quota" msgid_plural "Confirm Delete Quotas" msgstr[0] "Confirmar Exclusão de Quota" msgstr[1] "Confirmar Exclusão de Quotas" msgid "Container Orchestration Engine" msgstr "Mecanismo de Orquestração de Contêiner" msgid "Container Version" msgstr "Versão do Contêiner" msgid "Create" msgstr "Criar" msgid "Create Cluster" msgstr "Criar Cluster" msgid "Create Cluster Template" msgstr "Criar Modelo de Cluster" msgid "Create Quota" msgstr "Criar Quota" msgid "Created" msgstr "Criado" msgid "Created At" msgstr "Criado Em" msgid "DC/OS" msgstr "DC/OS" msgid "DELETE COMPLETE" msgstr "EXCLUSÃO FINALIZADA" msgid "DELETE FAILED" msgstr "EXCLUSÃO FALHOU" msgid "DELETE IN PROGRESS" msgstr "EXCLUSÃO EM PROGRESSO" msgid "DNS" msgstr "DNS" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Excluir Cluster" msgstr[1] "Excluir Clusters" msgid "Delete Cluster Template" msgid_plural "Delete Cluster Templates" msgstr[0] "Excluir Modelo de Cluster" msgstr[1] "Excluir Modelos de Cluster" msgid "Delete Cluster Templates" msgstr "Excluir Modelos de Cluster" msgid "Delete Clusters" msgstr "Excluir Clusters" msgid "Delete Quota" msgid_plural "Delete Quotas" msgstr[0] "Excluir Quota" msgstr[1] "Excluir Quotas" msgid "Delete Quotas" msgstr "Excluir Quotas" #, python-format msgid "Deleted cluster template: %s." msgid_plural "Deleted cluster templates: %s." msgstr[0] "Modelo de cluster excluído: %s." msgstr[1] "Modelos de cluster excluídos: %s." #, python-format msgid "Deleted cluster: %s." msgid_plural "Deleted clusters: %s." msgstr[0] "Cluster excluído: %s." msgstr[1] "Clusters excluídos: %s." #, python-format msgid "Deleted quota: %s." msgid_plural "Deleted quotas: %s." msgstr[0] "Quota excluída: %s." msgstr[1] "Quotas excluídas: %s." msgid "Device Mapper" msgstr "Mapeador de Dispositivos" msgid "Disable TLS" msgstr "Desativar TLS" msgid "Disable TLS in the cluster template. Default: False" msgstr "Desabilitar TLS no modelo de cluster. Padrão: False" msgid "Discovery URL" msgstr "URL de Descoberta" msgid "Docker" msgstr "Docker" msgid "Docker Storage Driver" msgstr "Driver de Armazenamento Docker" msgid "Docker Swarm" msgstr "Docker Swarm" msgid "Docker Volume Size" msgstr "Tamanho de volume do Docker" msgid "Docker Volume Size (GB)" msgstr "Tamanho de volume do Docker (GB)" msgid "Enable Registry" msgstr "Habilitar Registro" msgid "Enable docker registry in the cluster temlate. Default: False" msgstr "Habilitar registro docker no modelo de cluster. Padrão: False" msgid "Exists" msgstr "Existe" msgid "External Network ID" msgstr "ID da Rede Externa" msgid "Fixed Network" msgstr "Rede Fixa" msgid "Fixed Subnet" msgstr "Subrede Fixa" msgid "Flannel" msgstr "Flannel" msgid "Flavor" msgstr "Flavor" msgid "Flavor ID" msgstr "ID do Flavor" msgid "Floating IP" msgstr "IP Flutuante" msgid "Floating IP Enabled" msgstr "IP Flutuante Ativado" msgid "HTTP Proxy" msgstr "Proxy HTTP" msgid "HTTPS Proxy" msgstr "Proxy HTTPS" msgid "Hard Limit" msgstr "Limite Físico" msgid "ID" msgstr "ID" msgid "Image" msgstr "Imagem" msgid "Image ID" msgstr "ID da Imagem" msgid "" "Indicates whether created clusters should have a floating ip or not. " "Default: True" msgstr "" "Indica se os clusters criados devem ter IP Flutuante ou não. Padrão: True" msgid "" "Indicates whether created clusters should have a load balancer for master " "nodes or not. Default: False" msgstr "" "Indica se os clusters criados devem ter um balanceador de carga para nós " "mestre ou não. Padrão: False" msgid "Infinite" msgstr "Infinito" msgid "Info" msgstr "Informação" msgid "Insecure Registry" msgstr "Registro Inseguro" msgid "KEY1=VALUE1, KEY2=VALUE2..." msgstr "CHAVE1=VALOR1, CHAVE2=VALOR2..." msgid "Keypair" msgstr "Par de chaves" msgid "Kubernetes" msgstr "Kubernetes" msgid "Labels" msgstr "Rótulos" msgid "Limit for this resource." msgstr "Limite para este recurso" msgid "Make cluster template public. Default: False" msgstr "Tornar o modelo de cluster público. Padrão: False" msgid "Margin" msgstr "Margem" msgid "Master Addresses" msgstr "Endereço Principal" msgid "Master Count" msgstr "Contagem Principal" msgid "Master Flavor" msgstr "Flavor Principal" msgid "Master Flavor ID" msgstr "ID do Sabor Principal" msgid "Master LB" msgstr "LB Mestre" msgid "Master LB Enabled" msgstr "LB Mestre Ativado" msgid "Mesos" msgstr "Mesos" msgid "Miscellaneous" msgstr "Diversos" msgid "Name" msgstr "Nome" msgid "Name of the cluster template." msgstr "Nome do modelo de cluster." msgid "Network" msgstr "Rede" msgid "Network Driver" msgstr "Driver de Rede" msgid "No Proxy" msgstr "Sem Proxy" msgid "Node Addresses" msgstr "Endereços dos Nós" msgid "Node Count" msgstr "Contagem de nós" msgid "Node Flavor ID" msgstr "ID de Flavor do Nó" msgid "Node Spec" msgstr "Especificação do Nó" msgid "Nodes" msgstr "Nós" msgid "None" msgstr "Nenhum" msgid "Overlay" msgstr "Overlay" msgid "Overview" msgstr "Visão Geral" msgid "Project" msgstr "Projeto" msgid "Project ID" msgstr "ID do Projeto" msgid "Public" msgstr "Público" msgid "Quota" msgstr "Quota" #, python-format msgid "Quota %s was successfully created." msgstr "A quota %s foi criada com sucesso." #, python-format msgid "Quota %s/%s was successfully updated." msgstr "A quota %s/%s foi atualizada com sucesso." msgid "Quotas" msgstr "Quotas" msgid "RESTORE COMPLETE" msgstr "RESTAURAÇÃO FINALIZADA" msgid "RESUME COMPLETE" msgstr "RETOMADA FINALIZADA" msgid "ROLLBACK COMPLETE" msgstr "ROLLBACK FINALIZADO" msgid "Record Properties" msgstr "Propriedades do Registro" msgid "Registry Enabled" msgstr "Registro Habilitado" msgid "Resource" msgstr "Recurso" msgid "Rexray" msgstr "Rexray" msgid "Rotate Certificate" msgstr "Rotacionar Certificado" msgid "SNAPSHOT COMPLETE" msgstr "SNAPSHOT FINALIZADO" msgid "Server Type" msgstr "Tipo de Servidor" msgid "Show Certificate" msgstr "Mostrar Certificado" msgid "Sign Certificate" msgstr "Assinar Certificado" msgid "Sign Certificate To Cluster: {$ ctrl.model.cluster_name $}" msgstr "Assinar Certificado para o Cluster: {$ ctrl.model.cluster_name $}" msgid "Size" msgstr "Tamanho" msgid "Specify the Container Orchestration Engine to use." msgstr "Especifique o Mecanismo de Orquestração de Container" msgid "" "Specify the nameserver to use for the cluster template. Default: 8.8.8.8" msgstr "" "Especifique o servidor de nomes para usar para o modelo de cluster. Padrão: " "8.8.8.8" msgid "Specify the size in GB for the docker volume" msgstr "Especifique o tamanho em GB que o volume do docker usará." msgid "Stack" msgstr "Pilha" msgid "Stack Faults" msgstr "Falhas de Pilha" msgid "Stack ID" msgstr "ID Pilha" msgid "Stats" msgstr "Estatísticas" msgid "Status" msgstr "Status" msgid "Status Reason" msgstr "Motivo do Estado" msgid "TLS Disabled" msgstr "TLS Desabilitado" msgid "The DNS nameserver to use for this cluster template" msgstr "O nome do servidor DNS a utilizar para este modelo de cluster" msgid "The URL of docker registry." msgstr "A URL de registro docker." msgid "The cluster node count." msgstr "A contagem de nós do cluster." msgid "The http_proxy address to use for nodes in cluster" msgstr "O endereço do proxy_http a utilizar para os nós no cluster" msgid "The https_proxy address to use for nodes in cluster" msgstr "O endereço do proxy_https a utilizar para os nós no cluster" msgid "The name or UUID of the SSH keypair to load into the cluster nodes." msgstr "" "O nome ou UUID do par de chaves SSH para carregar dentro dos nós do cluster." msgid "The name or UUID of the base image to customize for the cluster." msgstr "O nome ou UUID da imagem base para customizar para o cluster." msgid "The no_proxy address to use for nodes in cluster" msgstr "O endereço do no_proxy a utilizar para os nós no cluster" msgid "The nova flavor id to use when launching the cluster. Default: m1.small" msgstr "" "O id do flavor do Nova a utilizar ao lançar o cluster. Padrão: m1.small" msgid "" "The nova flavor id to use when launching the master node of the cluster. " "Default: m1.small" msgstr "" "O id do flavor do Nova a utilizar ao lançar o nó mestre do cluster. Padrão: " "m1.small" msgid "The size in GB for Docker Volume. Default: 25" msgstr "O tamanho em GB para o Volume do Docker. Default: 25" msgid "This should really be named fixed-network-cidr. Default: 10.0.0.0/24" msgstr "Isto deveria ser chamado de fixed-network-cidr. Padrão: 10.0.0.0/24" msgid "UPDATE COMPLETE" msgstr "ATUALIZAÇÃO FINALIZADA" msgid "UPDATE FAILED" msgstr "ATUALIZAÇÃO FALHOU" msgid "UPDATE IN PROGRESS" msgstr "ATUALIZAÇÂO EM PROGRESSO" msgid "Unable to create cluster template." msgstr "Não é possível criar modelo de cluster." msgid "Unable to create cluster." msgstr "Não é possível criar cluster." msgid "Unable to create quota." msgstr "Não é possível criar quota." #, python-format msgid "Unable to delete cluster template: %s." msgid_plural "Unable to delete cluster templates: %s." msgstr[0] "Não é possível excluir modelo de cluster: %s" msgstr[1] "Não é possível excluir modelos de cluster: %s" #, python-format msgid "Unable to delete cluster: %s." msgid_plural "Unable to delete clusters: %s." msgstr[0] "Impossível excluir cluster: %s." msgstr[1] "Impossível excluir clusters: %s." #, python-format msgid "Unable to delete quota: %s." msgid_plural "Unable to delete quotas: %s." msgstr[0] "Não é possível excluir quota: %s." msgstr[1] "Não é possível excluir quotas: %s." #, python-format msgid "Unable to delete the cluster template with id: %(id)s" msgstr "Não é possível excluir o modelo de cluster com id: %(id)s" msgid "Unable to delete the cluster templates." msgstr "Não é possível excluir os modelos de cluster." #, python-format msgid "Unable to delete the cluster with id: %(id)s" msgstr "Não é possível excluir o cluster com id: %(id)s" msgid "Unable to delete the clusters." msgstr "Não é possível excluir os clusters." #, python-format msgid "" "Unable to delete the quota with project id: %(projectId)s and resource: " "%(resource)s." msgstr "" "Não é possível excluir a quota com ID de projeto: %(projectId)s e recurso: " "%(resource)s." msgid "Unable to retrieve the certificate." msgstr "Não é possível recuperar o certificado." msgid "Unable to retrieve the cluster template." msgstr "Não é possível recuperar o modelo de cluster." msgid "Unable to retrieve the cluster templates." msgstr "Não é possível recuperar os modelos do cluster." msgid "Unable to retrieve the cluster." msgstr "Não é possível recuperar cluster." msgid "Unable to retrieve the clusters." msgstr "Não é possível recuperar os clusters." msgid "Unable to retrieve the networks." msgstr "Não é possível recuperar as redes." msgid "Unable to retrieve the quota." msgstr "Não é possível recuperar a quota." msgid "Unable to retrieve the quotas." msgstr "Não é possível recuperar as quotas." msgid "Unable to retrieve the stats." msgstr "Não é possível recuperar as estatísticas." msgid "Unable to rotate the certificate." msgstr "Não é possível rotacionar o certificado." msgid "Unable to sign certificate." msgstr "Não é possível assinar o certificado." msgid "Unable to update cluster template." msgstr "Não é possível atualizar modelo de cluster." msgid "Unable to update cluster." msgstr "Não é possível atualizar cluster." msgid "Unable to update quota." msgstr "Não é possível atualizar quota." msgid "Update Cluster Template" msgstr "Atualizar Modelo de Cluster" msgid "Update Quota" msgstr "Atualizar Quotas" msgid "Updated" msgstr "Atualizado" msgid "Updated At" msgstr "Atualizado Em" msgid "Used {$ ctrl.stats.clusters $} of {$ ctrl.quota.clusters $}" msgstr "Utilizados {$ ctrl.stats.clusters $} de {$ ctrl.quota.clusters $}" msgid "Volume Driver" msgstr "Driver do Volume" #, python-format msgid "You are not allowed to delete cluster templates: %s" msgstr "Você não está autorizado a excluir modelos de cluster: %s" #, python-format msgid "You are not allowed to delete clusters: %s" msgstr "Você não está autorizado a excluir clusters: %s" #, python-format msgid "You are not allowed to delete quotas: %s" msgstr "Você não tem permissão para excluir quotas: %s" #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted clusters " "are not recoverable." msgstr[0] "" "Você selecionou \"%s\". Por favor, confirme sua seleção. Cluster excluído " "não é recuperável." msgstr[1] "" "Você selecionou \"%s\". Por favor, confirme sua seleção. Clusters excluídos " "não são recuperáveis." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "template is not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "templates are not recoverable." msgstr[0] "" "Você selecionou \"%s\". Por favor, confirme sua seleção. Modelo de cluster " "excluído é irrecuperável." msgstr[1] "" "Você selecionou \"%s\". Por favor, confirme sua seleção. Modelos de cluster " "excluídos são irrecuperáveis." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted quota is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted quotas are " "not recoverable." msgstr[0] "" "Você selecionou \"%s\". Por favor, confirme sua seleção. Quota excluída não " "é recuperável." msgstr[1] "" "Você selecionou \"%s\". Por favor, confirme sua seleção. Quotas excluídas " "não são recuperáveis." msgid "as follows:" msgstr "como segue:" msgid "error" msgid_plural "errors" msgstr[0] "erro" msgstr[1] "erros" msgid "message" msgid_plural "messages" msgstr[0] "mensagem" msgstr[1] "mensagens" msgid "submit" msgid_plural "submits" msgstr[0] "envio" msgstr[1] "envios" msgid "success" msgid_plural "successes" msgstr[0] "sucesso" msgstr[1] "sucessos" msgid "title" msgid_plural "titles" msgstr[0] "título" msgstr[1] "títulos" msgid "{$ ctrl.cluster.create_timeout $} minute" msgid_plural "{$ ctrl.cluster.create_timeout $} minutes" msgstr[0] "{$ ctrl.cluster.create_timeout $} minuto" msgstr[1] "{$ ctrl.cluster.create_timeout $} minutos" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9562724 magnum-ui-6.0.1/magnum_ui/locale/ru/0000775000175000017500000000000000000000000017306 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9762714 magnum-ui-6.0.1/magnum_ui/locale/ru/LC_MESSAGES/0000775000175000017500000000000000000000000021073 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/ru/LC_MESSAGES/django.po0000664000175000017500000000243000000000000022674 0ustar00zuulzuul00000000000000# Veronika Stepurova , 2016. #zanata # Dmitriy Rabotyagov , 2020. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-12-29 09:43+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2020-01-09 11:14+0000\n" "Last-Translator: Dmitriy Rabotyagov \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 "Cluster Templates" msgstr "Шаблоны Кластера" msgid "Clusters" msgstr "Кластеры" msgid "Container Infra" msgstr "Контейнерная Инфраструктура" msgid "Container Infra - Cluster Templates" msgstr "Контейнерная Инфраструктура - Шаблоны Кластера" msgid "Container Infra - Clusters" msgstr "Контейнерная Инфраструктура - Кластеры" msgid "Container Infra - Quotas" msgstr "Контейнерная Инфраструктура - Квоты" msgid "Quotas" msgstr "Квоты" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/ru/LC_MESSAGES/djangojs.po0000664000175000017500000006357500000000000023252 0ustar00zuulzuul00000000000000# Aleksey Alekseenko <9118250541@mail.ru>, 2016. #zanata # Alexander , 2016. #zanata # Andreas Jaeger , 2016. #zanata # Veronika Stepurova , 2016. #zanata # Ian Y. Choi , 2017. #zanata # Dmitriy Rabotyagov , 2020. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2020-04-02 03:39+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2020-01-09 11:45+0000\n" "Last-Translator: Dmitriy Rabotyagov \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 "This cluster is already on the latest compatible template" msgstr "Данный кластер уже использует последний совместимый шаблон" msgid "A batch cannot have less than one node." msgstr "Пакет не может иметь менее одной ноды." msgid "ADOPT COMPLETE" msgstr "Принятие завершено" msgid "API Address" msgstr "Адрес API" msgid "API Server Port" msgstr "Серверный порт API" msgid "An arbitrary human-readable name" msgstr "Произвольное человеко-читаемое имя" msgid "" "Arbitrary labels in the form of key=value pairs to associate with a cluster " "templates. May be used multiple times." msgstr "" "Произвольные метки в форме пар ключь=значение связанные с шаблонами " "кластера. Могут быть использованы несколько раз." msgid "CHECK COMPLETE" msgstr "Проверка завершена" msgid "COE" msgstr "COE" msgid "COE Version" msgstr "Версия COE" msgid "CREATE COMPLETE" msgstr "Создание завершено" msgid "CREATE FAILED" msgstr "Создание не удалось" msgid "CREATE IN PROGRESS" msgstr "Выполняется создание" msgid "CSR" msgstr "CSR" msgid "Calico" msgstr "Calico" msgid "Cancel" msgstr "Отмена" #, python-format msgid "Certificate %s was successfully rotated." msgstr "Сертификат %s был успешно обновлен." #, python-format msgid "Certificate %s was successfully signed." msgstr "Сертификат %s успешно подписан." msgid "Choose a Cluster Template" msgstr "Выберите шаблон кластера" msgid "Choose a Cluster Template to upgrade to" msgstr "Выберите шаблон кластера для обновления" msgid "Choose a Container Orchestration Engine" msgstr "Выберите движок оркестрации контейнеров." msgid "Choose a External Network" msgstr "Выберите Внешнюю Сеть" msgid "Choose a Flavor for the Master Node" msgstr "Выберите тип инстанса для мастер узла" msgid "Choose a Flavor for the Node" msgstr "Выберите тип инстанса для узла." msgid "Choose a Keypair" msgstr "Выберите ключевую пару" msgid "Choose a Network Driver" msgstr "Выбрать сетевой драйвер" msgid "Choose a Private Network" msgstr "Выберите Приватную Сеть" msgid "Choose a Private Network at first" msgstr "Сначала выберите Приватную Сеть" msgid "Choose a Private Subnet" msgstr "Выберите Приватную Подсеть" msgid "Choose a Project" msgstr "Выберите проект" msgid "Choose a Volume Driver" msgstr "Выбрать драйвер диска" msgid "Choose an Image" msgstr "Выберите образ" msgid "Choose nodes to remove (Optional)" msgstr "Выберите ноды для удаление (опционально)" msgid "Cinder" msgstr "Cinder" msgid "Cluster" msgstr "Кластер" #, python-format msgid "Cluster %s was successfully created." msgstr "Кластер %s создан успешно." msgid "Cluster Create Timeout" msgstr "Таймаут создания кластера" msgid "Cluster Distro" msgstr "Дистрибутив кластера" msgid "Cluster Name" msgstr "Имя кластера" msgid "Cluster Template" msgstr "Шаблон кластера" msgid "Cluster Template Detail" msgstr "Сведения шаблона кластера" msgid "Cluster Template Name" msgstr "Имя шаблона кластера" msgid "Cluster Templates" msgstr "Шаблоны кластера" msgid "Cluster Type" msgstr "Тип кластера" msgid "Cluster is being resized." msgstr "Кластер в процессе изменения размера." msgid "Cluster is being upgraded to the new Cluster template" msgstr "Кластер был обновлен до нового шаблона" #, python-format msgid "Cluster template %s was successfully created." msgstr "Шаблон кластера %s создан успешно." #, python-format msgid "Cluster template %s was successfully updated." msgstr "Шаблон кластера %s был успешно обновлен." msgid "Clusters" msgstr "Кластеры" msgid "Confirm Delete Cluster" msgid_plural "Confirm Delete Clusters" msgstr[0] "Подтвердите удаление кластера" msgstr[1] "Подтвердите удаление кластеров" msgstr[2] "Подтвердите удаление кластеров" msgid "Confirm Delete Cluster Template" msgid_plural "Confirm Delete Cluster Templates" msgstr[0] "Подтвердите Удаление Шаблона Кластера" msgstr[1] "Подтвердите Удаление Шаблонов Кластера" msgstr[2] "Подтвердите Удаление Шаблонов Кластера" msgid "Confirm Delete Quota" msgid_plural "Confirm Delete Quotas" msgstr[0] "Подтвердите удаление квоты" msgstr[1] "Подтвердите удаление квот" msgstr[2] "Подтвердите удаление квот" msgid "Container Orchestration Engine" msgstr "Движок оркестрации контейнеров" msgid "Container Version" msgstr "Версия Контейнера" msgid "Create" msgstr "Создать" msgid "Create Cluster" msgstr "Создать кластер" msgid "Create Cluster Template" msgstr "Создать шаблон кластера" msgid "Create Quota" msgstr "Создать квоту" msgid "Created" msgstr "Создано" msgid "Created At" msgstr "Создано" msgid "DC/OS" msgstr "DC/OS" msgid "DELETE COMPLETE" msgstr "Удаление завершено" msgid "DELETE FAILED" msgstr "Удаление не удалось" msgid "DELETE IN PROGRESS" msgstr "Выполняется удаление" msgid "DNS" msgstr "DNS" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Удалить кластер" msgstr[1] "Удалить кластеры" msgstr[2] "Удалить кластеры" msgid "Delete Cluster Template" msgid_plural "Delete Cluster Templates" msgstr[0] "Удалить шаблон кластера" msgstr[1] "Удалить шаблоны кластера" msgstr[2] "Удалить шаблоны кластера" msgid "Delete Cluster Templates" msgstr "Удалить шаблоны кластера" msgid "Delete Clusters" msgstr "Удалить кластеры" msgid "Delete Quota" msgid_plural "Delete Quotas" msgstr[0] "Удалить квоту" msgstr[1] "Удалить квоты" msgstr[2] "Удалить квоты" msgid "Delete Quotas" msgstr "Удалить квоты" #, python-format msgid "Deleted cluster template: %s." msgid_plural "Deleted cluster templates: %s." msgstr[0] "Удален шаблон кластера: %s." msgstr[1] "Удалены шаблоны кластера: %s." msgstr[2] "Удалены шаблоны кластера: %s." #, python-format msgid "Deleted cluster: %s." msgid_plural "Deleted clusters: %s." msgstr[0] "Кластер удален: %s." msgstr[1] "Кластеры удалены: %s." msgstr[2] "Кластеры удалены: %s." #, python-format msgid "Deleted quota: %s." msgid_plural "Deleted quotas: %s." msgstr[0] "Удалена квота: %s." msgstr[1] "Удалены квоты: %s." msgstr[2] "Удалены квоты: %s." msgid "Device Mapper" msgstr "Сопоставитель устройств" msgid "Disable TLS" msgstr "Выключить TLS." msgid "Disable TLS in the cluster template. Default: False" msgstr "Выключить TLS в шаблоне кластера. По умолчанию: Нет." msgid "Discovery URL" msgstr "URL поиска" msgid "Docker" msgstr "Docker" msgid "Docker Storage Driver" msgstr "Драйвер хранилища Docker" msgid "Docker Swarm" msgstr "Docker Swarm" msgid "Docker Swarm Mode" msgstr "Режим Docker Swarm" msgid "Docker Volume Size" msgstr "Размер диска Docker" msgid "Docker Volume Size (GB)" msgstr "Размер диска Docker (ГБ)" msgid "Enable Registry" msgstr "Разрешить реестр" msgid "Enable docker registry in the cluster temlate. Default: False" msgstr "Разрешить реестр docker в шаблоне кластера. По умолчанию: Нет." msgid "Exists" msgstr "Существует" msgid "External Network ID" msgstr "ID внешней сети" msgid "Fixed Network" msgstr "Фиксированная сеть" msgid "Fixed Subnet" msgstr "Фиксированная Подсеть" msgid "Flannel" msgstr "Фланнель" msgid "Flavor" msgstr "Тип инстанса" msgid "Flavor ID" msgstr "ID типа инстанса" msgid "Floating IP" msgstr "Назначаемый IP" msgid "Floating IP Enabled" msgstr "Плавающий IP Включен" msgid "HTTP Proxy" msgstr "HTTP Proxy" msgid "HTTPS Proxy" msgstr "HTTPS Proxy" msgid "Hard Limit" msgstr "Жесткий лимит" msgid "Hidden" msgstr "Скрытый" msgid "ID" msgstr "ID" msgid "Image" msgstr "Образ" msgid "Image ID" msgstr "ID образа" msgid "" "Indicates whether created clusters should have a floating ip or not. " "Default: True" msgstr "" "Указывает должен ли созданный кластер иметь назначаемый IP или нет. По " "умолчанию: Да" msgid "" "Indicates whether created clusters should have a load balancer for master " "nodes or not. Default: False" msgstr "" "Указывает должен ли созданный кластер иметь балансировщика нагрузки для " "узлов мастера или нет. По умолчанию: Да" msgid "Infinite" msgstr "Бесконечно" msgid "Info" msgstr "Информация" msgid "Insecure Registry" msgstr "Небезопасный реестр" msgid "KEY1=VALUE1, KEY2=VALUE2..." msgstr "KEY1=VALUE1, KEY2=VALUE2..." msgid "Keypair" msgstr "Ключевая пара" msgid "Kubernetes" msgstr "Kubernetes" msgid "Labels" msgstr "Метки" msgid "Limit for this resource." msgstr "Ограничение для данного ресурса" msgid "Loading" msgstr "Загрузка" msgid "Make cluster template public. Default: False" msgstr "Сделать шаблон кластера общедоступным. По умолчанию: Нет" msgid "Margin" msgstr "Осталось" msgid "Master Addresses" msgstr "Адреса мастеров" msgid "Master Count" msgstr "Количество мастеров" msgid "Master Flavor" msgstr "Тип инстанса мастера" msgid "Master Flavor ID" msgstr "ID типа инстанса Master" msgid "Master LB" msgstr "Главный балансировщик нагрузки" msgid "Master LB Enabled" msgstr "Главный Балансировщик Нагрузки Разрешен " msgid "Maximum Batch Size" msgstr "Максимальный размер пакета" msgid "Mesos" msgstr "Mesos" msgid "Miscellaneous" msgstr "Другое" msgid "Name" msgstr "Имя" msgid "Name of the cluster template." msgstr "Имя шаблона кластера" msgid "Network" msgstr "Сеть" msgid "Network Driver" msgstr "Сетевой драйвер" msgid "New Cluster Template" msgstr "Новый шаблон кластера" msgid "No Proxy" msgstr "Нет прокси" msgid "Node Addresses" msgstr "Адреса узлов" msgid "Node Count" msgstr "Количество узлов" msgid "Node Flavor ID" msgstr "ID типа ноды" msgid "Node Spec" msgstr "Спека узла" msgid "Nodes" msgstr "Узлы" msgid "None" msgstr "Нет" msgid "Overlay" msgstr "Покрытие" msgid "Overview" msgstr "Обзор" msgid "Project" msgstr "Проект" msgid "Project ID" msgstr "ID проекта" msgid "Public" msgstr "Публичный" msgid "Quota" msgstr "Квота" #, python-format msgid "Quota %s was successfully created." msgstr "Квота %s успешно создана." #, python-format msgid "Quota %s/%s was successfully updated." msgstr "Квота %s/%s была успешно обновлена." msgid "Quotas" msgstr "Квоты" msgid "RESTORE COMPLETE" msgstr "Восстановление завершено" msgid "RESUME COMPLETE" msgstr "Возобновление завершено" msgid "ROLLBACK COMPLETE" msgstr "Откат завершен" msgid "Record Properties" msgstr "Свойства записи" msgid "Registry Enabled" msgstr "Реестр разрешен" msgid "Resize Cluster" msgstr "Изменить размер Кластера" msgid "Resource" msgstr "Ресурс" msgid "Rexray" msgstr "Rexray" msgid "Rolling Cluster Upgrade" msgstr "Пошаговое обновление Кластера" msgid "Rotate Certificate" msgstr "Обновить Сертификат" msgid "SNAPSHOT COMPLETE" msgstr "Снимок создан успешно" msgid "Server Type" msgstr "Тип сервера" msgid "Show Certificate" msgstr "Показать сертификат" msgid "Sign Certificate" msgstr "Подписать сертификат" msgid "Sign Certificate To Cluster: {$ ctrl.model.cluster_name $}" msgstr "Подписать Сертификат Для Кластера:{$ ctrl.model.cluster_name $}" msgid "Size" msgstr "Размер" msgid "Specify the Container Orchestration Engine to use." msgstr "Укажите движок оркестрации контейнеров." msgid "" "Specify the nameserver to use for the cluster template. Default: 8.8.8.8" msgstr "" "Укажите сервер имен для использования в шаблоне кластера. По умолчанию: " "8.8.8.8" msgid "Specify the size in GB for the docker volume" msgstr "Укажите размер диска Docker в ГБ." msgid "Stack" msgstr "Стек" msgid "Stack Faults" msgstr "Ошибки стека" msgid "Stack ID" msgstr "ID стека" msgid "Stats" msgstr "Статистика" msgid "Status" msgstr "Статус" msgid "Status Reason" msgstr "Причина статуса" msgid "TLS Disabled" msgstr "TLS запрещен" msgid "The DNS nameserver to use for this cluster template" msgstr "Сервер имен DNS для использования в этом шаблоне кластера" msgid "The URL of docker registry." msgstr "URL реестра Docker. " msgid "The cluster node count." msgstr "Количество узлов кластера." msgid "The http_proxy address to use for nodes in cluster" msgstr "Адреса http_proxy для узлов в кластере." msgid "The https_proxy address to use for nodes in cluster" msgstr "Адреса https_proxy для узлов в кластере." msgid "The maximum number of nodes in the batch has been exceeded." msgstr "Максимальное количество нод в пакете было превышено" msgid "The name or UUID of the SSH keypair to load into the cluster nodes." msgstr "Имя или UUID ключевой пары SSH, для загрузки в узлы кластера." msgid "The name or UUID of the base image to customize for the cluster." msgstr "Имя или UUID базового образа для настройки кластера." msgid "The no_proxy address to use for nodes in cluster" msgstr "Адрес no_proxy для использования узлами в кластере." msgid "The nova flavor id to use when launching the cluster. Default: m1.small" msgstr "" "ID типа инстанса nova для использования при запуске кластера. По умолчанию: " "m1.small" msgid "" "The nova flavor id to use when launching the master node of the cluster. " "Default: m1.small" msgstr "" "ID типа инстанса nova для использования при запуске мастер узла кластера. По " "умолчанию: m1.small" msgid "The size in GB for Docker Volume. Default: 25" msgstr "Размер диска Docker в ГБ. По умолчанию: 25" msgid "This should really be named fixed-network-cidr. Default: 10.0.0.0/24" msgstr "" "Здесь должен быть указан CIDR фиксированной сети. По умолчанию: 10.0.0.0/24" msgid "UPDATE COMPLETE" msgstr "Обновление завершено" msgid "UPDATE FAILED" msgstr "Обновление не удалось" msgid "UPDATE IN PROGRESS" msgstr "Выполняется обновление" msgid "Unable to create cluster template." msgstr "Не удалось создать шаблон кластера." msgid "Unable to create cluster." msgstr "Не удалось создать кластер." msgid "Unable to create quota." msgstr "Не удалось создать квоту." #, python-format msgid "Unable to delete cluster template: %s." msgid_plural "Unable to delete cluster templates: %s." msgstr[0] "Не удалось удалить шаблон кластера: %s." msgstr[1] "Не удалось удалить шаблоны кластера: %s." msgstr[2] "Не удалось удалить шаблоны кластера: %s." #, python-format msgid "Unable to delete cluster: %s." msgid_plural "Unable to delete clusters: %s." msgstr[0] "Не удалось удалить кластер: %s." msgstr[1] "Не удалось удалить кластера: %s." msgstr[2] "Не удалось удалить кластера: %s." #, python-format msgid "Unable to delete quota: %s." msgid_plural "Unable to delete quotas: %s." msgstr[0] "Не удалось удалить квоту: %s." msgstr[1] "Не удалось удалить квоты: %s." msgstr[2] "Не удалось удалить квоты: %s." #, python-format msgid "Unable to delete the cluster template with id: %(id)s" msgstr "Не удается удалить шаблон кластера с ИД: %(id)s" msgid "Unable to delete the cluster templates." msgstr "Не удается удалить шаблоны кластера." #, python-format msgid "Unable to delete the cluster with id: %(id)s" msgstr "Не удается удалить кластер с ID: %(id)s" msgid "Unable to delete the clusters." msgstr "Не удается удалить кластера." #, python-format msgid "" "Unable to delete the quota with project id: %(projectId)s and resource: " "%(resource)s." msgstr "" "Не удалось удалить квоты для проекта %(projectId)s и ресурса %(resource)s." msgid "Unable to get cluster's working nodes." msgstr "Не удалось получить работающие ноды кластера." msgid "Unable to perform rolling upgrade." msgstr "Не удалось выполнить поэтапное обновление." #, python-format msgid "Unable to resize given cluster id: %(id)s." msgstr "Не удалось изменить размер кластера с ID: %(id)s" msgid "Unable to retrieve the certificate." msgstr "Не удается получить сертификат." msgid "Unable to retrieve the cluster template." msgstr "Не удалось получить шаблон кластера." msgid "Unable to retrieve the cluster templates." msgstr "Не удалось получить шаблоны кластера." msgid "Unable to retrieve the cluster." msgstr "Не удалось получить кластер." msgid "Unable to retrieve the clusters." msgstr "Не удалось получить кластеры." msgid "Unable to retrieve the networks." msgstr "Не удалось получить сети." msgid "Unable to retrieve the quota." msgstr "Не удалось получить квоту." msgid "Unable to retrieve the quotas." msgstr "Не удалось получить квоты." msgid "Unable to retrieve the stats." msgstr "Не удалось получить статистику." msgid "Unable to rotate the certificate." msgstr "Не удалось сменить сертификат." msgid "Unable to sign certificate." msgstr "Не удается подписать сертификат." msgid "Unable to update cluster template." msgstr "Не удалось обновить шаблон кластера." msgid "Unable to update cluster." msgstr "Не удалось обновить кластер." msgid "Unable to update quota." msgstr "Не удалось обновить квоту." msgid "Update Cluster Template" msgstr "Обновить Шаблон Кластера" msgid "Update Quota" msgstr "Обновить квоту" msgid "Updated" msgstr "Обновлено" msgid "Updated At" msgstr "Обновлено" msgid "Used {$ ctrl.stats.clusters $} of {$ ctrl.quota.clusters $}" msgstr "Использовано {$ ctrl.stats.clusters $} из {$ ctrl.quota.clusters $}" msgid "Volume Driver" msgstr "Драйвер диска" #, python-format msgid "You are not allowed to delete cluster templates: %s" msgstr "Вам не разрешено удалять шаблоны кластера: %s" #, python-format msgid "You are not allowed to delete clusters: %s" msgstr "Вам не разрешено удалять кластеры: %s" #, python-format msgid "You are not allowed to delete quotas: %s" msgstr "Вам не разрешено удалять квоты: %s" msgid "You cannot resize to less than a single Worker Node." msgstr "Вы не можете изменить размер до менее чем на одной рабочей ноды. " #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted clusters " "are not recoverable." msgstr[0] "" "Вы выбрали \"%s\". Пожалуйста подтвердите ваш выбор. Удаление кластера " "необратимо." msgstr[1] "" "Вы выбрали \"%s\". Пожалуйста подтвердите ваш выбор. Удаление кластеров " "необратимо." msgstr[2] "" "Вы выбрали \"%s\". Пожалуйста подтвердите ваш выбор. Удаление кластеров " "необратимо." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "template is not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "templates are not recoverable." msgstr[0] "" "Вы выбрали\"%s\". Пожалуйста подтвердите ваш выбор. Удаление кластера " "необратимо." msgstr[1] "" "Вы выбрали\"%s\". Пожалуйста подтвердите ваш выбор. Удаление кластеров " "необратимо." msgstr[2] "" "Вы выбрали\"%s\". Пожалуйста подтвердите ваш выбор. Удаление кластеров " "необратимо." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted quota is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted quotas are " "not recoverable." msgstr[0] "" "Вы выбрали \"%s\". Пожалуйста подтвердите ваш выбор. Удаление квоты " "необратимо." msgstr[1] "" "Вы выбрали \"%s\". Пожалуйста подтвердите ваш выбор. Удаление квот " "необратимо." msgstr[2] "" "Вы выбрали \"%s\". Пожалуйста подтвердите ваш выбор. Удаление квот " "необратимо." msgid "" "You may only select as many nodes as you are reducing the original node " "count by." msgstr "" "Вы можете выбрать только то количество нод, на которое производите " "уменьшение размера." msgid "as follows:" msgstr "следующим образом:" msgid "error" msgid_plural "errors" msgstr[0] "ошибка" msgstr[1] "ошибки" msgstr[2] "ошибок" msgid "message" msgid_plural "messages" msgstr[0] "сообщение" msgstr[1] "сообщения" msgstr[2] "сообщений" msgid "submit" msgid_plural "submits" msgstr[0] "отправка" msgstr[1] "отправки" msgstr[2] "отправки" msgid "success" msgid_plural "successes" msgstr[0] "успех" msgstr[1] "успехи" msgstr[2] "успехи" msgid "title" msgid_plural "titles" msgstr[0] "заголовок" msgstr[1] "заголовки" msgstr[2] "заголовки" msgid "{$ ctrl.cluster.create_timeout $} minute" msgid_plural "{$ ctrl.cluster.create_timeout $} minutes" msgstr[0] "{$ ctrl.cluster.create_timeout $} минута" msgstr[1] "{$ ctrl.cluster.create_timeout $} минуты" msgstr[2] "{$ ctrl.cluster.create_timeout $} минут" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9562724 magnum-ui-6.0.1/magnum_ui/locale/tr_TR/0000775000175000017500000000000000000000000017712 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9762714 magnum-ui-6.0.1/magnum_ui/locale/tr_TR/LC_MESSAGES/0000775000175000017500000000000000000000000021477 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/tr_TR/LC_MESSAGES/django.po0000664000175000017500000000157600000000000023312 0ustar00zuulzuul00000000000000# işbaran akçayır , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-02-26 11:52+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-05-22 09:09+0000\n" "Last-Translator: işbaran akçayır \n" "Language-Team: Turkish (Turkey)\n" "Language: tr_TR\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n>1)\n" msgid "Cluster Templates" msgstr "Küme şablonları" msgid "Clusters" msgstr "Kümeler" msgid "Container Infra" msgstr "Kapsayıcı Altyapısı" msgid "Container Infra - Cluster Templates" msgstr "Kapsayıcı Altyapısı - Küme Şablonları" msgid "Container Infra - Clusters" msgstr "Kapsayıcı Altyapısı - Kümeler" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/tr_TR/LC_MESSAGES/djangojs.po0000664000175000017500000003474200000000000023650 0ustar00zuulzuul00000000000000# işbaran akçayır , 2017. #zanata # yasemin demiral , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2020-04-02 03:39+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-16 12:11+0000\n" "Last-Translator: yasemin demiral \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: 1495445554.000000\n" msgid "ADOPT COMPLETE" msgstr "ADOPT TAMAMLANDI" msgid "API Address" msgstr "API Adresi" msgid "API Server Port" msgstr "API Sunucu Bağlantı Noktası" msgid "An arbitrary human-readable name" msgstr "Keyfi okunabilir bir isim" msgid "" "Arbitrary labels in the form of key=value pairs to associate with a cluster " "templates. May be used multiple times." msgstr "" "Küme şablonuyla ilişkilendirilecek anahtar=değer biçimindeki keyfi " "etiketler. Birden fazla kez kullanılabilir." msgid "CHECK COMPLETE" msgstr "KONTROL TAMAMLANDI" msgid "COE" msgstr "COE" msgid "CREATE COMPLETE" msgstr "OLUŞTURMA TAMAMLANDI" msgid "CREATE FAILED" msgstr "OLUŞTURMA BAŞARISIZ" msgid "CREATE IN PROGRESS" msgstr "OLUŞTURMA SÜRÜYOR" msgid "Cancel" msgstr "İptal" #, python-format msgid "Certificate %s was successfully rotated." msgstr "%s sertifikası başarılı bir şekilde çevrildi." #, python-format msgid "Certificate %s was successfully signed." msgstr "Sertifika %s başarıyla imzalandı." msgid "Choose a Cluster Template" msgstr "Bir Küme Şablonu Seçin" msgid "Choose a Container Orchestration Engine" msgstr "Bir Kapsayıcı Düzenleme Motoru Seçin" msgid "Choose a External Network" msgstr "Bir Dış Ağ Seçin" msgid "Choose a Flavor for the Master Node" msgstr "Ana Düğüm için bir Nitelik Seçin" msgid "Choose a Flavor for the Node" msgstr "Düğüm için bir Nitelik seçin" msgid "Choose a Keypair" msgstr "Bir Anahtar Çifti seçin" msgid "Choose a Network Driver" msgstr "Bir Ağ Sürücüsü Seçin" msgid "Choose a Private Network" msgstr "Bir Özel Ağ Seçin" msgid "Choose a Private Network at first" msgstr "İlk önce bir Özel Ağ seçin" msgid "Choose a Private Subnet" msgstr "Bir Özel Alt Ağ Seçin" msgid "Choose a Volume Driver" msgstr "Mantıksal Sürücü Sürücüsü Seçin" msgid "Choose an Image" msgstr "Bir imaj seçin" msgid "Cinder" msgstr "Cinder" msgid "Cluster" msgstr "Küme" #, python-format msgid "Cluster %s was successfully created." msgstr "Küme %s başarıyla oluşturuldu." msgid "Cluster Create Timeout" msgstr "Küme Oluşturma Zaman Aşımı" msgid "Cluster Distro" msgstr "Küme Dağıtımı" msgid "Cluster Name" msgstr "Küme İsmi" msgid "Cluster Template" msgstr "Küme Şablonu" msgid "Cluster Template Detail" msgstr "Küme Şablonu Ayrıntısı" msgid "Cluster Template Name" msgstr "Küme Şablon İsmi" msgid "Cluster Templates" msgstr "Küme Şablonları" msgid "Cluster Type" msgstr "Küme Türü" #, python-format msgid "Cluster template %s was successfully created." msgstr "Küme şablonu %s başarıyla oluşturuldu." #, python-format msgid "Cluster template %s was successfully updated." msgstr "Küme şablonu %s başarıyla güncellendi." msgid "Clusters" msgstr "Kümeler" msgid "Confirm Delete Cluster" msgid_plural "Confirm Delete Clusters" msgstr[0] "Küme Silimini Onayla" msgstr[1] "Kümelerin Silimini Onayla" msgid "Confirm Delete Cluster Template" msgid_plural "Confirm Delete Cluster Templates" msgstr[0] "Küme Şablonu Silmeyi Onayla" msgstr[1] "Küme Şablonları Silmeyi Onayla" msgid "Container Orchestration Engine" msgstr "Kapsayıcı Düzenleme Motoru" msgid "Create" msgstr "Oluştur" msgid "Create Cluster" msgstr "Küme Oluştur" msgid "Create Cluster Template" msgstr "Küme Şablonu Oluştur" msgid "Created" msgstr "Oluşturuldu" msgid "DC/OS" msgstr "DC/OS" msgid "DELETE COMPLETE" msgstr "SİLME TAMAMLANDI" msgid "DELETE FAILED" msgstr "SİLME BAŞARISIZ" msgid "DELETE IN PROGRESS" msgstr "SİLME SÜRÜYOR" msgid "DNS" msgstr "DNS" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Küme Sil" msgstr[1] "Kümeleri Sil" msgid "Delete Cluster Template" msgid_plural "Delete Cluster Templates" msgstr[0] "Küme Şablonunu Sil" msgstr[1] "Küme Şablonlarını Sil" msgid "Delete Cluster Templates" msgstr "Küme Şablonlarını Sil" msgid "Delete Clusters" msgstr "Kümeleri Sil" #, python-format msgid "Deleted cluster template: %s." msgid_plural "Deleted cluster templates: %s." msgstr[0] "Küme şablonu silindi: %s." msgstr[1] "Küme şablonları silindi: %s." #, python-format msgid "Deleted cluster: %s." msgid_plural "Deleted clusters: %s." msgstr[0] "Küme silindi: %s." msgstr[1] "Kümeler silindi: %s." msgid "Device Mapper" msgstr "Aygıt Eşleştirici" msgid "Disable TLS" msgstr "TLS'i Kapat" msgid "Disable TLS in the cluster template. Default: False" msgstr "Küme şablonunda TLS'i kapat. Öntanımlı: Yanlış" msgid "Discovery URL" msgstr "Keşif URL'si" msgid "Docker" msgstr "Docker" msgid "Docker Storage Driver" msgstr "Docker Depolama Sürücüsü" msgid "Docker Swarm" msgstr "Docker Swarm" msgid "Docker Volume Size" msgstr "Docker Mantıksal Sürücü Boyutu" msgid "Docker Volume Size (GB)" msgstr "Docker Mantıksal Sürücü Boyutu (GB)" msgid "Enable Registry" msgstr "Kaydı Etkinleştir" msgid "Enable docker registry in the cluster temlate. Default: False" msgstr "Küme şablonunda docker kaydını etkinleştir. Öntanımlı: Yanlış" msgid "External Network ID" msgstr "Harici Ağ ID'si" msgid "Fixed Network" msgstr "Sabit Ağ" msgid "Fixed Subnet" msgstr "Sabit Alt Ağ" msgid "Flannel" msgstr "Flannel" msgid "Flavor" msgstr "Şablon" msgid "Flavor ID" msgstr "Şablon ID'si" msgid "Floating IP" msgstr "Değişken IP" msgid "Floating IP Enabled" msgstr "Değişken IP Etkin" msgid "HTTP Proxy" msgstr "HTTP Vekili" msgid "HTTPS Proxy" msgstr "HTTPS Vekili" msgid "ID" msgstr "Kimlik" msgid "Image" msgstr "İmaj" msgid "Image ID" msgstr "İmaj ID'si" msgid "" "Indicates whether created clusters should have a floating ip or not. " "Default: True" msgstr "" "Oluşturulan kümelerin değişken ip'lerinin olup olmayacağını gösterir. " "Öntanımlı: Doğru" msgid "" "Indicates whether created clusters should have a load balancer for master " "nodes or not. Default: False" msgstr "" "Oluşturulan kümelerin ana düğümler için yük dengeleyicilerinin olup " "olmayacağını belirtir. Öntanımlı: Yanlış" msgid "Infinite" msgstr "Sonsuz" msgid "Info" msgstr "Bilgi" msgid "KEY1=VALUE1, KEY2=VALUE2..." msgstr "ANAHTAR1=DEĞER1, ANAHTAR2=DEĞER2..." msgid "Keypair" msgstr "Anahtar çifti" msgid "Kubernetes" msgstr "Kubernetes" msgid "Labels" msgstr "Etiketler" msgid "Make cluster template public. Default: False" msgstr "Küme şablonunu açık yap. Öntanımlı: Yanlış" msgid "Master Addresses" msgstr "Ana Adresleri" msgid "Master Count" msgstr "Ana Sayısı" msgid "Master Flavor" msgstr "Ana Şablon" msgid "Master Flavor ID" msgstr "Ana Şablon ID'si" msgid "Master LB" msgstr "Ana LB" msgid "Master LB Enabled" msgstr "Ana LB Etkin" msgid "Mesos" msgstr "Mesos" msgid "Miscellaneous" msgstr "Çeşitli" msgid "Name" msgstr "İsim" msgid "Name of the cluster template." msgstr "Küme şablonu ismi." msgid "Network" msgstr "Ağ" msgid "Network Driver" msgstr "Ağ Sürücüsü" msgid "No Proxy" msgstr "Vekil Yok" msgid "Node Addresses" msgstr "Düğüm Adresleri" msgid "Node Count" msgstr "Düğüm Sayısı" msgid "Node Spec" msgstr "Düğüm Özelliği" msgid "Nodes" msgstr "Düğümler" msgid "Overlay" msgstr "Overlay" msgid "Overview" msgstr "Genel Görünüm" msgid "Public" msgstr "Açık" msgid "RESTORE COMPLETE" msgstr "GERİ YÜKLEME TAMAMLANDI" msgid "RESUME COMPLETE" msgstr "DEVAM ETME TAMAMLANDI" msgid "ROLLBACK COMPLETE" msgstr "GERİ ALMA TAMAMLANDI" msgid "Record Properties" msgstr "Kayıt Özellikleri" msgid "Registry Enabled" msgstr "Kayıt Etkin" msgid "Rexray" msgstr "Rexray" msgid "Rotate Certificate" msgstr "Sertifikayı döndür" msgid "SNAPSHOT COMPLETE" msgstr "ANLIK GÖRÜNTÜ TAMAMLANDI" msgid "Server Type" msgstr "Sunucu Türü" msgid "Show Certificate" msgstr "Sertifikayı Göster" msgid "Sign Certificate" msgstr "Sertifikayı İmzala" msgid "Sign Certificate To Cluster: {$ ctrl.model.cluster_name $}" msgstr "Sertifikayı Kümeye İmzala: {$ ctrl.model.cluster_name $}" msgid "Size" msgstr "Boyut" msgid "Specify the Container Orchestration Engine to use." msgstr "Kullanılacak Kapsayıcı Düzenleme Motorunu Belirtin." msgid "" "Specify the nameserver to use for the cluster template. Default: 8.8.8.8" msgstr "" "Küme şablonu için kullanılacak isim sunucuyu belirtin. Öntanımlı: 8.8.8.8" msgid "Specify the size in GB for the docker volume" msgstr "Docker mantıksal sürücüsü için boyutu GB olarak belirtin" msgid "Stack ID" msgstr "Yığın ID'si" msgid "Status" msgstr "Durum" msgid "TLS Disabled" msgstr "TLS Kapalı" msgid "The DNS nameserver to use for this cluster template" msgstr "Bu küme şablonu için kullanılacak DNS isim sunucu" msgid "The cluster node count." msgstr "Küme düğüm sayısı." msgid "The http_proxy address to use for nodes in cluster" msgstr "Kümedeki düğümler için kullanılacak http_proxy adresi" msgid "The https_proxy address to use for nodes in cluster" msgstr "Kümedeki düğümler için kullanılacak https_proxy adresi" msgid "The name or UUID of the SSH keypair to load into the cluster nodes." msgstr "Küme düğümlerine yüklenece SSH anahtar çiftinin ismi veya UUID'si." msgid "The name or UUID of the base image to customize for the cluster." msgstr "Küme için özelleştirilecek taban imajın ismi veya UUID'si." msgid "The no_proxy address to use for nodes in cluster" msgstr "Kümedeki düğümler için kullanılacak no_proxy adresi" msgid "The nova flavor id to use when launching the cluster. Default: m1.small" msgstr "" "Küme başlatılırken kullanılacak Nova nitelik kimliği. Öntanımlı: m1.small" msgid "" "The nova flavor id to use when launching the master node of the cluster. " "Default: m1.small" msgstr "" "Kümenin ana düğümü başlatılırken kullanılacak Nova nitelik kimliği. " "Öntanımlı: m1.small" msgid "The size in GB for Docker Volume. Default: 25" msgstr "Docker Birimi için GB olarak boyut: Varsayılan: 25" msgid "This should really be named fixed-network-cidr. Default: 10.0.0.0/24" msgstr "" "Bunun gerçekten fixed-network-cidr olarak isimlendirilmesi gerekir. " "Öntanımlı: 10.0.0.0/24" msgid "UPDATE COMPLETE" msgstr "GÜNCELLEME TAMAMLANDI" msgid "UPDATE FAILED" msgstr "GÜNCELLEME BAŞARISIZ" msgid "UPDATE IN PROGRESS" msgstr "GÜNCELLEME SÜRÜYOR" msgid "Unable to create cluster template." msgstr "Küme şablonu oluşturulamıyor." msgid "Unable to create cluster." msgstr "Küme oluşturulamıyor." #, python-format msgid "Unable to delete cluster template: %s." msgid_plural "Unable to delete cluster templates: %s." msgstr[0] "Küme şablonu silinemiyor: %s." msgstr[1] "Küme şablonları silinemiyor: %s." #, python-format msgid "Unable to delete cluster: %s." msgid_plural "Unable to delete clusters: %s." msgstr[0] "Küme silinemiyor: %s." msgstr[1] "Kümeler silinemiyor: %s." #, python-format msgid "Unable to delete the cluster template with id: %(id)s" msgstr "Şu kimliğe sahip küme şablonu silinemedi: %(id)s" msgid "Unable to delete the cluster templates." msgstr "Küme şablonları silinemedi." #, python-format msgid "Unable to delete the cluster with id: %(id)s" msgstr "Şu kimliğe sahip küme silinemedi: %(id)s" msgid "Unable to delete the clusters." msgstr "Kümeler silinemiyor." msgid "Unable to retrieve the certificate." msgstr "Sertifika alınamadı." msgid "Unable to retrieve the cluster template." msgstr "Küme şablonu alınamadı." msgid "Unable to retrieve the cluster templates." msgstr "Küme şablonları alınamadı." msgid "Unable to retrieve the cluster." msgstr "Küme alınamıyor." msgid "Unable to retrieve the clusters." msgstr "Kümeler alınamıyor." msgid "Unable to retrieve the networks." msgstr "Ağlar alınamadı." msgid "Unable to retrieve the stats." msgstr "Stat'lar alınamadı." msgid "Unable to rotate the certificate." msgstr "Sertifika döndürülemiyor." msgid "Unable to sign certificate." msgstr "Sertifika imzalanamadı." msgid "Unable to update cluster template." msgstr "Küme şablonu güncellenemedi." msgid "Unable to update cluster." msgstr "Küme güncellenemiyor." msgid "Update Cluster Template" msgstr "Küme Şablonunu Güncelle" msgid "Updated" msgstr "Güncellendi" msgid "Volume Driver" msgstr "Mantıksal Sürücü Sürücüsü" #, python-format msgid "You are not allowed to delete cluster templates: %s" msgstr "Küme şablonlarını silme yetkiniz yok: %s" #, python-format msgid "You are not allowed to delete clusters: %s" msgstr "Kümeleri silme yetkiniz yok: %s" #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted clusters " "are not recoverable." msgstr[0] "" "\"%s\" seçtiniz. Lütfen seçiminizi onaylayın. Silinen küme geri getirilemez." msgstr[1] "" "\"%s\" seçtiniz. Lütfen seçiminizi onaylayın. Silinen kümeler geri " "getirilemez." #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "template is not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "templates are not recoverable." msgstr[0] "" "\"%s\" seçtiniz. Lütfen seçiminizi onaylayın. Silinen küme şablonu geri " "getirilemez." msgstr[1] "" "\"%s\" seçtiniz. Lütfen seçiminizi onaylayın. Silinen küme şablonları geri " "getirilemez." msgid "error" msgid_plural "errors" msgstr[0] "hata" msgstr[1] "hatalar" msgid "message" msgid_plural "messages" msgstr[0] "ileti" msgstr[1] "iletiler" msgid "submit" msgid_plural "submits" msgstr[0] "gönder" msgstr[1] "gönderiler" msgid "success" msgid_plural "successes" msgstr[0] "başarı" msgstr[1] "başarılar" msgid "title" msgid_plural "titles" msgstr[0] "başlık" msgstr[1] "başlıklar" msgid "{$ ctrl.cluster.create_timeout $} minute" msgid_plural "{$ ctrl.cluster.create_timeout $} minutes" msgstr[0] "{$ ctrl.cluster.create_timeout $} dakika" msgstr[1] "{$ ctrl.cluster.create_timeout $} dakika" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9562724 magnum-ui-6.0.1/magnum_ui/locale/zh_CN/0000775000175000017500000000000000000000000017661 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9762714 magnum-ui-6.0.1/magnum_ui/locale/zh_CN/LC_MESSAGES/0000775000175000017500000000000000000000000021446 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/zh_CN/LC_MESSAGES/django.po0000664000175000017500000000164700000000000023260 0ustar00zuulzuul00000000000000# BillXiang , 2016. #zanata # cuixiaoyu , 2016. #zanata # Gaoxiao Zhu , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-02-26 11:52+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-09 01:58+0000\n" "Last-Translator: Gaoxiao Zhu \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 "Cluster Templates" msgstr "集群模板" msgid "Clusters" msgstr "集群" msgid "Container Infra" msgstr "容器架构" msgid "Container Infra - Cluster Templates" msgstr "容器基础设施-集群模版" msgid "Container Infra - Clusters" msgstr "容器基础设施-集群" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/locale/zh_CN/LC_MESSAGES/djangojs.po0000664000175000017500000003215200000000000023610 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata # ZHIYUAN SU , 2016. #zanata # cuixiaoyu , 2016. #zanata # hanchao , 2016. #zanata # sunanchen , 2016. #zanata # zzxwill , 2016. #zanata # Bin , 2017. #zanata # Gaoxiao Zhu , 2017. #zanata # vuuv , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2020-04-02 03:39+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-12-26 05:57+0000\n" "Last-Translator: vuuv \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 "ADOPT COMPLETE" msgstr "调整完成" msgid "API Address" msgstr "API 地址" msgid "API Server Port" msgstr "API服务端口" msgid "An arbitrary human-readable name" msgstr "一个任意可读的名称。" msgid "" "Arbitrary labels in the form of key=value pairs to associate with a cluster " "templates. May be used multiple times." msgstr "以键值对形式的与集群模板关联的任意标签,可能多次复用" msgid "CHECK COMPLETE" msgstr "检查完成" msgid "COE" msgstr "COE" msgid "CREATE COMPLETE" msgstr "创建完成" msgid "CREATE FAILED" msgstr "创建失败" msgid "CREATE IN PROGRESS" msgstr "正在创建" msgid "Cancel" msgstr "取消" #, python-format msgid "Certificate %s was successfully rotated." msgstr "证书%s成功轮换。" #, python-format msgid "Certificate %s was successfully signed." msgstr "证书%s成功签发了。" msgid "Choose a Cluster Template" msgstr "选择集群模板" msgid "Choose a Container Orchestration Engine" msgstr "选择容器编排引擎" msgid "Choose a External Network" msgstr "选择一个外部网络" msgid "Choose a Flavor for the Master Node" msgstr "为主节点选择一个云主机类型。" msgid "Choose a Flavor for the Node" msgstr "为节点选择一个云主机类型。" msgid "Choose a Keypair" msgstr "选择密钥对" msgid "Choose a Network Driver" msgstr "选择网络驱动程序" msgid "Choose a Private Network" msgstr "选择一个私有网络" msgid "Choose a Private Network at first" msgstr "首先选择一个私有网络" msgid "Choose a Private Subnet" msgstr "选择一个私有子网" msgid "Choose a Volume Driver" msgstr "选择一个卷驱动" msgid "Choose an Image" msgstr "选择一个镜像。" msgid "Cinder" msgstr "Cinder" msgid "Cluster" msgstr "集群" #, python-format msgid "Cluster %s was successfully created." msgstr "成功创建集群:%s" msgid "Cluster Create Timeout" msgstr "创建集群超时" msgid "Cluster Distro" msgstr "集群。" msgid "Cluster Name" msgstr "集群名称" msgid "Cluster Template" msgstr "集群模板" msgid "Cluster Template Detail" msgstr "集群模板详情" msgid "Cluster Template Name" msgstr "集群模板名" msgid "Cluster Templates" msgstr "集群模板" msgid "Cluster Type" msgstr "集群类型" #, python-format msgid "Cluster template %s was successfully created." msgstr "成功创建集群模板%s" #, python-format msgid "Cluster template %s was successfully updated." msgstr "成功更新集群模版%s。" msgid "Clusters" msgstr "集群" msgid "Confirm Delete Cluster" msgid_plural "Confirm Delete Clusters" msgstr[0] "确认删除集群" msgid "Confirm Delete Cluster Template" msgid_plural "Confirm Delete Cluster Templates" msgstr[0] "确认删除集群模板" msgid "Container Orchestration Engine" msgstr "容器编配引擎" msgid "Create" msgstr "创建" msgid "Create Cluster" msgstr "创建集群" msgid "Create Cluster Template" msgstr "创建集群模板" msgid "Created" msgstr "已经创建的。" msgid "DC/OS" msgstr "DC/OS" msgid "DELETE COMPLETE" msgstr "删除完成" msgid "DELETE FAILED" msgstr "删除失败" msgid "DELETE IN PROGRESS" msgstr "正在删除" msgid "DNS" msgstr "DNS" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "删除集群" msgid "Delete Cluster Template" msgid_plural "Delete Cluster Templates" msgstr[0] "删除集群模板" msgid "Delete Cluster Templates" msgstr "批量删除集群模板" msgid "Delete Clusters" msgstr "删除集群" #, python-format msgid "Deleted cluster template: %s." msgid_plural "Deleted cluster templates: %s." msgstr[0] "删除集群模板:%s。" #, python-format msgid "Deleted cluster: %s." msgid_plural "Deleted clusters: %s." msgstr[0] "删除集群:%s" msgid "Device Mapper" msgstr "设备映射" msgid "Disable TLS" msgstr "禁用TLS" msgid "Disable TLS in the cluster template. Default: False" msgstr "在集群模板中禁用TLS,默认:不禁用" msgid "Discovery URL" msgstr "已有的URL," msgid "Docker" msgstr "Docker" msgid "Docker Storage Driver" msgstr "Docker存储驱动" msgid "Docker Swarm" msgstr "Docker Swarm" msgid "Docker Volume Size" msgstr "Docker 卷大小" msgid "Docker Volume Size (GB)" msgstr "Docker 卷大小 (GB)" msgid "Enable Registry" msgstr "可以注册" msgid "Enable docker registry in the cluster temlate. Default: False" msgstr "允许docker在集群模板中进行注册,默认:不允许" msgid "External Network ID" msgstr "外部网络ID。" msgid "Fixed Network" msgstr "固定网络。" msgid "Fixed Subnet" msgstr "固定子网" msgid "Flannel" msgstr "Flannel" msgid "Flavor" msgstr "云主机类型" msgid "Flavor ID" msgstr "云主机类型ID" msgid "Floating IP" msgstr "浮动IP" msgid "Floating IP Enabled" msgstr "允许浮动IP" msgid "HTTP Proxy" msgstr "HTTP 代理" msgid "HTTPS Proxy" msgstr "HTTPS 代理。" msgid "ID" msgstr "ID" msgid "Image" msgstr "镜像" msgid "Image ID" msgstr "镜像ID" msgid "" "Indicates whether created clusters should have a floating ip or not. " "Default: True" msgstr "声明是否为创建的集群提供一个浮动IP,默认,提供" msgid "" "Indicates whether created clusters should have a load balancer for master " "nodes or not. Default: False" msgstr "声明是否为创建的集群的主节点提供一个负载均衡器,默认,不提供" msgid "Infinite" msgstr "无穷的。" msgid "Info" msgstr "信息" msgid "KEY1=VALUE1, KEY2=VALUE2..." msgstr "键1=值1,键2=值2." msgid "Keypair" msgstr "密钥对" msgid "Kubernetes" msgstr "Kubernetes" msgid "Labels" msgstr "标签" msgid "Make cluster template public. Default: False" msgstr "共享集群模板 默认:不共享" msgid "Master Addresses" msgstr "主节点地址" msgid "Master Count" msgstr "主节点数" msgid "Master Flavor" msgstr "主节点类型" msgid "Master Flavor ID" msgstr "主节点类型ID" msgid "Master LB" msgstr "主负载均衡" msgid "Master LB Enabled" msgstr "允许主负载均衡" msgid "Mesos" msgstr "Mesos" msgid "Miscellaneous" msgstr "繁杂" msgid "Name" msgstr "名字。" msgid "Name of the cluster template." msgstr "集群模版名称" msgid "Network" msgstr "网络" msgid "Network Driver" msgstr "网络驱动" msgid "No Proxy" msgstr "非代理。" msgid "Node Addresses" msgstr "节点地址" msgid "Node Count" msgstr "节点数" msgid "Node Spec" msgstr "节点规格" msgid "Nodes" msgstr "节点" msgid "Overlay" msgstr "覆盖" msgid "Overview" msgstr "概览" msgid "Public" msgstr "公共" msgid "RESTORE COMPLETE" msgstr "修复完成" msgid "RESUME COMPLETE" msgstr "恢复完成" msgid "ROLLBACK COMPLETE" msgstr "回滚完成" msgid "Record Properties" msgstr "记录属性" msgid "Registry Enabled" msgstr "启用Registry" msgid "Rexray" msgstr "雷克斯射线" msgid "Rotate Certificate" msgstr "轮换证书" msgid "SNAPSHOT COMPLETE" msgstr "快照完成" msgid "Server Type" msgstr "服务器类型" msgid "Show Certificate" msgstr "显示证书" msgid "Sign Certificate" msgstr "签发证书" msgid "Sign Certificate To Cluster: {$ ctrl.model.cluster_name $}" msgstr "给集群{$ ctrl.model.cluster_name $}签发证书" msgid "Size" msgstr "大小。" msgid "Specify the Container Orchestration Engine to use." msgstr "申明应使用的容器编排引擎。" msgid "" "Specify the nameserver to use for the cluster template. Default: 8.8.8.8" msgstr "明确集群模板使用的nameserver地址,默认:8.8.8.8" msgid "Specify the size in GB for the docker volume" msgstr "指定容器卷的大小用GB来衡量。" msgid "Stack ID" msgstr "栈ID" msgid "Status" msgstr "状态" msgid "TLS Disabled" msgstr "禁用TLS" msgid "The DNS nameserver to use for this cluster template" msgstr "集群模板使用的DNS命名服务器" msgid "The cluster node count." msgstr "集群节点数量" msgid "The http_proxy address to use for nodes in cluster" msgstr "集群中节点所用的HTTP代理地址" msgid "The https_proxy address to use for nodes in cluster" msgstr "集群中的节点使用的https代理地址" msgid "The name or UUID of the SSH keypair to load into the cluster nodes." msgstr "加载到集群节点的SSH 密钥对的UUID名称" msgid "The name or UUID of the base image to customize for the cluster." msgstr "集群定制化基础镜像UUID的名称" msgid "The no_proxy address to use for nodes in cluster" msgstr "集群中节点所用的非代理地址" msgid "The nova flavor id to use when launching the cluster. Default: m1.small" msgstr "当启动集群时候,计算服务类型的id,默认m1.small" msgid "" "The nova flavor id to use when launching the master node of the cluster. " "Default: m1.small" msgstr "当启动集群主节点时候,计算服务类型的id,默认m1.small" msgid "The size in GB for Docker Volume. Default: 25" msgstr "Docker卷的大小(以GB计),默认是25G。" msgid "This should really be named fixed-network-cidr. Default: 10.0.0.0/24" msgstr "这应该称为真正的固定网络CIRD,默认地址为10.0.0.0/24" msgid "UPDATE COMPLETE" msgstr "更新完成" msgid "UPDATE FAILED" msgstr "更新失败" msgid "UPDATE IN PROGRESS" msgstr "正在更新" msgid "Unable to create cluster template." msgstr "无法创建集群模板" msgid "Unable to create cluster." msgstr "无法创建集群" #, python-format msgid "Unable to delete cluster template: %s." msgid_plural "Unable to delete cluster templates: %s." msgstr[0] "无法删除集群模板:%s。" #, python-format msgid "Unable to delete cluster: %s." msgid_plural "Unable to delete clusters: %s." msgstr[0] "无法删除集群:%s。" #, python-format msgid "Unable to delete the cluster template with id: %(id)s" msgstr "无法按照id或者%(id)s 获取集群模板" msgid "Unable to delete the cluster templates." msgstr "无法批量获取集群模板" #, python-format msgid "Unable to delete the cluster with id: %(id)s" msgstr "无法按照id或者%(id)s删除集群" msgid "Unable to delete the clusters." msgstr "无法批量删除集群" msgid "Unable to retrieve the certificate." msgstr "无法检索证书" msgid "Unable to retrieve the cluster template." msgstr "无法获取集群模板" msgid "Unable to retrieve the cluster templates." msgstr "无法批量获取集群模板" msgid "Unable to retrieve the cluster." msgstr "无法批量获取集群" msgid "Unable to retrieve the clusters." msgstr "无法获取集群" msgid "Unable to retrieve the networks." msgstr "无法获取网络。" msgid "Unable to retrieve the stats." msgstr "无法获取统计信息。" msgid "Unable to rotate the certificate." msgstr "无法轮换证书。" msgid "Unable to sign certificate." msgstr "无法签名证书" msgid "Unable to update cluster template." msgstr "无法更新集群模版。" msgid "Unable to update cluster." msgstr "无法更新集群。" msgid "Update Cluster Template" msgstr "更新集群模版" msgid "Updated" msgstr "已经更新的" msgid "Volume Driver" msgstr "卷驱动" #, python-format msgid "You are not allowed to delete cluster templates: %s" msgstr "不允许删除集群模板; %s" #, python-format msgid "You are not allowed to delete clusters: %s" msgstr "您不被允许删除集群:%s" #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster is " "not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted clusters " "are not recoverable." msgstr[0] "您选择了:\"%s\"。请确认你的选择,删除集群无法恢复。" #, python-format msgid "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "template is not recoverable." msgid_plural "" "You have selected \"%s\". Please confirm your selection. Deleted cluster " "templates are not recoverable." msgstr[0] "你已经选择了\"%s\"。请确认你的选择。删除集群模板操作无法恢复。" msgid "error" msgid_plural "errors" msgstr[0] "错误" msgid "message" msgid_plural "messages" msgstr[0] "消息" msgid "submit" msgid_plural "submits" msgstr[0] "提交" msgid "success" msgid_plural "successes" msgstr[0] "成功" msgid "title" msgid_plural "titles" msgstr[0] "标题" msgid "{$ ctrl.cluster.create_timeout $} minute" msgid_plural "{$ ctrl.cluster.create_timeout $} minutes" msgstr[0] "{$ ctrl.cluster.create_timeout $} 分钟" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9562724 magnum-ui-6.0.1/magnum_ui/static/0000775000175000017500000000000000000000000016710 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9562724 magnum-ui-6.0.1/magnum_ui/static/dashboard/0000775000175000017500000000000000000000000020637 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1627552381.980271 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/0000775000175000017500000000000000000000000023716 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1627552381.980271 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/0000775000175000017500000000000000000000000027373 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/actions.module.js0000664000175000017500000000562500000000000032665 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. */ (function() { 'use strict'; /** * @ngdoc overview * @ngname horizon.dashboard.container-infra.cluster-templates.actions * * @description * Provides all of the actions for cluster templates. */ angular.module('horizon.dashboard.container-infra.cluster-templates.actions', [ 'horizon.framework', 'horizon.dashboard.container-infra' ]) .run(registerClusterTemplateActions); registerClusterTemplateActions.$inject = [ 'horizon.framework.conf.resource-type-registry.service', 'horizon.framework.util.i18n.gettext', 'horizon.dashboard.container-infra.cluster-templates.create.service', 'horizon.dashboard.container-infra.cluster-templates.delete.service', 'horizon.dashboard.container-infra.cluster-templates.update.service', 'horizon.dashboard.container-infra.clusters.create.service', 'horizon.dashboard.container-infra.cluster-templates.resourceType' ]; function registerClusterTemplateActions( registry, gettext, createClusterTemplateService, deleteClusterTemplateService, updateClusterTemplateService, createClusterService, resourceType) { var templateResourceType = registry.getResourceType(resourceType); templateResourceType.globalActions .append({ id: 'createClusterTemplateAction', service: createClusterTemplateService, template: { type: 'create', text: gettext('Create Cluster Template') } }); templateResourceType.batchActions .append({ id: 'batchDeleteClusterTemplateAction', service: deleteClusterTemplateService, template: { type: 'delete-selected', text: gettext('Delete Cluster Templates') } }); templateResourceType.itemActions .append({ id: 'createClusterAction', service: createClusterService, template: { text: gettext('Create Cluster') } }) .append({ id: 'updateClusterTemplateAction', service: updateClusterTemplateService, template: { text: gettext('Update Cluster Template') } }) .append({ id: 'deleteClusterTemplateAction', service: deleteClusterTemplateService, template: { type: 'delete', text: gettext('Delete Cluster Template') } }); } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/actions.module.spec.js0000664000175000017500000000416600000000000033615 0ustar00zuulzuul00000000000000/** * (c) Copyright 2016 NEC 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'; describe('register cluster template actions module', function() { var registry; beforeEach(module('horizon.dashboard.container-infra.cluster-templates.actions')); beforeEach(inject(function($injector) { registry = $injector.get('horizon.framework.conf.resource-type-registry.service'); })); it('registers Create ClusterTemplate as a batch action', function() { var actions = registry.getResourceType('OS::Magnum::ClusterTemplate').globalActions; expect(actionHasId(actions, 'createClusterTemplateAction')).toBe(true); }); it('registers Delete ClusterTemplate as a batch action', function() { var actions = registry.getResourceType('OS::Magnum::ClusterTemplate').batchActions; expect(actionHasId(actions, 'batchDeleteClusterTemplateAction')).toBe(true); }); it('registers Create Cluster as an item action', function() { var actions = registry.getResourceType('OS::Magnum::ClusterTemplate').itemActions; expect(actionHasId(actions, 'createClusterAction')).toBe(true); }); it('registers Delete ClusterTemplate as an item action', function() { var actions = registry.getResourceType('OS::Magnum::ClusterTemplate').itemActions; expect(actionHasId(actions, 'deleteClusterTemplateAction')).toBe(true); }); function actionHasId(list, value) { return list.filter(matchesId).length === 1; function matchesId(action) { if (action.id === value) { return true; } } } }); })(); ././@PaxHeader0000000000000000000000000000021000000000000011446 xustar0000000000000000114 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.module.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.modul0000664000175000017500000001157100000000000034117 0ustar00zuulzuul00000000000000/** * Copyright 2015 Cisco Systems, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; /** * @ngdoc overview * @name horizon.dashboard.container-infra.cluster-templates * @ngModule * @description * Provides all the services and widgets require to display the cluster template * panel */ angular .module('horizon.dashboard.container-infra.cluster-templates', [ 'ngRoute', 'horizon.dashboard.container-infra.cluster-templates.actions', 'horizon.dashboard.container-infra.cluster-templates.details' ]) .constant('horizon.dashboard.container-infra.cluster-templates.events', events()) .constant('horizon.dashboard.container-infra.cluster-templates.distros', distros()) .constant( 'horizon.dashboard.container-infra.cluster-templates.resourceType', 'OS::Magnum::ClusterTemplate') .run(run) .config(config); /** * @ngdoc constant * @name events * @returns {Object} The event object * @description A list of events for cluster templates */ function events() { return { CREATE_SUCCESS: 'horizon.dashboard.container-infra.cluster-templates.CREATE_SUCCESS', DELETE_SUCCESS: 'horizon.dashboard.container-infra.cluster-templates.DELETE_SUCCESS' }; } /** * @ngdoc constant * @name distros * @return [distros] available image distros * @description A list available image distros for magnum */ function distros() { return ["coreos", "fedora-atomic", "fedora-coreos", "ubuntu"]; } run.$inject = [ 'horizon.framework.conf.resource-type-registry.service', 'horizon.dashboard.container-infra.cluster-templates.service', 'horizon.dashboard.container-infra.cluster-templates.basePath', 'horizon.dashboard.container-infra.cluster-templates.resourceType' ]; function run(registry, clusterTemplatesService, basePath, resourceType) { registry.getResourceType(resourceType) .setNames(gettext('Cluster Template'), gettext('Cluster Templates')) .setDefaultIndexUrl('/project/cluster_templates/') // for detail summary view on table row .setSummaryTemplateUrl(basePath + 'details/drawer.html') // for table row items and detail summary view. .setProperty('name', { label: gettext('Name') }) .setProperty('id', { label: gettext('ID') }) .setProperty('coe', { label: gettext('COE') }) .setProperty('keypair_id', { label: gettext('Keypair') }) .setProperty('network_driver', { label: gettext('Network Driver') }) .setListFunction(clusterTemplatesService.getClusterTemplatesPromise) .tableColumns .append({ id: 'name', priority: 1, sortDefault: true, filters: ['noName'], urlFunction: clusterTemplatesService.urlFunction }) .append({ id: 'id', priority: 2 }) .append({ id: 'coe', priority: 1 }) .append({ id: 'keypair_id', priority: 1, filters: ['noValue'] }) .append({ id: 'network_driver', priority: 2 }); // for magic-search registry.getResourceType(resourceType).filterFacets .append({ 'label': gettext('Name'), 'name': 'name', 'singleton': true }) .append({ 'label': gettext('ID'), 'name': 'id', 'singleton': true }) .append({ 'label': gettext('COE'), 'name': 'coe', 'singleton': true, options: [ {label: gettext('Docker Swarm'), key: 'swarm'}, {label: gettext('Docker Swarm Mode'), key: 'swarm-mode'}, {label: gettext('Kubernetes'), key: 'kubernetes'}, {label: gettext('DC/OS'), key: 'dcos'}, {label: gettext('Mesos'), key: 'mesos'} ] }); } config.$inject = [ '$provide', '$windowProvider', '$routeProvider' ]; /** * @name config * @param {Object} $provide * @param {Object} $windowProvider * @param {Object} $routeProvider * @returns {undefined} Returns nothing * @description Routes used by this module. */ function config($provide, $windowProvider, $routeProvider) { var path = $windowProvider.$get().STATIC_URL + 'dashboard/container-infra/cluster-templates/'; $provide.constant('horizon.dashboard.container-infra.cluster-templates.basePath', path); $routeProvider.when('/project/cluster_templates', { templateUrl: path + 'panel.html' }); } })(); ././@PaxHeader0000000000000000000000000000021500000000000011453 xustar0000000000000000119 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.module.spec.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.modul0000664000175000017500000000154500000000000034117 0ustar00zuulzuul00000000000000/** * Copyright 2015 Cisco Systems, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; describe('horizon.dashboard.container-infra.cluster-templates', function() { it('should exist', function() { expect(angular.module('horizon.dashboard.container-infra.cluster-templates')).toBeDefined(); }); }); })(); ././@PaxHeader0000000000000000000000000000021100000000000011447 xustar0000000000000000115 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.service.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.servi0000664000175000017500000000415200000000000034124 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. */ (function() { "use strict"; angular.module('horizon.dashboard.container-infra.cluster-templates') .factory('horizon.dashboard.container-infra.cluster-templates.service', clusterTemplatesService); clusterTemplatesService.$inject = [ '$filter', 'horizon.app.core.detailRoute', 'horizon.app.core.openstack-service-api.magnum' ]; /* * @ngdoc factory * @name horizon.dashboard.container-infra.cluster-templates.service * * @description * This service provides functions that are used through the Cluster Templates * features. These are primarily used in the module registrations * but do not need to be restricted to such use. Each exposed function * is documented below. */ function clusterTemplatesService($filter, detailRoute, magnum) { return { getClusterTemplatesPromise: getClusterTemplatesPromise, urlFunction: urlFunction }; function getClusterTemplatesPromise(params) { return magnum.getClusterTemplates(params).then(modifyResponse); function modifyResponse(response) { return {data: {items: response.data.items.map(addTrackBy)}}; function addTrackBy(clusterTemplate) { /* eslint-disable max-len */ var timestamp = clusterTemplate.updated_at ? clusterTemplate.updated_at : clusterTemplate.created_at; clusterTemplate.trackBy = clusterTemplate.id + timestamp; return clusterTemplate; } } } function urlFunction(item) { return detailRoute + 'OS::Magnum::ClusterTemplate/' + item.id; } } })(); ././@PaxHeader0000000000000000000000000000021600000000000011454 xustar0000000000000000120 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.service.spec.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.servi0000664000175000017500000000357500000000000034134 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. */ (function() { "use strict"; describe('cluster templates service', function() { var service, detailRoute; beforeEach(module('horizon.dashboard.container-infra.cluster-templates')); beforeEach(inject(function($injector) { service = $injector.get('horizon.dashboard.container-infra.cluster-templates.service'); detailRoute = $injector.get('horizon.app.core.detailRoute'); })); describe('getClusterTemplatesPromise', function() { it("provides a promise", inject(function($q, $injector, $timeout) { var magnum = $injector.get('horizon.app.core.openstack-service-api.magnum'); var deferred = $q.defer(); spyOn(magnum, 'getClusterTemplates').and.returnValue(deferred.promise); var result = service.getClusterTemplatesPromise({}); deferred.resolve({ data:{ items: [{id: 123, name: 'template1'}] } }); $timeout.flush(); expect(magnum.getClusterTemplates).toHaveBeenCalled(); expect(result.$$state.value.data.items[0].name).toBe('template1'); })); }); describe('urlFunction', function() { it("get url", inject(function() { var result = service.urlFunction({id:"123abc"}); expect(result).toBe(detailRoute + "OS::Magnum::ClusterTemplate/123abc"); })); }); }); })(); ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1627552381.980271 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/create/0000775000175000017500000000000000000000000030636 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020500000000000011452 xustar0000000000000000111 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/create/create.service.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/create/create.service.j0000664000175000017500000000560100000000000033715 0ustar00zuulzuul00000000000000/** * Copyright 2015 Cisco Systems, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; /** * @ngdoc overview * @name horizon.dashboard.container-infra.cluster-templates.create.service * @description Service for the container-infra cluster template create modal */ angular .module('horizon.dashboard.container-infra.cluster-templates') .factory('horizon.dashboard.container-infra.cluster-templates.create.service', createService); createService.$inject = [ 'horizon.app.core.openstack-service-api.magnum', 'horizon.app.core.openstack-service-api.policy', 'horizon.framework.util.actions.action-result.service', 'horizon.framework.util.i18n.gettext', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.form.ModalFormService', 'horizon.framework.widgets.toast.service', 'horizon.dashboard.container-infra.cluster-templates.resourceType', 'horizon.dashboard.container-infra.cluster-templates.workflow' ]; function createService( magnum, policy, actionResult, gettext, $qExtensions, modal, toast, resourceType, workflow ) { var config; var message = { success: gettext('Cluster template %s was successfully created.') }; var service = { perform: perform, allowed: allowed }; return service; ////////////// function perform() { config = workflow.init('create', gettext('Create Cluster Template')); return modal.open(config).then(submit); } function allowed() { return $qExtensions.booleanAsPromise(true); } function submit(context) { context.model = cleanNullProperties(context.model); return magnum.createClusterTemplate(context.model, true).then(success, true); } function cleanNullProperties(model) { // Initially clean fields that don't have any value. // Not only "null", blank too. for (var key in model) { if (model.hasOwnProperty(key) && model[key] === null || model[key] === "" || key === "tabs") { delete model[key]; } } return model; } function success(response) { response.data.id = response.data.uuid; toast.add('success', interpolate(message.success, [response.data.id])); return actionResult.getActionResult() .created(resourceType, response.data.id) .result; } } })(); ././@PaxHeader0000000000000000000000000000021200000000000011450 xustar0000000000000000116 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/create/create.service.spec.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/create/create.service.s0000664000175000017500000000471500000000000033733 0ustar00zuulzuul00000000000000/** * (c) Copyright 2016 NEC 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'; describe('horizon.dashboard.container-infra.cluster-templates.create.service', function() { var service, $scope, $q, deferred, magnum, workflow; var model = { tabs: "", keypair_id: "", coe: null }; var modal = { open: function(config) { config.model = model; deferred = $q.defer(); deferred.resolve(config); return deferred.promise; } }; /////////////////// beforeEach(module('horizon.app.core')); beforeEach(module('horizon.framework')); beforeEach(module('horizon.dashboard.container-infra.cluster-templates')); beforeEach(module(function($provide) { $provide.value('horizon.framework.widgets.form.ModalFormService', modal); })); beforeEach(inject(function($injector, _$rootScope_, _$q_) { $q = _$q_; $scope = _$rootScope_.$new(); service = $injector.get( 'horizon.dashboard.container-infra.cluster-templates.create.service'); magnum = $injector.get('horizon.app.core.openstack-service-api.magnum'); workflow = $injector.get( 'horizon.dashboard.container-infra.cluster-templates.workflow'); deferred = $q.defer(); deferred.resolve({data: {uuid: 1}}); spyOn(magnum, 'createClusterTemplate').and.returnValue(deferred.promise); spyOn(modal, 'open').and.callThrough(); spyOn(workflow, 'init').and.returnValue({model: model}); })); it('should check the policy if the user is allowed to create cluster template', function() { var allowed = service.allowed(); expect(allowed).toBeTruthy(); }); it('open the modal', inject(function($timeout) { service.perform(); expect(modal.open).toHaveBeenCalled(); $timeout.flush(); $scope.$apply(); expect(magnum.createClusterTemplate).toHaveBeenCalled(); })); }); })(); ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1627552381.980271 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/delete/0000775000175000017500000000000000000000000030635 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020500000000000011452 xustar0000000000000000111 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/delete/delete.service.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/delete/delete.service.j0000664000175000017500000001334200000000000033714 0ustar00zuulzuul00000000000000/** * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use self 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.container-infra.cluster-templates') .factory('horizon.dashboard.container-infra.cluster-templates.delete.service', deleteService); deleteService.$inject = [ '$location', '$q', '$rootScope', 'horizon.app.core.openstack-service-api.magnum', 'horizon.app.core.openstack-service-api.policy', 'horizon.framework.util.actions.action-result.service', 'horizon.framework.util.i18n.gettext', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.modal.deleteModalService', 'horizon.framework.widgets.table.events', 'horizon.framework.widgets.toast.service', 'horizon.dashboard.container-infra.cluster-templates.resourceType', 'horizon.dashboard.container-infra.cluster-templates.events' ]; /** * @ngDoc factory * @name delete.service * @param {Object} $location * @param {Object} $q * @param {Object} magnum service * @param {Object} policy * @param {Object} actionResult * @param {Object} gettext * @param {Object} $qExtensions * @param {Object} deleteModal * @param {Object} toast * @param {Object} resourceType * @param {Object} events * @returns {Object} delete service * @description * Brings up the delete cluster templates confirmation modal dialog. * On submit, delete selected resources. * On cancel, do nothing. */ function deleteService( $location, $q, $rootScope, magnum, policy, actionResult, gettext, $qExtensions, deleteModal, tableEvents, toast, resourceType, events ) { var scope; var context = { labels: null, deleteEntity: deleteEntity, successEvent: events.DELETE_SUCCESS }; var service = { initAction: initAction, allowed: allowed, perform: perform }; var notAllowedMessage = gettext("You are not allowed to delete cluster templates: %s"); return service; ////////////// // include this function in your service // if you plan to emit events to the parent controller function initAction() { } function allowed() { return $qExtensions.booleanAsPromise(true); } // delete selected resource objects function perform(selected, $scope) { scope = $scope; selected = angular.isArray(selected) ? selected : [selected]; context.labels = labelize(selected.length); return $qExtensions.allSettled(selected.map(checkPermission)).then(afterCheck); } function labelize(count) { return { title: ngettext('Confirm Delete Cluster Template', 'Confirm Delete Cluster Templates', count), /* eslint-disable max-len */ message: ngettext('You have selected "%s". Please confirm your selection. Deleted cluster template is not recoverable.', 'You have selected "%s". Please confirm your selection. Deleted cluster templates are not recoverable.', count), /* eslint-enable max-len */ submit: ngettext('Delete Cluster Template', 'Delete Cluster Templates', count), success: ngettext('Deleted cluster template: %s.', 'Deleted cluster templates: %s.', count), error: ngettext('Unable to delete cluster template: %s.', 'Unable to delete cluster templates: %s.', count) }; } // for batch delete function checkPermission(selected) { return {promise: allowed(selected), context: selected}; } // for batch delete function afterCheck(result) { var outcome = $q.reject(); // Reject the promise by default if (result.fail.length > 0) { toast.add('error', getMessage(notAllowedMessage, result.fail)); outcome = $q.reject(result.fail); } if (result.pass.length > 0) { outcome = deleteModal.open(scope, result.pass.map(getEntity), context).then(createResult); } return outcome; } function createResult(deleteModalResult) { // To make the result of this action generically useful, reformat the return // from the deleteModal into a standard form var result = actionResult.getActionResult(); deleteModalResult.pass.forEach(function markDeleted(item) { result.deleted(resourceType, getEntity(item).id); }); deleteModalResult.fail.forEach(function markFailed(item) { result.failed(resourceType, getEntity(item).id); }); var indexPath = "/project/cluster_templates"; var currentPath = $location.path(); if (result.result.failed.length === 0 && result.result.deleted.length > 0 && currentPath !== indexPath) { $location.path(indexPath); } else { $rootScope.$broadcast(tableEvents.CLEAR_SELECTIONS); return result.result; } } function getMessage(message, entities) { return interpolate(message, [entities.map(getName).join(", ")]); } function getName(result) { return getEntity(result).name; } // for batch delete function getEntity(result) { return result.context; } // call delete REST API function deleteEntity(id) { return magnum.deleteClusterTemplate(id, true); } } })(); ././@PaxHeader0000000000000000000000000000021200000000000011450 xustar0000000000000000116 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/delete/delete.service.spec.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/delete/delete.service.s0000664000175000017500000001030000000000000033714 0ustar00zuulzuul00000000000000/** * (c) Copyright 2016 NEC 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'; describe('horizon.dashboard.container-infra.cluster-templates.delete.service', function() { var service, $scope, deferredModal; var deleteModalService = { open: function () { deferredModal.resolve({ pass: [{context: {id: 'a'}}], fail: [{context: {id: 'b'}}] }); return deferredModal.promise; } }; var magnumAPI = { deleteClusterTemplate: function() { return; } }; var policyAPI = { ifAllowed: function() { return { success: function(callback) { callback({allowed: true}); } }; } }; beforeEach(module('horizon.dashboard.container-infra.cluster-templates')); beforeEach(module('horizon.app.core')); beforeEach(module('horizon.app.core.images')); beforeEach(module('horizon.framework')); beforeEach(module('horizon.framework.widgets.modal', function($provide) { $provide.value('horizon.framework.widgets.modal.deleteModalService', deleteModalService); })); beforeEach(module('horizon.app.core.openstack-service-api', function($provide) { $provide.value('horizon.app.core.openstack-service-api.magnum', magnumAPI); $provide.value('horizon.app.core.openstack-service-api.policy', policyAPI); spyOn(policyAPI, 'ifAllowed').and.callThrough(); })); beforeEach(inject(function($injector, _$rootScope_, $q) { $scope = _$rootScope_.$new(); service = $injector.get('horizon.dashboard.container-infra.cluster-templates.delete.service'); deferredModal = $q.defer(); })); function generateTemplate(count) { var Template = []; var data = { name: 'delete_test', id: '1', coe: 'swarm', network_driver: 'docker' }; for (var index = 0; index < count; index++) { var templates = angular.copy(data); templates.id = index + 1; Template.push(templates); } return Template; } describe('perform method', function() { beforeEach(function() { spyOn(deleteModalService, 'open').and.callThrough(); service.initAction(labelize); }); function labelize(count) { return { title: ngettext('title', 'titles', count), message: ngettext('message', 'messages', count), submit: ngettext('submit', 'submits', count), success: ngettext('success', 'successes', count), error: ngettext('error', 'errors', count) }; } it('should open the delete modal and show correct labels', testSingleObject); function testSingleObject() { var templates = generateTemplate(1); service.perform(templates[0]); $scope.$apply(); expect(deleteModalService.open).toHaveBeenCalled(); } it('should open the delete modal and show correct labels', testDoubleObject); function testDoubleObject() { var templates = generateTemplate(2); service.perform(templates, $scope); $scope.$apply(); expect(deleteModalService.open).toHaveBeenCalled(); } it('should pass in a function that deletes an template', testMagnum); function testMagnum() { spyOn(magnumAPI, 'deleteClusterTemplate'); var templates = generateTemplate(1); var template = templates[0]; service.perform(templates, $scope); $scope.$apply(); var contextArg = deleteModalService.open.calls.argsFor(0)[2]; var deleteFunction = contextArg.deleteEntity; deleteFunction(template.id); } }); }); })(); ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1627552381.980271 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/details/0000775000175000017500000000000000000000000031020 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020600000000000011453 xustar0000000000000000112 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/details/details.module.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/details/details.module.0000664000175000017500000000330100000000000033727 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. */ (function() { 'use strict'; /** * @ngdoc overview * @ngname horizon.dashboard.container-infra.cluster-templates.details * * @description * Provides details features for cluster templates. */ angular.module('horizon.dashboard.container-infra.cluster-templates.details', ['horizon.framework.conf', 'horizon.app.core']) .run(registerClusterTemplateDetails); registerClusterTemplateDetails.$inject = [ 'horizon.dashboard.container-infra.cluster-templates.basePath', 'horizon.dashboard.container-infra.cluster-templates.resourceType', 'horizon.app.core.openstack-service-api.magnum', 'horizon.framework.conf.resource-type-registry.service' ]; function registerClusterTemplateDetails( basePath, resourceType, magnum, registry ) { registry.getResourceType(resourceType) .setLoadFunction(loadFunction) .detailsViews.append({ id: 'templateDetailsOverview', name: gettext('Overview'), template: basePath + 'details/overview.html' }); function loadFunction(identifier) { return magnum.getClusterTemplate(identifier); } } })(); ././@PaxHeader0000000000000000000000000000021100000000000011447 xustar0000000000000000115 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/details/drawer.controller.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/details/drawer.controll0000664000175000017500000000254500000000000034070 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. */ (function() { 'use strict'; /** * @ngdoc controller * @name horizon.dashboard.container-infra.cluster-templates.DrawerController * @description * This is the controller for the cluster templates drawer (summary) view. * Its primary purpose is to provide the metadata definitions to * the template via the ctrl.metadataDefs member. */ angular .module('horizon.dashboard.container-infra.cluster-templates') .controller('horizon.dashboard.container-infra.cluster-templates.DrawerController', controller); controller.$inject = [ ]; function controller() { var ctrl = this; ctrl.objLen = objLen; function objLen(obj) { var length = 0; if (typeof obj === 'object') { length = Object.keys(obj).length; } return length; } } })(); ././@PaxHeader0000000000000000000000000000021600000000000011454 xustar0000000000000000120 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/details/drawer.controller.spec.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/details/drawer.controll0000664000175000017500000000212000000000000034055 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. */ (function() { 'use strict'; describe('cluster template drawer controller', function() { var ctrl; beforeEach(module('horizon.dashboard.container-infra.cluster-templates')); beforeEach(inject(function($controller) { ctrl = $controller('horizon.dashboard.container-infra.cluster-templates.DrawerController', {}); })); it('objLen returns number of attributes of object', inject(function() { expect(ctrl.objLen(undefined)).toBe(0); expect(ctrl.objLen({a: 0})).toBe(1); })); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/details/drawer.html0000664000175000017500000000157600000000000033203 0ustar00zuulzuul00000000000000
ID
{$ item.id $}
Network Driver
{$ item.network_driver $}
Image ID
{$ item.image_id $}
Registry Enabled
{$ item.registry_enabled | yesno $}
Labels
None
{$ key + '=' + value $}
././@PaxHeader0000000000000000000000000000021300000000000011451 xustar0000000000000000117 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/details/overview.controller.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/details/overview.contro0000664000175000017500000000316700000000000034123 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. */ (function() { "use strict"; angular .module('horizon.dashboard.container-infra.cluster-templates') .controller('ClusterTemplateOverviewController', ClusterTemplateOverviewController); ClusterTemplateOverviewController.$inject = [ '$scope', 'horizon.app.core.openstack-service-api.glance' ]; function ClusterTemplateOverviewController( $scope, glance ) { var ctrl = this; ctrl.cluster_template = {}; ctrl.image_uuid = ""; ctrl.objLen = objLen; $scope.context.loadPromise.then(onGetClusterTemplate); function onGetClusterTemplate(template) { ctrl.cluster_template = template.data; glance.getImages().then(onGetImages); } function onGetImages(images) { angular.forEach(images.data.items, function(image) { if (image.name === ctrl.cluster_template.image_id) { ctrl.image_uuid = image.id; } }); } function objLen(obj) { var length = 0; if (typeof obj === 'object') { length = Object.keys(obj).length; } return length; } } })(); ././@PaxHeader0000000000000000000000000000022000000000000011447 xustar0000000000000000122 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/details/overview.controller.spec.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/details/overview.contro0000664000175000017500000000321600000000000034116 0ustar00zuulzuul00000000000000/** * (c) Copyright 2016 NEC 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'; describe('cluster template overview controller', function() { var ctrl, glance, deferred; beforeEach(module('horizon.dashboard.container-infra.cluster-templates')); beforeEach(inject(function($controller, $q, $injector) { glance = $injector.get('horizon.app.core.openstack-service-api.glance'); deferred = $q.defer(); deferred.resolve({data: {image_id: 1, items: {1: {name: 1, id: 1},2: {name: 2, id: 2}}}}); spyOn(glance, 'getImages').and.returnValue(deferred.promise); ctrl = $controller('ClusterTemplateOverviewController', { '$scope' : {context : {loadPromise: deferred.promise}} } ); })); it('sets ctrl', inject(function($timeout) { $timeout.flush(); expect(ctrl.cluster_template).toBeDefined(); expect(ctrl.image_uuid).toBeDefined(); })); it('objLen returns number of attributes of object', inject(function() { expect(ctrl.objLen(undefined)).toBe(0); expect(ctrl.objLen({a: 0})).toBe(1); })); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/details/overview.html0000664000175000017500000001016200000000000033554 0ustar00zuulzuul00000000000000

Cluster Type


COE
{$ ctrl.cluster_template.coe $}
Cluster Distro
{$ ctrl.cluster_template.cluster_distro $}
Server Type
{$ ctrl.cluster_template.server_type | uppercase $}
Public
{$ ctrl.cluster_template.public | yesno $}
Registry Enabled
{$ ctrl.cluster_template.registry_enabled | yesno $}
TLS Disabled
{$ ctrl.cluster_template.tls_disabled | yesno $}

Node Spec


Image ID
{$ ctrl.cluster_template.image_id $}
Keypair
{$ ctrl.cluster_template.keypair_id $}
-
Flavor ID
{$ ctrl.cluster_template.flavor_id | noValue $}
Master Flavor ID
{$ ctrl.cluster_template.master_flavor_id | noValue $}
Volume Driver
{$ ctrl.cluster_template.volume_driver | noValue $}
Docker Storage Driver
{$ ctrl.cluster_template.docker_storage_driver | noValue $}
Docker Volume Size
{$ ctrl.cluster_template.docker_volume_size | gb | noValue $}
Insecure Registry
{$ ctrl.cluster_template.insecure_registry | noValue $}

Network


Network Driver
{$ ctrl.cluster_template.network_driver $}
HTTP Proxy
{$ ctrl.cluster_template.http_proxy | noValue $}
HTTPS Proxy
{$ ctrl.cluster_template.https_proxy | noValue $}
No Proxy
{$ ctrl.cluster_template.no_proxy | noValue $}
External Network ID
{$ ctrl.cluster_template.external_network_id $}
Fixed Network
{$ ctrl.cluster_template.fixed_network | noValue $}
Fixed Subnet
{$ ctrl.cluster_template.fixed_subnet | noValue $}
DNS
{$ ctrl.cluster_template.dns_nameserver | noValue $}
Master LB Enabled
{$ ctrl.cluster_template.master_lb_enabled | yesno $}
Floating IP Enabled
{$ ctrl.cluster_template.floating_ip_enabled | yesno $}

Labels


None
{$ key $}
{$ value $}

Record Properties


Created
{$ ctrl.cluster_template.created_at | date:'short' $}
Updated
{$ ctrl.cluster_template.updated_at | date:'short' | noValue $}
ID
{$ ctrl.cluster_template.id $}
././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/panel.html0000664000175000017500000000033500000000000031361 0ustar00zuulzuul00000000000000 ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1627552381.980271 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/update/0000775000175000017500000000000000000000000030655 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020500000000000011452 xustar0000000000000000111 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/update/update.service.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/update/update.service.j0000664000175000017500000001424500000000000033757 0ustar00zuulzuul00000000000000/** * Copyright 2017 NEC 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 overview * @name horizon.dashboard.container-infra.cluster-templates.update.service * @description Service for the container-infra cluster template update modal */ angular .module('horizon.dashboard.container-infra.cluster-templates') .factory('horizon.dashboard.container-infra.cluster-templates.update.service', updateService); updateService.$inject = [ 'horizon.app.core.openstack-service-api.magnum', 'horizon.app.core.openstack-service-api.policy', 'horizon.framework.util.actions.action-result.service', 'horizon.framework.util.i18n.gettext', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.form.ModalFormService', 'horizon.framework.widgets.toast.service', 'horizon.dashboard.container-infra.cluster-templates.resourceType', 'horizon.dashboard.container-infra.cluster-templates.workflow' ]; function updateService( magnum, policy, actionResult, gettext, $qExtensions, modal, toast, resourceType, workflow ) { var config; var message = { success: gettext('Cluster template %s was successfully updated.') }; var service = { perform: perform, allowed: allowed }; return service; ////////////// function perform(selected) { config = workflow.init('update', gettext('Update Cluster Template')); config.model.id = selected.id; // load current data magnum.getClusterTemplate(selected.id).then(onLoad); function onLoad(response) { config.model.name = response.data.name ? response.data.name : ""; config.model.coe = response.data.coe ? response.data.coe : ""; config.model.server_type = response.data.server_type ? response.data.server_type : ""; config.model.public = response.data.public ? response.data.public : false; config.model.hidden = response.data.hidden ? response.data.hidden : false; config.model.registry_enabled = response.data.registry_enabled ? response.data.registry_enabled : false; config.model.tls_disabled = response.data.tls_disabled ? response.data.tls_disabled : false; config.model.image_id = response.data.image_id ? response.data.image_id : ""; config.model.flavor_id = response.data.flavor_id ? response.data.flavor_id : ""; config.model.master_flavor_id = response.data.master_flavor_id ? response.data.master_flavor_id : ""; config.model.docker_volume_size = response.data.docker_volume_size ? response.data.docker_volume_size : ""; config.model.docker_storage_driver = response.data.docker_storage_driver ? response.data.docker_storage_driver : ""; config.model.keypair_id = response.data.keypair_id ? response.data.keypair_id : ""; config.model.network_driver = response.data.network_driver ? response.data.network_driver : ""; config.model.volume_driver = response.data.volume_driver ? response.data.volume_driver : ""; config.model.insecure_registry = response.data.insecure_registry ? response.data.insecure_registry : ""; config.model.http_proxy = response.data.http_proxy ? response.data.http_proxy : ""; config.model.https_proxy = response.data.https_proxy ? response.data.https_proxy : ""; config.model.no_proxy = response.data.no_proxy ? response.data.no_proxy : ""; config.model.external_network_id = response.data.external_network_id ? response.data.external_network_id : ""; config.model.fixed_network = response.data.fixed_network ? response.data.fixed_network : ""; config.model.fixed_subnet = response.data.fixed_subnet ? response.data.fixed_subnet : ""; config.model.dns_nameserver = response.data.dns_nameserver ? response.data.dns_nameserver : ""; config.model.master_lb_enabled = response.data.master_lb_enabled ? response.data.master_lb_enabled : false; config.model.floating_ip_enabled = response.data.floating_ip_enabled ? response.data.floating_ip_enabled : false; var labels = ""; for (var key in response.data.labels) { if (response.data.labels.hasOwnProperty(key)) { if (labels !== "") { labels += ","; } labels += key + "=" + response.data.labels[key]; } } config.model.labels = labels; // // update workflow workflow.update(config); } return modal.open(config).then(submit); } function allowed() { return $qExtensions.booleanAsPromise(true); } function submit(context) { var id = context.model.id; context.model = cleanNullProperties(context.model); return magnum.updateClusterTemplate(id, context.model, true) .then(success, true); } function cleanNullProperties(model) { // Initially clean fields that don't have any value. // Not only "null", blank too. for (var key in model) { if (model.hasOwnProperty(key) && model[key] === null || model[key] === "" || key === "tabs" || key === "id") { delete model[key]; } } return model; } function success(response) { response.data.id = response.data.uuid; toast.add('success', interpolate(message.success, [response.data.id])); return actionResult.getActionResult() .updated(resourceType, response.data.id) .result; } } })(); ././@PaxHeader0000000000000000000000000000021200000000000011450 xustar0000000000000000116 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/update/update.service.spec.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/update/update.service.s0000664000175000017500000000560100000000000033764 0ustar00zuulzuul00000000000000/** * Copyright 2017 NEC 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'; describe('horizon.dashboard.container-infra.cluster-templates.update.service', function() { var service, $scope, $q, deferred, magnum; var selected = { id: 1 }; var model = { id: 1, tabs: "", keypair_id: "", coe: null }; var modal = { open: function(config) { config.model = model; deferred = $q.defer(); deferred.resolve(config); return deferred.promise; } }; var workflow = { init: function (action, title) { action = title; return {model: model}; }, update: function () { } }; /////////////////// beforeEach(module('horizon.app.core')); beforeEach(module('horizon.framework')); beforeEach(module('horizon.dashboard.container-infra.cluster-templates')); beforeEach(module(function($provide) { $provide.value('horizon.dashboard.container-infra.cluster-templates.workflow', workflow); $provide.value('horizon.framework.widgets.form.ModalFormService', modal); })); beforeEach(inject(function($injector, _$rootScope_, _$q_) { $q = _$q_; $scope = _$rootScope_.$new(); service = $injector.get( 'horizon.dashboard.container-infra.cluster-templates.update.service'); magnum = $injector.get('horizon.app.core.openstack-service-api.magnum'); deferred = $q.defer(); deferred.resolve({data: {uuid: 1, labels: "key1:val1,key2:val2"}}); spyOn(magnum, 'getClusterTemplate').and.returnValue(deferred.promise); spyOn(magnum, 'updateClusterTemplate').and.returnValue(deferred.promise); spyOn(workflow, 'init').and.returnValue({model: model}); spyOn(workflow, 'update').and.callThrough(); spyOn(modal, 'open').and.callThrough(); })); it('should check the policy if the user is allowed to update cluster template', function() { var allowed = service.allowed(); expect(allowed).toBeTruthy(); }); it('open the modal', inject(function($timeout) { service.perform(selected, $scope); expect(workflow.init).toHaveBeenCalled(); expect(modal.open).toHaveBeenCalledWith({model: model}); $timeout.flush(); $scope.$apply(); expect(magnum.updateClusterTemplate).toHaveBeenCalled(); })); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9842708 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/0000775000175000017500000000000000000000000031245 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/info.help.html0000664000175000017500000000104700000000000034017 0ustar00zuulzuul00000000000000
Cluster Template Name
An arbitrary human-readable name
Container Orchestration Engine
Specify the Container Orchestration Engine to use.
Public
Make cluster template public. Default: False
Enable Registry
Enable docker registry in the cluster temlate. Default: False
Disable TLS
Disable TLS in the cluster template. Default: False
././@PaxHeader0000000000000000000000000000020600000000000011453 xustar0000000000000000112 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/labels.help.html 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/labels.help.ht0000664000175000017500000000020300000000000033766 0ustar00zuulzuul00000000000000

Arbitrary labels in the form of key=value pairs to associate with a cluster templates. May be used multiple times.

././@PaxHeader0000000000000000000000000000020700000000000011454 xustar0000000000000000113 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/network.help.html 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/network.help.h0000664000175000017500000000104200000000000034033 0ustar00zuulzuul00000000000000
Fixed Network
This should really be named fixed-network-cidr. Default: 10.0.0.0/24
DNS
Specify the nameserver to use for the cluster template. Default: 8.8.8.8
Master LB
Indicates whether created clusters should have a load balancer for master nodes or not. Default: False
Floating IP
Indicates whether created clusters should have a floating ip or not. Default: True
././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/spec.help.html0000664000175000017500000000130000000000000034006 0ustar00zuulzuul00000000000000
Image
The name or UUID of the base image to customize for the cluster.
Keypair
The name or UUID of the SSH keypair to load into the cluster nodes.
Flavor
The nova flavor id to use when launching the cluster. Default: m1.small
Master Flavor
The nova flavor id to use when launching the master node of the cluster. Default: m1.small
Docker Volume Size
The size in GB for Docker Volume. Default: 25
Insecure Registry
The URL of docker registry.
././@PaxHeader0000000000000000000000000000021100000000000011447 xustar0000000000000000115 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/workflow.service.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/workflow.servi0000664000175000017500000005020200000000000034170 0ustar00zuulzuul00000000000000/** * Copyright 2015 Cisco Systems, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; angular .module('horizon.dashboard.container-infra.cluster-templates') .factory( 'horizon.dashboard.container-infra.cluster-templates.workflow', ClusterTemplateWorkflow); ClusterTemplateWorkflow.$inject = [ '$q', 'horizon.dashboard.container-infra.basePath', 'horizon.app.core.workflow.factory', 'horizon.framework.util.i18n.gettext', 'horizon.app.core.openstack-service-api.magnum', 'horizon.app.core.openstack-service-api.nova', 'horizon.app.core.openstack-service-api.glance', 'horizon.dashboard.container-infra.cluster-templates.distros' ]; function ClusterTemplateWorkflow( $q, basePath, workflowService, gettext, magnum, nova, glance, distros ) { var workflow = { init: init, update: update }; var form, model, images, nflavors, mflavors, keypairs, externalNetworks, fixedNetworks, fixedSubnets; var fixedSubnetsInitial = gettext("Choose a Private Network at first"); function init(action, title) { var schema; var coes = [{value: '', name: gettext("Choose a Container Orchestration Engine")}, {value: "swarm", name: gettext("Docker Swarm")}, {value: "swarm-mode", name: gettext("Docker Swarm Mode")}, {value: "kubernetes", name: gettext("Kubernetes")}, {value: "mesos", name: gettext("Mesos")}, {value: "dcos", name: gettext("DC/OS")}]; /* default is first value */ var supportedNetworkDrivers = { initial: [{value:"", name: gettext("Choose a Network Driver")}, {value: "docker", name: gettext("Docker")}, {value: "flannel", name: gettext("Flannel")}, {value: "calico", name: gettext("Calico")}], kubernetes: [{value:"flannel", name: gettext("Flannel")}, {value: "calico", name: gettext("Calico")}], swarm: [{value:"docker", name: gettext("Docker")}, {value:"flannel", name: gettext("Flannel")}], "swarm-mode": [{value:"docker", name: gettext("Docker")}, {value:"flannel", name: gettext("Flannel")}], mesos: [{value:"docker", name: gettext("Docker")}], dcos: [{value:"docker", name: gettext("Docker")}]}; var supportedVolumeDrivers = { initial: [{value:"", name: gettext("Choose a Volume Driver")}, {value: "cinder", name: gettext("Cinder")}, {value: "rexray", name: gettext("Rexray")}], kubernetes: [{value:"", name: gettext("Choose a Volume Driver")}, {value:"cinder", name: gettext("Cinder")}], swarm: [{value:"", name: gettext("Choose a Volume Driver")}, {value:"rexray", name: gettext("Rexray")}], "swarm-mode": [{value:"", name: gettext("Choose a Volume Driver")}, {value:"rexray", name: gettext("Rexray")}], mesos: [{value:"", name: gettext("Choose a Volume Driver")}, {value:"rexray", name: gettext("Rexray")}], dcos: [{value:"", name: gettext("Choose a Volume Driver")}, {value:"rexray", name: gettext("Rexray")}]}; // schema schema = { type: 'object', properties: { 'name': { title: gettext('Cluster Template Name'), type: 'string', 'x-schema-form': { type: 'string', placeholder: gettext('Name of the cluster template.') } }, 'coe': { title: gettext('Container Orchestration Engine'), type: 'string' }, 'public': { title: gettext('Public'), type: 'boolean' }, 'hidden': { title: gettext('Hidden'), type: 'boolean' }, 'registry_enabled': { title: gettext('Enable Registry'), type: 'boolean' }, 'tls_disabled': { title: gettext('Disable TLS'), type: 'boolean' }, 'image_id': { type: 'string', title: gettext('Image') }, 'keypair_id': { title: gettext('Keypair'), type: 'string' }, 'flavor_id': { title: gettext('Flavor'), type: 'string' }, 'master_flavor_id': { title: gettext('Master Flavor'), type: 'string' }, 'volume_driver': { title: gettext('Volume Driver'), type: 'string' }, 'docker_storage_driver': { title: gettext('Docker Storage Driver'), type: 'string' }, 'docker_volume_size': { title: gettext('Docker Volume Size (GB)'), type: 'number', 'x-schema-form': { type: 'number', placeholder: gettext('Specify the size in GB for the docker volume') } }, 'insecure_registry': { title: gettext('Insecure Registry'), type: 'string' }, 'network_driver': { title: gettext('Network Driver'), type: 'string' }, 'http_proxy': { title: gettext('HTTP Proxy'), type: 'string', 'x-schema-form': { type: 'string', placeholder: gettext('The http_proxy address to use for nodes in cluster') } }, 'https_proxy': { title: gettext('HTTPS Proxy'), type: 'string', 'x-schema-form': { type: 'string', placeholder: gettext('The https_proxy address to use for nodes in cluster') } }, 'no_proxy': { title: gettext('No Proxy'), type: 'string', 'x-schema-form': { type: 'string', placeholder: gettext('The no_proxy address to use for nodes in cluster') } }, 'external_network_id': { title: gettext('External Network ID'), type: 'string' }, 'fixed_network': { title: gettext('Fixed Network'), type: 'string' }, 'fixed_subnet': { title: gettext('Fixed Subnet'), type: 'string' }, 'dns_nameserver': { title: gettext('DNS'), type: 'string', 'x-schema-form': { type: 'string', placeholder: gettext('The DNS nameserver to use for this cluster template') } }, 'master_lb_enabled': { title: gettext('Master LB'), type: 'boolean' }, 'floating_ip_enabled': { title: gettext('Floating IP'), type: 'boolean' }, 'labels': { title: gettext('Labels'), type: 'string', 'x-schema-form': { type: 'textarea', placeholder: gettext('KEY1=VALUE1, KEY2=VALUE2...') } } } }; // form form = [ { type:'tabs', tabs: [ { title: gettext('Info'), help: basePath + 'cluster-templates/workflow/info.help.html', type: 'section', htmlClass: 'row', items: [ { type: 'section', htmlClass: 'col-xs-12', items: [ { key: 'name' }, { key: 'coe', type: 'select', titleMap: coes, required: true, onChange: function() { if (model.coe) { form[0].tabs[2].items[0].items[0].items[0].titleMap = supportedNetworkDrivers[model.coe]; model.network_driver = supportedNetworkDrivers[model.coe][0].value; form[0].tabs[1].items[0].items[2].items[0].titleMap = supportedVolumeDrivers[model.coe]; model.volume_driver = supportedVolumeDrivers[model.coe][0].value; } else { form[0].tabs[2].items[0].items[0].items[0].titleMap = supportedNetworkDrivers.initial; model.network_driver = supportedNetworkDrivers.initial[0].value; form[0].tabs[1].items[0].items[2].items[0].titleMap = supportedVolumeDrivers.initial; model.volume_driver = supportedVolumeDrivers.initial[0].value; } } }, { key: 'public' }, { key: 'hidden' }, { key: 'registry_enabled' }, { key: 'tls_disabled' } ] } ], required: true }, { title: gettext('Node Spec'), help: basePath + 'cluster-templates/workflow/spec.help.html', type: 'section', htmlClass: 'row', items: [ { type: 'section', htmlClass: 'row', items: [ { type: 'section', htmlClass: 'col-xs-6', items: [ { key: 'image_id', type: 'select', titleMap: images, required: true }, { key: 'flavor_id', type: 'select', titleMap: nflavors } ] }, { type: 'section', htmlClass: 'col-xs-6', items: [ { key: 'keypair_id', type: 'select', titleMap: keypairs }, { key: 'master_flavor_id', type: 'select', titleMap: mflavors } ] }, { type: 'section', htmlClass: 'col-xs-12', items: [ { key: 'volume_driver', type: 'select', titleMap: supportedVolumeDrivers.initial } ] }, { type: 'section', htmlClass: 'col-xs-6', items: [ { key: 'docker_storage_driver', type: 'select', titleMap: [ {value: "devicemapper", name: gettext("Device Mapper")}, {value: "overlay", name: gettext("Overlay")} ] } ] }, { type: 'section', htmlClass: 'col-xs-6', items: [ { key: 'docker_volume_size' } ] }, { type: 'section', htmlClass: 'col-xs-12', items: [ { key: 'insecure_registry' } ] } ] } ], required: true }, { title: gettext('Network'), help: basePath + 'cluster-templates/workflow/network.help.html', type: 'section', htmlClass: 'row', items: [ { type: 'section', htmlClass: 'row', items: [ { type: 'section', htmlClass: 'col-xs-12', items: [ { key: 'network_driver', type: 'select', titleMap: supportedNetworkDrivers.initial }, { key: 'http_proxy' }, { key: 'https_proxy' }, { key: 'no_proxy' }, { key: 'external_network_id', type: 'select', titleMap: externalNetworks, required: true }, { key: 'fixed_network', type: 'select', titleMap: fixedNetworks, onChange: function () { changeFixedNetwork(model); } }, { key: 'fixed_subnet', type: 'select', titleMap: fixedSubnets }, { key: 'dns_nameserver' }, { key: 'master_lb_enabled' }, { key: 'floating_ip_enabled' } ] } ] } ], required: true }, { title: gettext('Labels'), help: basePath + 'cluster-templates/workflow/labels.help.html', type: 'section', htmlClass: 'row', items: [ { type: 'section', htmlClass: 'row', items: [ { type: 'section', htmlClass: 'col-xs-12', items: [ { key: 'labels' } ] } ] } ] } ] } ]; model = { name: "", coe: "", server_type: "", public: "", hidden: "", registry_enabled: "", tls_disabled: "", image_id: "", flavor_id: "", master_flavor_id: "", docker_volume_size: "", docker_storage_driver: "", keypair_id: "", network_driver: "", volume_driver: "", insecure_registry: "", http_proxy: "", https_proxy: "", no_proxy: "", external_network_id: "", fixed_network: "", fixed_subnet: "", dns_nameserver: "", master_lb_enabled: "", floating_ip_enabled: "", labels: "" }; var config = { title: title, schema: schema, form: form, model: model }; update(config); return config; } // called by update.service function update(config) { $q.all({ images: glance.getImages().then(onGetImages), flavors: nova.getFlavors(false, false).then(onGetFlavors), keypairs: nova.getKeypairs().then(onGetKeypairs), networks: magnum.getNetworks().then(onGetNetworks) }).then(function() { changeFixedNetwork(config.model, init); }); } function onGetImages(response) { images = [{value:"", name: gettext("Choose an Image")}]; angular.forEach(response.data.items, function(item) { if (!angular.isUndefined(item.properties) && distros.indexOf(item.properties.os_distro) >= 0) { images.push({value: item.name, name: item.name}); } }); form[0].tabs[1].items[0].items[0].items[0].titleMap = images; var deferred = $q.defer(); deferred.resolve(images); return deferred.promise; } function onGetFlavors(response) { nflavors = [{value:"", name: gettext("Choose a Flavor for the Node")}]; mflavors = [{value:"", name: gettext("Choose a Flavor for the Master Node")}]; angular.forEach(response.data.items, function(item) { nflavors.push({value: item.name, name: item.name}); mflavors.push({value: item.name, name: item.name}); }); form[0].tabs[1].items[0].items[0].items[1].titleMap = nflavors; form[0].tabs[1].items[0].items[1].items[1].titleMap = mflavors; var deferred = $q.defer(); deferred.resolve(nflavors); return deferred.promise; } function onGetKeypairs(response) { keypairs = [{value:"", name: gettext("Choose a Keypair")}]; angular.forEach(response.data.items, function(item) { keypairs.push({value: item.keypair.name, name: item.keypair.name}); }); form[0].tabs[1].items[0].items[1].items[0].titleMap = keypairs; var deferred = $q.defer(); deferred.resolve(keypairs); return deferred.promise; } function onGetNetworks(response) { externalNetworks = [{value:"", name: gettext("Choose a External Network")}]; fixedNetworks = [{value:"", name: gettext("Choose a Private Network")}]; angular.forEach(response.data.items, function(item) { if (item["router:external"]) { externalNetworks.push({value: item.id, name: item.name}); } else { fixedNetworks.push({value: item.id, name: item.name, subnets: item.subnets}); } }); form[0].tabs[2].items[0].items[0].items[4].titleMap = externalNetworks; form[0].tabs[2].items[0].items[0].items[5].titleMap = fixedNetworks; var deferred = $q.defer(); deferred.resolve({ externalNetworks: externalNetworks, fixedNetworks: fixedNetworks }); return deferred.promise; } function changeFixedNetwork(model) { if (model.fixed_network) { fixedSubnets = [{value:"", name: gettext("Choose a Private Subnet")}]; angular.forEach(fixedNetworks, function(fixed) { if (fixed.value === model.fixed_network) { angular.forEach(fixed.subnets, function(subnet) { fixedSubnets.push({value: subnet.id, name: subnet.name}); }); } }); } else { fixedSubnets = [{value:"", name: fixedSubnetsInitial}]; model.fixed_subnet = ""; } form[0].tabs[2].items[0].items[0].items[6].titleMap = fixedSubnets; } return workflow; } })(); ././@PaxHeader0000000000000000000000000000021600000000000011454 xustar0000000000000000120 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/workflow.service.spec.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/workflow.servi0000664000175000017500000000503300000000000034172 0ustar00zuulzuul00000000000000/** * (c) Copyright 2016 NEC 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'; describe('horizon.dashboard.container-infra.cluster-templates.workflow', function() { var workflow, magnum, nova, glance, $q, deferred, keyDeferred; beforeEach(module('horizon.app.core')); beforeEach(module('horizon.framework')); beforeEach(module('horizon.dashboard.container-infra.cluster-templates')); beforeEach(inject(function($injector, _$q_) { $q = _$q_; workflow = $injector.get( 'horizon.dashboard.container-infra.cluster-templates.workflow'); nova = $injector.get('horizon.app.core.openstack-service-api.nova'); glance = $injector.get('horizon.app.core.openstack-service-api.glance'); magnum = $injector.get('horizon.app.core.openstack-service-api.magnum'); deferred = $q.defer(); deferred.resolve({data:{items:{1:{name:1},2:{name:2}}}}); keyDeferred = $q.defer(); keyDeferred.resolve({data:{items:{1:{keypair:{name:1}},2:{keypair:{name:2}}}}}); spyOn(glance, 'getImages').and.returnValue(deferred.promise); spyOn(nova, 'getFlavors').and.returnValue(deferred.promise); spyOn(nova, 'getKeypairs').and.returnValue(keyDeferred.promise); spyOn(magnum, 'getNetworks').and.returnValue(deferred.promise); })); it('should be init', inject(function($timeout) { var config = workflow.init('create', 'Create Cluster Template'); $timeout.flush(); expect(config.title).toBeDefined(); expect(config.schema).toBeDefined(); expect(config.form).toBeDefined(); expect(config.model).toBeDefined(); config.model.coe = ''; config.form[0].tabs[0].items[0].items[1].onChange(); config.model.coe = 'swarm'; config.form[0].tabs[0].items[0].items[1].onChange(); config.model.coe = 'swarm-mode'; config.form[0].tabs[0].items[0].items[1].onChange(); expect(config.form[0].tabs[2].items[0].items[0].items[0].titleMap[0].value).toEqual('docker'); })); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9842708 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/0000775000175000017500000000000000000000000025562 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/actions.module.js0000664000175000017500000000707300000000000031053 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. */ (function() { 'use strict'; /** * @ngdoc overview * @ngname horizon.dashboard.container-infra.clusters.actions * * @description * Provides all of the actions for clusters. */ angular.module('horizon.dashboard.container-infra.clusters.actions', [ 'horizon.framework', 'horizon.dashboard.container-infra' ]) .run(registerClusterActions); registerClusterActions.$inject = [ 'horizon.framework.conf.resource-type-registry.service', 'horizon.framework.util.i18n.gettext', 'horizon.dashboard.container-infra.clusters.create.service', 'horizon.dashboard.container-infra.clusters.delete.service', 'horizon.dashboard.container-infra.clusters.resize.service', 'horizon.dashboard.container-infra.clusters.rolling-upgrade.service', 'horizon.dashboard.container-infra.clusters.show-certificate.service', 'horizon.dashboard.container-infra.clusters.sign-certificate.service', 'horizon.dashboard.container-infra.clusters.rotate-certificate.service', 'horizon.dashboard.container-infra.clusters.resourceType' ]; function registerClusterActions ( registry, gettext, createClusterService, deleteClusterService, resizeClusterService, rollingUpgradeClusterService, showCertificateService, signCertificateService, rotateCertificateService, resourceType) { var clusterResourceType = registry.getResourceType(resourceType); clusterResourceType.globalActions .append({ id: 'createClusterAction', service: createClusterService, template: { type: 'create', text: gettext('Create Cluster') } }); clusterResourceType.batchActions .append({ id: 'batchDeleteClusterAction', service: deleteClusterService, template: { type: 'delete-selected', text: gettext('Delete Clusters') } }); clusterResourceType.itemActions .append({ id: 'showCertificateAction', service: showCertificateService, template: { text: gettext('Show Certificate') } }) .append({ id: 'signCertificateAction', service: signCertificateService, template: { text: gettext('Sign Certificate') } }) .append({ id: 'rotateCertificateAction', service: rotateCertificateService, template: { text: gettext('Rotate Certificate') } }) .append({ id: 'resizeClusterAction', service: resizeClusterService, template: { text: gettext('Resize Cluster') } }) .append({ id: 'rollingUpgradeClusterAction', service: rollingUpgradeClusterService, template: { text: gettext('Rolling Cluster Upgrade') } }) .append({ id: 'deleteClusterAction', service: deleteClusterService, template: { type: 'delete', text: gettext('Delete Cluster') } }); } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/actions.module.spec.js0000664000175000017500000000531200000000000031776 0ustar00zuulzuul00000000000000/** * (c) Copyright 2016 NEC 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'; describe('register cluster actions module', function() { var registry; beforeEach(module('horizon.dashboard.container-infra.clusters.actions')); beforeEach(inject(function($injector) { registry = $injector.get('horizon.framework.conf.resource-type-registry.service'); })); it('registers Create Cluster as a batch action', function() { var actions = registry.getResourceType('OS::Magnum::Cluster').globalActions; expect(actionHasId(actions, 'createClusterAction')).toBe(true); }); it('registers Delete Cluster as a batch action', function() { var actions = registry.getResourceType('OS::Magnum::Cluster').batchActions; expect(actionHasId(actions, 'batchDeleteClusterAction')).toBe(true); }); it('registers Show Certificate as an item action', function() { var actions = registry.getResourceType('OS::Magnum::Cluster').itemActions; expect(actionHasId(actions, 'showCertificateAction')).toBe(true); }); it('registers Sign Certificate as an item action', function() { var actions = registry.getResourceType('OS::Magnum::Cluster').itemActions; expect(actionHasId(actions, 'signCertificateAction')).toBe(true); }); it('registers Rotate Certificate as an item action', function() { var actions = registry.getResourceType('OS::Magnum::Cluster').itemActions; expect(actionHasId(actions, 'rotateCertificateAction')).toBe(true); }); it('registers Resize Cluster as an item action', function() { var actions = registry.getResourceType('OS::Magnum::Cluster').itemActions; expect(actionHasId(actions, 'resizeClusterAction')).toBe(true); }); it('registers Delete Cluster as an item action', function() { var actions = registry.getResourceType('OS::Magnum::Cluster').itemActions; expect(actionHasId(actions, 'deleteClusterAction')).toBe(true); }); function actionHasId(list, value) { return list.filter(matchesId).length === 1; function matchesId(action) { if (action.id === value) { return true; } } } }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/cluster-stats.controller.js0000664000175000017500000000557500000000000033133 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. */ (function() { 'use strict'; /** * @ngdoc controller * @name clusterStatsController * @ngController * * @description * Controller to show stats and quota charts for cluster in cluster table view */ angular .module('horizon.dashboard.container-infra.clusters') .controller( 'horizon.dashboard.container-infra.clusters.clusterStatsController', clusterStatsController); clusterStatsController.$inject = [ '$q', '$scope', 'horizon.app.core.openstack-service-api.magnum', 'horizon.app.core.openstack-service-api.userSession' ]; function clusterStatsController($q, $scope, magnum, userSession) { var ctrl = this; ctrl.chartSettings = { innerRadius: 24, outerRadius: 48, titleClass: "pie-chart-title-medium", showTitle: false, showLabel: true, showLegend: false, tooltipIcon: 'fa-square' }; // Chart data is watched by pie-chart directive. // So to refresh chart after retrieving data, update whole of 'data' array. ctrl.chartDataClusters = { maxLimit: 20, data: [] }; // container for temporal chart data var dataClusters = []; userSession.get().then(onGetUserSession); function onGetUserSession(session) { ctrl.projectId = session.project_id; magnum.getStats().then(onGetStats); } function onGetStats(response) { ctrl.stats = response.data.stats; dataClusters = [ {label: gettext("Exists"), value: response.data.stats.clusters, colorClass: "exists"}, {label: gettext("Margin"), value: 20 - response.data.stats.clusters, colorClass: "margin"} ]; magnum.getQuota(ctrl.projectId, "Cluster", true).then(onGetQuotaCluster, onGetQuotaCluster); } function onGetQuotaCluster(response) { // set data for clusters chart var sum = dataClusters[0].value; var max = dataClusters[1].value; if (response.data.hard_limit) { max = response.data.hard_limit; dataClusters[1].value = max - sum; } var percent = Math.round(sum / max * 100); var overMax = percent > 100; ctrl.chartDataClusters = { title: gettext("Clusters"), label: percent + '%', maxLimit: max, overMax: overMax, data: dataClusters }; ctrl.quota = {clusters: max}; } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/cluster-stats.controller.spec.js0000664000175000017500000000525000000000000034052 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. */ (function() { 'use strict'; describe('horizon.dashboard.container-infra.clusters', function() { var magnum, userSession, controller, $scope, $q, deferredSession, deferred, deferredQuota; beforeEach(module('horizon.framework')); beforeEach(module('horizon.app.core.openstack-service-api')); beforeEach(module('horizon.dashboard.container-infra.clusters')); beforeEach(inject(function ($injector, _$rootScope_, _$q_) { $q = _$q_; $scope = _$rootScope_.$new(); magnum = $injector.get('horizon.app.core.openstack-service-api.magnum'); userSession = $injector.get('horizon.app.core.openstack-service-api.userSession'); controller = $injector.get('$controller'); deferredSession = $q.defer(); deferredSession.resolve({project_id: "1"}); spyOn(userSession, 'get').and.returnValue(deferredSession.promise); deferred = $q.defer(); deferred.resolve({data: {stats: {clusters: 1}}}); spyOn(magnum, 'getStats').and.returnValue(deferred.promise); createController($scope); })); function createController($scoped) { return controller( 'horizon.dashboard.container-infra.clusters.clusterStatsController', { $q: $q, $scope: $scoped, magnum: magnum, userSession: userSession }); } it('should load user session', function() { expect(userSession.get).toHaveBeenCalled(); }); it('should load stats and quotas', function() { deferredQuota = $q.defer(); deferredQuota.resolve({data: {hard_limit: 20}}); spyOn(magnum, 'getQuota').and.returnValue(deferredQuota.promise); $scope.$apply(); expect(magnum.getStats).toHaveBeenCalled(); expect(magnum.getQuota).toHaveBeenCalled(); }); it('should load stats and default quotas', function() { deferredQuota = $q.defer(); deferredQuota.resolve({data: {hard_limit: null}}); spyOn(magnum, 'getQuota').and.returnValue(deferredQuota.promise); $scope.$apply(); expect(magnum.getStats).toHaveBeenCalled(); expect(magnum.getQuota).toHaveBeenCalled(); }); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/clusters.module.js0000664000175000017500000001302200000000000031246 0ustar00zuulzuul00000000000000/** * Copyright 2015 Cisco Systems, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; /** * @ngdoc overview * @name horizon.dashboard.container-infra.clusters * @ngModule * * @description * Provides all the services and widgets require to display the cluster * panel */ angular .module('horizon.dashboard.container-infra.clusters', [ 'ngRoute', 'horizon.dashboard.container-infra.clusters.actions', 'horizon.dashboard.container-infra.clusters.details' ]) .constant('horizon.dashboard.container-infra.clusters.events', events()) .constant('horizon.dashboard.container-infra.clusters.resourceType', 'OS::Magnum::Cluster') .run(run) .config(config); /** * @ngdoc constant * @name clusters.events * @returns {Object} The event object * @description A list of events used by Clusters */ function events() { return { CREATE_SUCCESS: 'horizon.dashboard.container-infra.clusters.CREATE_SUCCESS', DELETE_SUCCESS: 'horizon.dashboard.container-infra.clusters.DELETE_SUCCESS' }; } run.$inject = [ 'horizon.framework.conf.resource-type-registry.service', 'horizon.dashboard.container-infra.clusters.service', 'horizon.dashboard.container-infra.clusters.basePath', 'horizon.dashboard.container-infra.clusters.resourceType' ]; function run(registry, clustersService, basePath, resourceType) { registry.getResourceType(resourceType) .setNames(gettext('Cluster'), gettext('Clusters')) .setDefaultIndexUrl('/project/clusters/') // for detail summary view on table row. .setSummaryTemplateUrl(basePath + 'details/drawer.html') // for table row items and detail summary view. .setProperty('name', { label: gettext('Name') }) .setProperty('id', { label: gettext('ID') }) .setProperty('status', { label: gettext('Status') }) .setProperty('master_count', { label: gettext('Master Count') }) .setProperty('node_count', { label: gettext('Node Count') }) .setProperty('keypair', { label: gettext('Keypair') }) .setListFunction(clustersService.getClustersPromise) .tableColumns .append({ id: 'name', priority: 1, sortDefault: true, filters: ['noName'], urlFunction: clustersService.urlFunction }) .append({ id: 'id', priority: 2 }) .append({ id: 'status', priority: 1 }) .append({ id: 'master_count', priority: 2 }) .append({ id: 'node_count', priority: 2 }) .append({ id: 'keypair', priority: 2 }); // for magic-search registry.getResourceType(resourceType).filterFacets .append({ 'label': gettext('Name'), 'name': 'name', 'singleton': true }) .append({ 'label': gettext('ID'), 'name': 'id', 'singleton': true }) .append({ 'label': gettext('Status'), 'name': 'status', 'singleton': true, 'options': [ {label: gettext('ADOPT COMPLETE'), key: 'ADOPT_COMPLETE'}, {label: gettext('CHECK COMPLETE'), key: 'CHECK_COMPLETE'}, {label: gettext('CREATE COMPLETE'), key: 'CREATE_COMPLETE'}, {label: gettext('CREATE FAILED'), key: 'CREATE_FAILED'}, {label: gettext('CREATE IN PROGRESS'), key: 'CREATE_IN_PROGRESS'}, {label: gettext('DELETE COMPLETE'), key: 'DELETE_COMPLETE'}, {label: gettext('DELETE FAILED'), key: 'DELETE_FAILED'}, {label: gettext('DELETE IN PROGRESS'), key: 'DELETE_IN_PROGRESS'}, {label: gettext('RESTORE COMPLETE'), key: 'RESTORE_COMPLETE'}, {label: gettext('RESUME COMPLETE'), key: 'RESUME_COMPLETE'}, {label: gettext('ROLLBACK COMPLETE'), key: 'ROLLBACK_COMPLETE'}, {label: gettext('SNAPSHOT COMPLETE'), key: 'SNAPSHOT_COMPLETE'}, {label: gettext('UPDATE COMPLETE'), key: 'UPDATE_COMPLETE'}, {label: gettext('UPDATE FAILED'), key: 'UPDATE_FAILED'}, {label: gettext('UPDATE IN PROGRESS'), key: 'UPDATE_IN_PROGRESS'} ] }) .append({ 'label': gettext('Master Count'), 'name': 'master_count', 'singleton': true }) .append({ 'label': gettext('Node Count'), 'name': 'node_count', 'singleton': true }) .append({ 'label': gettext('Keypair'), 'name': 'keypair', 'singleton': true }); } config.$inject = [ '$provide', '$windowProvider', '$routeProvider' ]; /** * @name config * @param {Object} $provide * @param {Object} $windowProvider * @param {Object} $routeProvider * @description Routes used by this module. * @returns {undefined} Returns nothing */ function config($provide, $windowProvider, $routeProvider) { var path = $windowProvider.$get().STATIC_URL + 'dashboard/container-infra/clusters/'; $provide.constant('horizon.dashboard.container-infra.clusters.basePath', path); $routeProvider.when('/project/clusters', { templateUrl: path + 'panel.html' }); } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/clusters.module.spec.js0000664000175000017500000000152300000000000032202 0ustar00zuulzuul00000000000000/** * Copyright 2015 Cisco Systems, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; describe('horizon.dashboard.container-infra.clusters', function() { it('should exist', function() { expect(angular.module('horizon.dashboard.container-infra.clusters')).toBeDefined(); }); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/clusters.scss0000664000175000017500000000136500000000000030330 0ustar00zuulzuul00000000000000.pie-chart { display: block; .svg-pie-chart { .slice { &.exists { fill: lighten(blue, 20%); } &.margin { fill: $gray-lighter; } } } .pie-chart-legend { display: inline-block; margin-left: 20px; .slice-legend { .slice-key { &.exists { background-color: lighten(blue, 20%); } &.margin { background-color: $gray-lighter; } } .chartless { &.exists { color: lighten(blue, 20%); } &.margin { color: $gray-lighter; } } } } } .chart-tooltip { span.fa { &.exists { color: lighten(blue, 20%); } &.margin { color: $gray-lighter; } } }././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/clusters.service.js0000664000175000017500000000364700000000000031435 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. */ (function() { "use strict"; angular.module('horizon.dashboard.container-infra.clusters') .factory('horizon.dashboard.container-infra.clusters.service', clustersService); clustersService.$inject = [ '$filter', 'horizon.app.core.detailRoute', 'horizon.app.core.openstack-service-api.magnum' ]; /* * @ngdoc factory * @name horizon.dashboard.container-infra.clusters.service * * @description * This service provides functions that are used through the Clusters * features. These are primarily used in the module registrations * but do not need to be restricted to such use. Each exposed function * is documented below. */ function clustersService($filter, detailRoute, magnum) { return { getClustersPromise: getClustersPromise, urlFunction: urlFunction }; function getClustersPromise(params) { return magnum.getClusters(params).then(modifyResponse); function modifyResponse(response) { return {data: {items: response.data.items.map(addTrackBy)}}; function addTrackBy(cluster) { var timestamp = cluster.updated_at ? cluster.updated_at : cluster.created_at; cluster.trackBy = cluster.id + timestamp; return cluster; } } } function urlFunction(item) { return detailRoute + 'OS::Magnum::Cluster/' + item.id; } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/clusters.service.spec.js0000664000175000017500000000457200000000000032364 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. */ (function() { "use strict"; describe('cluster templates service', function() { var service, detailRoute, magnum; beforeEach(module('horizon.dashboard.container-infra.cluster-templates')); beforeEach(inject(function($injector) { service = $injector.get('horizon.dashboard.container-infra.clusters.service'); detailRoute = $injector.get('horizon.app.core.detailRoute'); magnum = $injector.get('horizon.app.core.openstack-service-api.magnum'); })); describe('getClustersPromise', function() { it("provides a promise", inject(function($q, $injector, $timeout) { var deferred = $q.defer(); spyOn(magnum, 'getClusters').and.returnValue(deferred.promise); var result = service.getClustersPromise({}); deferred.resolve({ data:{ items: [{id: 123, name: 'cluster1'}] } }); $timeout.flush(); expect(magnum.getClusters).toHaveBeenCalled(); expect(result.$$state.value.data.items[0].name).toBe('cluster1'); })); it("provides a promise with updated_at", inject(function($q, $injector, $timeout) { var deferred = $q.defer(); spyOn(magnum, 'getClusters').and.returnValue(deferred.promise); var result = service.getClustersPromise({}); deferred.resolve({ data:{ items: [{id: 123, name: 'cluster1', updated_at: '2017-01-16'}] } }); $timeout.flush(); expect(magnum.getClusters).toHaveBeenCalled(); expect(result.$$state.value.data.items[0].name).toBe('cluster1'); })); }); describe('urlFunction', function() { it("get url", inject(function() { var result = service.urlFunction({id:"123abc"}); expect(result).toBe(detailRoute + "OS::Magnum::Cluster/123abc"); })); }); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9842708 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/create/0000775000175000017500000000000000000000000027025 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/create/create.service.js0000664000175000017500000001450500000000000032272 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. */ (function() { 'use strict'; /** * @ngdoc overview * @name horizon.dashboard.container-infra.clusters.create.service * @description Service for the container-infra 'Create New Cluster' dialog. * Also responsible for processing the user submission. */ angular .module('horizon.dashboard.container-infra.clusters') .factory('horizon.dashboard.container-infra.clusters.create.service', createService); createService.$inject = [ '$location', 'horizon.app.core.openstack-service-api.magnum', 'horizon.framework.util.actions.action-result.service', 'horizon.framework.util.i18n.gettext', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.form.ModalFormService', 'horizon.framework.widgets.toast.service', 'horizon.framework.widgets.modal-wait-spinner.service', 'horizon.dashboard.container-infra.clusters.resourceType', 'horizon.dashboard.container-infra.clusters.workflow' ]; function createService( $location, magnum, actionResult, gettext, $qExtensions, modal, toast, spinnerModal, resourceType, workflow ) { var modalConfig; var message = { success: gettext('Cluster %s was successfully created.') }; var service = { perform: perform, allowed: allowed }; return service; ////////////// function perform(selected, $scope) { spinnerModal.showModalSpinner(gettext('Loading')); function onCreateWorkflowConfig(config) { modalConfig = config; spinnerModal.hideModalSpinner(); return modal.open(modalConfig).then(onModalSubmit); } return workflow.init(gettext('Create New Cluster'), $scope) .then(onCreateWorkflowConfig) .catch(hideSpinnerOnError); } function hideSpinnerOnError(error) { spinnerModal.hideModalSpinner(); return error; } function allowed() { return $qExtensions.booleanAsPromise(true); } function onModalSubmit(context) { return magnum.createCluster(buildRequestObject(context.model), false) .then(onRequestSuccess, true); } function buildRequestObject(model) { var MODEL_DEFAULTS = model.DEFAULTS; var requestLabels = {}; var requestObject = { // Defaults required by the endpoint discovery_url: null, create_timeout: 60, rollback: false, // Form fields name: model.name, cluster_template_id: model.cluster_template_id, keypair: model.keypair, floating_ip_enabled: model.floating_ip_enabled, labels: requestLabels }; // Optional request fields addFieldToRequestObjectIfSet('master_count','master_count'); addFieldToRequestObjectIfSet('master_flavor_id','master_flavor_id'); addFieldToRequestObjectIfSet('node_count','node_count'); addFieldToRequestObjectIfSet('flavor_id','flavor_id'); if (!model.create_network) { addFieldToRequestObjectIfSet('fixed_network','fixed_network'); } // Labels processing order (the following overrides previous): // Cluster Templates -> Create Form -> User-defined in 'labels' textarea // 1) Cluster Templates labels if (model.templateLabels) { angular.extend(requestLabels, model.templateLabels); } // 2) Create Workflow Form labels requestLabels.availability_zone = model.availability_zone; requestLabels.auto_scaling_enabled = model.auto_scaling_enabled; requestLabels.auto_healing_enabled = model.auto_healing_enabled; if (model.auto_scaling_enabled) { requestLabels.min_node_count = model.min_node_count; requestLabels.max_node_count = model.max_node_count; } // 2A) Labels from user-selected addons angular.forEach(model.addons, function(addon) { angular.extend(requestLabels, addon.labels); }); // 2B) Labels from user-selected ingress controller if (model.ingress_controller && model.ingress_controller.labels) { angular.extend(requestLabels, model.ingress_controller.labels); } // 3) User-defined Custom labels // Parse all labels comma-separated key=value pairs and inject them into request object if (model.labels !== MODEL_DEFAULTS.labels) { try { model.labels.split(',').forEach(function(kvPair) { var pairsList = kvPair.split('='); // Remove leading and trailing whitespaces & convert to l-case var labelKey = pairsList[0].trim().toLowerCase(); var labelValue = pairsList[1].trim().toLowerCase(); if (labelValue) { // Only override existing label values if user override flag is true if (!requestLabels.hasOwnProperty(labelKey) || model.override_labels) { requestLabels[labelKey] = labelValue; } } }); } catch (err) { toast.add('error', gettext('Unable to process `Additional Labels`. ' + 'Not all labels will be applied.')); } } // Only add to the request Object if set (= not default) function addFieldToRequestObjectIfSet(requestFieldName, modelFieldName) { if (model[modelFieldName] !== MODEL_DEFAULTS[modelFieldName]) { requestObject[requestFieldName] = model[modelFieldName]; } } return requestObject; } function onRequestSuccess(response) { response.data.id = response.data.uuid; toast.add('success', interpolate(message.success, [response.data.id])); var result = actionResult.getActionResult() .created(resourceType, response.data.id); if (result.result.failed.length === 0 && result.result.created.length > 0) { $location.path('/project/clusters'); } return result.result; } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/create/create.service.spec.js0000664000175000017500000000765100000000000033227 0ustar00zuulzuul00000000000000/** * (c) Copyright 2016 NEC 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'; describe('horizon.dashboard.container-infra.clusters.create.service', function() { var service, $scope, $q, deferred, magnum, workflow, spinnerModal, modalConfig, configDeferred; var model = { id: 1, labels: 'key1=value1,key2=value2', auto_scaling_enabled: true, templateLabels: {key1:'default value'}, override_labels: true, master_count: 1, create_network: true, addons: [{labels:{}},{labels:{}}], ingress_controller: {labels:{ingress_controller:''}}, DEFAULTS: {labels:''} }; var modal = { open: function(config) { deferred = $q.defer(); deferred.resolve(config); modalConfig = config; return deferred.promise; } }; /////////////////// beforeEach(module('horizon.app.core')); beforeEach(module('horizon.framework')); beforeEach(module('horizon.dashboard.container-infra.clusters')); beforeEach(module(function($provide) { $provide.value('horizon.framework.widgets.form.ModalFormService', modal); })); beforeEach(inject(function($injector, _$rootScope_, _$q_) { $q = _$q_; $scope = _$rootScope_.$new(); service = $injector.get('horizon.dashboard.container-infra.clusters.create.service'); magnum = $injector.get('horizon.app.core.openstack-service-api.magnum'); workflow = $injector.get('horizon.dashboard.container-infra.clusters.workflow'); spinnerModal = $injector.get('horizon.framework.widgets.modal-wait-spinner.service'); spyOn(spinnerModal, 'showModalSpinner').and.callFake(function() {}); spyOn(spinnerModal, 'hideModalSpinner').and.callFake(function() {}); deferred = $q.defer(); deferred.resolve({data: {uuid: 1}}); configDeferred = $q.defer(); configDeferred.resolve({ title: 'Create New Cluster', schema: {}, form: {}, model: model }); spyOn(magnum, 'createCluster').and.returnValue(deferred.promise); spyOn(workflow, 'init').and.returnValue(configDeferred.promise); spyOn(modal, 'open').and.callThrough(); })); it('should check the policy if the user is allowed to create cluster', function() { var allowed = service.allowed(); expect(allowed).toBeTruthy(); }); it('should open the modal, hide the loading spinner and have valid ' + 'form model', inject(function($timeout) { service.perform(null, $scope); $timeout(function() { expect(modal.open).toHaveBeenCalled(); expect(magnum.createCluster).toHaveBeenCalled(); // Check if the form's model skeleton is correct expect(modalConfig.model).toBeDefined(); expect(modalConfig.schema).toBeDefined(); expect(modalConfig.form).toBeDefined(); expect(modalConfig.title).toEqual('Create New Cluster'); }, 0); $timeout.flush(); $scope.$apply(); })); it('should not crash unexpectedly with empty form model', inject(function($timeout) { model.auto_scaling_enabled = null; model.templateLabels = null; model.override_labels = null; model.create_network = null; model.addons = null; model.labels = 'invalid label'; service.perform(null, $scope); $timeout.flush(); $scope.$apply(); })); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9842708 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/delete/0000775000175000017500000000000000000000000027024 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/delete/delete.service.js0000664000175000017500000001310200000000000032260 0ustar00zuulzuul00000000000000/** * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use self 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.container-infra.clusters') .factory('horizon.dashboard.container-infra.clusters.delete.service', deleteService); deleteService.$inject = [ '$location', '$q', '$rootScope', 'horizon.app.core.openstack-service-api.magnum', 'horizon.app.core.openstack-service-api.policy', 'horizon.framework.util.actions.action-result.service', 'horizon.framework.util.i18n.gettext', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.modal.deleteModalService', 'horizon.framework.widgets.table.events', 'horizon.framework.widgets.toast.service', 'horizon.dashboard.container-infra.clusters.resourceType', 'horizon.dashboard.container-infra.clusters.events' ]; /** * @ngDoc factory * @name clusters.delete.service * @param {Object} $location * @param {Object} $q * @param {Object} magnum * @param {Object} policy * @param {Object} actionResult * @param {Object} gettext * @param {Object} $qExtensions * @param {Object} deleteModal * @param {Object} toast * @param {Object} resourceType * @param {Object} events * @returns {Object} delete service * @description * Brings up the delete clusters confirmation modal dialog. * On submit, delete selected resources. * On cancel, do nothing. */ function deleteService( $location, $q, $rootScope, magnum, policy, actionResult, gettext, $qExtensions, deleteModal, tableEvents, toast, resourceType, events ) { var scope; var context = { labels: null, deleteEntity: deleteEntity, successEvent: events.DELETE_SUCCESS }; var service = { initAction: initAction, allowed: allowed, perform: perform }; var notAllowedMessage = gettext("You are not allowed to delete clusters: %s"); return service; ////////////// // include this function in your service // if you plan to emit events to the parent controller function initAction() { } function allowed() { return $qExtensions.booleanAsPromise(true); } // delete selected resource objects function perform(selected, $scope) { scope = $scope; selected = angular.isArray(selected) ? selected : [selected]; context.labels = labelize(selected.length); return $qExtensions.allSettled(selected.map(checkPermission)).then(afterCheck); } function labelize(count) { return { title: ngettext('Confirm Delete Cluster', 'Confirm Delete Clusters', count), /* eslint-disable max-len */ message: ngettext('You have selected "%s". Please confirm your selection. Deleted cluster is not recoverable.', 'You have selected "%s". Please confirm your selection. Deleted clusters are not recoverable.', count), /* eslint-enable max-len */ submit: ngettext('Delete Cluster', 'Delete Clusters', count), success: ngettext('Deleted cluster: %s.', 'Deleted clusters: %s.', count), error: ngettext('Unable to delete cluster: %s.', 'Unable to delete clusters: %s.', count) }; } // for batch delete function checkPermission(selected) { return {promise: allowed(selected), context: selected}; } // for batch delete function afterCheck(result) { var outcome = $q.reject(); // Reject the promise by default if (result.fail.length > 0) { toast.add('error', getMessage(notAllowedMessage, result.fail)); outcome = $q.reject(result.fail); } if (result.pass.length > 0) { outcome = deleteModal.open(scope, result.pass.map(getEntity), context).then(createResult); } return outcome; } function createResult(deleteModalResult) { // To make the result of this action generically useful, reformat the return // from the deleteModal into a standard form var result = actionResult.getActionResult(); deleteModalResult.pass.forEach(function markDeleted(item) { result.deleted(resourceType, getEntity(item).id); }); deleteModalResult.fail.forEach(function markFailed(item) { result.failed(resourceType, getEntity(item).id); }); var indexPath = "/project/clusters"; var currentPath = $location.path(); if (result.result.failed.length === 0 && result.result.deleted.length > 0 && currentPath !== indexPath) { $location.path(indexPath); } else { $rootScope.$broadcast(tableEvents.CLEAR_SELECTIONS); return result.result; } } function getMessage(message, entities) { return interpolate(message, [entities.map(getName).join(", ")]); } function getName(result) { return getEntity(result).name; } // for batch delete function getEntity(result) { return result.context; } // call delete REST API function deleteEntity(id) { return magnum.deleteCluster(id, true); } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/delete/delete.service.spec.js0000664000175000017500000001016500000000000033217 0ustar00zuulzuul00000000000000/** * (c) Copyright 2016 NEC 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'; describe('horizon.dashboard.container-infra.clusters.delete.service', function() { var service, $scope, deferredModal; var deleteModalService = { open: function () { deferredModal.resolve({ pass: [{context: {id: 'a'}}], fail: [{context: {id: 'b'}}] }); return deferredModal.promise; } }; var magnumAPI = { deleteCluster: function() { return; } }; var policyAPI = { ifAllowed: function() { return { success: function(callback) { callback({allowed: true}); } }; } }; beforeEach(module('horizon.dashboard.container-infra.clusters')); beforeEach(module('horizon.app.core')); beforeEach(module('horizon.framework')); beforeEach(module('horizon.framework.widgets.modal', function($provide) { $provide.value('horizon.framework.widgets.modal.deleteModalService', deleteModalService); })); beforeEach(module('horizon.app.core.openstack-service-api', function($provide) { $provide.value('horizon.app.core.openstack-service-api.magnum', magnumAPI); $provide.value('horizon.app.core.openstack-service-api.policy', policyAPI); spyOn(policyAPI, 'ifAllowed').and.callThrough(); })); beforeEach(inject(function($injector, _$rootScope_, $q) { $scope = _$rootScope_.$new(); service = $injector.get('horizon.dashboard.container-infra.clusters.delete.service'); deferredModal = $q.defer(); })); function generateCluster(count) { var Cluster = []; var data = { name: 'delete_test', id: '1', status: 'CREATE_IN_PROGRESS', node_count: '2', master_count: '1' }; for (var index = 0; index < count; index++) { var clusters = angular.copy(data); clusters.id = index + 1; Cluster.push(clusters); } return Cluster; } describe('perform method', function() { beforeEach(function() { spyOn(deleteModalService, 'open').and.callThrough(); service.initAction(labelize); }); function labelize(count) { return { title: ngettext('title', 'titles', count), message: ngettext('message', 'messages', count), submit: ngettext('submit', 'submits', count), success: ngettext('success', 'successes', count), error: ngettext('error', 'errors', count) }; } it('should open the delete modal and show correct labels', testSingleObject); function testSingleObject() { var clusters = generateCluster(1); service.perform(clusters[0], $scope); $scope.$apply(); expect(deleteModalService.open).toHaveBeenCalled(); } it('should open the delete modal and show correct labels', testDoubleObject); function testDoubleObject() { var clusters = generateCluster(2); service.perform(clusters, $scope); $scope.$apply(); expect(deleteModalService.open).toHaveBeenCalled(); } it('should pass in a function that deletes a cluster', testMagnum); function testMagnum() { spyOn(magnumAPI, 'deleteCluster'); var clusters = generateCluster(1); var cluster = clusters[0]; service.perform(clusters, $scope); $scope.$apply(); var contextArg = deleteModalService.open.calls.argsFor(0)[2]; var deleteFunction = contextArg.deleteEntity; deleteFunction(cluster.id); } }); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9882708 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/details/0000775000175000017500000000000000000000000027207 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/details/details.module.js0000664000175000017500000000316300000000000032461 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. */ (function() { 'use strict'; /** * @ngdoc overview * @ngname horizon.dashboard.container-infra.clusters.details * * @description * Provides details features for clusters. */ angular.module('horizon.dashboard.container-infra.clusters.details', ['horizon.framework.conf', 'horizon.app.core']) .run(registerClusterDetails); registerClusterDetails.$inject = [ 'horizon.dashboard.container-infra.clusters.basePath', 'horizon.dashboard.container-infra.clusters.resourceType', 'horizon.app.core.openstack-service-api.magnum', 'horizon.framework.conf.resource-type-registry.service' ]; function registerClusterDetails( basePath, resourceType, magnum, registry ) { registry.getResourceType(resourceType) .setLoadFunction(loadFunction) .detailsViews.append({ id: 'clusterDetailsOverview', name: gettext('Overview'), template: basePath + 'details/overview.html' }); function loadFunction(identifier) { return magnum.getCluster(identifier); } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/details/drawer.controller.js0000664000175000017500000000247700000000000033225 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. */ (function() { 'use strict'; /** * @ngdoc controller * @name horizon.dashboard.container-infra.clusters.DrawerController * @description * This is the controller for the cluster drawer (summary) view. * Its primary purpose is to provide the metadata definitions to * the template via the ctrl.metadataDefs member. */ angular .module('horizon.dashboard.container-infra.clusters') .controller('horizon.dashboard.container-infra.clusters.DrawerController', controller); controller.$inject = [ ]; function controller() { var ctrl = this; ctrl.objLen = objLen; function objLen(obj) { var length = 0; if (typeof obj === 'object') { length = Object.keys(obj).length; } return length; } } })(); ././@PaxHeader0000000000000000000000000000020500000000000011452 xustar0000000000000000111 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/details/drawer.controller.spec.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/details/drawer.controller.spec.j0000664000175000017500000000205500000000000033763 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. */ (function() { 'use strict'; describe('cluster drawer controller', function() { var ctrl; beforeEach(module('horizon.dashboard.container-infra.clusters')); beforeEach(inject(function($controller) { ctrl = $controller('horizon.dashboard.container-infra.clusters.DrawerController', {}); })); it('objLen returns number of attributes of object', inject(function() { expect(ctrl.objLen(undefined)).toBe(0); expect(ctrl.objLen({a: 0})).toBe(1); })); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/details/drawer.html0000664000175000017500000000266300000000000031370 0ustar00zuulzuul00000000000000
ID
{$ item.id $}
Master Count
{$ item.master_count $}
Node Count
{$ item.node_count $}
Keypair
{$ item.keypair $}
Cluster Template
{$ item.cluster_template_id $}
API Address
{$ item.api_address $}
Master Addresses
None
{$ addr $}
Node Addresses
None
{$ addr $}
././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/details/overview.controller.js0000664000175000017500000000276600000000000033610 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. */ (function() { "use strict"; angular .module('horizon.dashboard.container-infra.clusters') .controller('ClusterOverviewController', ClusterOverviewController); ClusterOverviewController.$inject = [ '$scope', 'horizon.app.core.openstack-service-api.magnum' ]; function ClusterOverviewController( $scope, magnum ) { var ctrl = this; ctrl.cluster = {}; ctrl.cluster_template = {}; ctrl.objLen = objLen; $scope.context.loadPromise.then(onGetCluster); function onGetCluster(cluster) { ctrl.cluster = cluster.data; magnum.getClusterTemplate(ctrl.cluster.cluster_template_id).then(onGetClusterTemplate); } function onGetClusterTemplate(clusterTemplate) { ctrl.cluster_template = clusterTemplate.data; } function objLen(obj) { var length = 0; if (typeof obj === 'object') { length = Object.keys(obj).length; } return length; } } })(); ././@PaxHeader0000000000000000000000000000020700000000000011454 xustar0000000000000000113 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/details/overview.controller.spec.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/details/overview.controller.spec0000664000175000017500000000316000000000000034113 0ustar00zuulzuul00000000000000/** * (c) Copyright 2016 NEC 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'; describe('cluster overview controller', function() { var ctrl, magnum, deferred; beforeEach(module('horizon.dashboard.container-infra.clusters')); beforeEach(inject(function($controller, $q, $injector) { magnum = $injector.get('horizon.app.core.openstack-service-api.magnum'); deferred = $q.defer(); deferred.resolve({data: {image_id: 1},items:{1:{name:1,id:1},2:{name:2,id:2}}}); spyOn(magnum, 'getClusterTemplate').and.returnValue(deferred.promise); ctrl = $controller('ClusterOverviewController', { '$scope' : {context : {loadPromise: deferred.promise}} } ); })); it('sets ctrl', inject(function($timeout) { $timeout.flush(); expect(ctrl.cluster_template).toBeDefined(); expect(ctrl.cluster).toBeDefined(); })); it('objLen returns number of attributes of object', inject(function() { expect(ctrl.objLen(undefined)).toBe(0); expect(ctrl.objLen({a: 0})).toBe(1); })); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/details/overview.html0000664000175000017500000001032400000000000031743 0ustar00zuulzuul00000000000000

Cluster Template


Name
{$ ctrl.cluster_template.name|noName $}
ID
{$ ctrl.cluster_template.id $}
COE
{$ ctrl.cluster_template.coe $}
Image ID
{$ ctrl.cluster_template.image_id $}

Nodes


Master Count
{$ ctrl.cluster.master_count $}
Node Count
{$ ctrl.cluster.node_count $}
API Address
{$ ctrl.cluster.api_address $}
Master Addresses
None
{$ addr $}
Node Addresses
None
{$ addr $}

Miscellaneous


Discovery URL
{$ ctrl.cluster.discovery_url $}
Cluster Create Timeout
Infinite
{$ ctrl.cluster.create_timeout $} minute
Keypair
{$ ctrl.cluster.keypair $}
Docker Volume Size
{$ ctrl.cluster.docker_volume_size | noValue $} GB
Master Flavor ID
{$ ctrl.cluster.master_flavor_id | noValue $}
Node Flavor ID
{$ ctrl.cluster.flavor_id | noValue $}
COE Version
{$ ctrl.cluster.coe_version | noValue $}
Container Version
{$ ctrl.cluster.container_version | noValue $}

Labels


None
{$ key $}
{$ value $}

Stack


Stack ID
{$ ctrl.cluster.stack_id $}
Stack Faults
None
as follows:
{$ key $}
{$ value $}

Record Properties


Created
{$ ctrl.cluster.created_at | date:'short' $}
Updated
{$ ctrl.cluster.updated_at | date:'short' $}
ID
{$ ctrl.cluster.id $}
Status
{$ ctrl.cluster.status $}
Status Reason
{$ ctrl.cluster.status_reason | noValue $}
././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/panel.html0000664000175000017500000000175500000000000027557 0ustar00zuulzuul00000000000000

Stats


Clusters
Used {$ ctrl.stats.clusters $} of {$ ctrl.quota.clusters $}
Nodes
{$ ctrl.stats.nodes $}

././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9882708 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/resize/0000775000175000017500000000000000000000000027063 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.js0000664000175000017500000001405600000000000032367 0ustar00zuulzuul00000000000000/** * Copyright 2017 NEC 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 overview * @name horizon.dashboard.container-infra.clusters.resize.service * @description Service for the container-infra cluster resize modal. * Allows user to select new number of worker nodes and if the number * is reduced, nodes to be removed can be selected from the list. */ angular .module('horizon.dashboard.container-infra.clusters') .factory('horizon.dashboard.container-infra.clusters.resize.service', resizeService); resizeService.$inject = [ '$rootScope', '$q', 'horizon.app.core.openstack-service-api.magnum', 'horizon.framework.util.actions.action-result.service', 'horizon.framework.util.i18n.gettext', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.form.ModalFormService', 'horizon.framework.widgets.toast.service', 'horizon.framework.widgets.modal-wait-spinner.service', 'horizon.dashboard.container-infra.clusters.resourceType' ]; function resizeService( $rootScope, $q, magnum, actionResult, gettext, $qExtensions, modal, toast, spinnerModal, resourceType ) { var modalConfig, formModel; var service = { perform: perform, allowed: allowed }; return service; ////////////// function perform(selected, $scope) { var deferred = $q.defer(); spinnerModal.showModalSpinner(gettext('Loading')); magnum.getClusterNodes(selected.id) .then(onLoad) .catch(hideSpinnerOnError); function onLoad(response) { formModel = getFormModelDefaults(); formModel.id = selected.id; modalConfig = constructModalConfig(response.data.worker_nodes); deferred.resolve(modal.open(modalConfig).then(onModalSubmit)); $scope.model = formModel; spinnerModal.hideModalSpinner(); } function hideSpinnerOnError(error) { spinnerModal.hideModalSpinner(); return deferred.reject(error); } return deferred.promise; } function allowed() { return $qExtensions.booleanAsPromise(true); } function constructModalConfig(workerNodesList) { formModel.original_node_count = workerNodesList.length; formModel.node_count = workerNodesList.length; return { title: gettext('Resize Cluster'), schema: { type: 'object', properties: { 'node_count': { type: 'number', minimum: 1 }, 'nodes_to_remove': { type: 'array', items: { type: 'string' }, minItems: 0 // Must be specified to avoid obsolete validation errors } } }, form: [ { key: 'node_count', title: gettext('Node Count'), placeholder: gettext('The cluster node count.'), required: true, validationMessage: { 101: gettext('You cannot resize to less than a single Worker Node.') }, onChange: validateNodeRemovalCount }, { key: 'nodes_to_remove', type: 'checkboxes', title: gettext('Choose nodes to remove (Optional)'), titleMap: generateNodesTitleMap(workerNodesList), condition: 'model.node_count < model.original_node_count', onChange: validateNodeRemovalCount, validationMessage: { nodeRemovalCountExceeded: gettext('You may only select as many nodes ' + 'as you are reducing the original node count by.') } } ], model: formModel }; } // Invalid when user selects more Worker Nodes (checkboxes) than is allowed to be removed function validateNodeRemovalCount() { var selectedNodesCount = formModel.nodes_to_remove ? formModel.nodes_to_remove.length : 0; var maximumNodesCount = formModel.original_node_count - formModel.node_count; if (selectedNodesCount <= maximumNodesCount) { broadcastNodeRemovalValid(); } else { broadcastNodeRemovalInvalid(); } function broadcastNodeRemovalInvalid() { $rootScope.$broadcast('schemaForm.error.nodes_to_remove', 'nodeRemovalCountExceeded', false); } function broadcastNodeRemovalValid() { $rootScope.$broadcast('schemaForm.error.nodes_to_remove', 'nodeRemovalCountExceeded', true); } } function getFormModelDefaults() { return { original_node_count: null, node_count: null, nodes_to_remove: [] }; } function generateNodesTitleMap(nodesList) { return nodesList.map(function(node) { return { value: node.id, name: node.name }; }); } function onModalSubmit() { var postRequestObject = { node_count: formModel.node_count, nodegroup: 'default-worker' }; if (formModel.node_count < formModel.original_node_count && formModel.nodes_to_remove && formModel.nodes_to_remove.length > 0) { postRequestObject.nodes_to_remove = formModel.nodes_to_remove; } return magnum.resizeCluster(formModel.id, postRequestObject) .then(onRequestSuccess); } function onRequestSuccess() { toast.add('success', gettext('Cluster is being resized.')); return actionResult.getActionResult() .updated(resourceType, formModel.id) .result; } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.spec.js0000664000175000017500000000766500000000000033330 0ustar00zuulzuul00000000000000/** * Copyright 2017 NEC 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'; describe('horizon.dashboard.container-infra.clusters.resize.service', function() { var service, $scope, $q, deferred, magnum, spinnerModal, modalConfig; var selected = { id: 1 }; var modal = { open: function(config) { deferred = $q.defer(); deferred.resolve(config); modalConfig = config; return deferred.promise; } }; /////////////////// beforeEach(module('horizon.app.core')); beforeEach(module('horizon.framework')); beforeEach(module('horizon.dashboard.container-infra.clusters')); beforeEach(module(function($provide) { $provide.value('horizon.framework.widgets.form.ModalFormService', modal); })); beforeEach(inject(function($injector, _$rootScope_, _$q_) { $q = _$q_; $scope = _$rootScope_.$new(); service = $injector.get( 'horizon.dashboard.container-infra.clusters.resize.service'); magnum = $injector.get('horizon.app.core.openstack-service-api.magnum'); spinnerModal = $injector.get('horizon.framework.widgets.modal-wait-spinner.service'); spyOn(spinnerModal, 'showModalSpinner').and.callFake(function() {}); spyOn(spinnerModal, 'hideModalSpinner').and.callFake(function() {}); deferred = $q.defer(); deferred.resolve({data: {uuid: '1'}}); spyOn(magnum, 'resizeCluster').and.returnValue(deferred.promise); spyOn(modal, 'open').and.callThrough(); })); it('should check the policy if the user is allowed to update cluster', function() { var allowed = service.allowed(); expect(allowed).toBeTruthy(); }); it('should open the modal, hide the loading spinner and check the form model', inject(function($timeout) { var mockWorkerNodes = [{id: "456", name: "Worker Node 1"}]; deferred = $q.defer(); deferred.resolve({data: {cluster: {}, worker_nodes: mockWorkerNodes}}); spyOn(magnum, 'getClusterNodes').and.returnValue(deferred.promise); service.perform(selected, $scope); $timeout(function() { expect(modal.open).toHaveBeenCalled(); expect(spinnerModal.showModalSpinner).toHaveBeenCalled(); expect(spinnerModal.hideModalSpinner).toHaveBeenCalled(); // Check if the form's model skeleton is correct expect(modalConfig.model.id).toBe(selected.id); expect(modalConfig.model.original_node_count).toBe(mockWorkerNodes.length); expect(modalConfig.model.node_count).toBe(mockWorkerNodes.length); expect(modalConfig.title).toBeDefined(); expect(modalConfig.schema).toBeDefined(); expect(modalConfig.form).toBeDefined(); }, 0); $timeout.flush(); $scope.$apply(); })); it('should not open the modal due to a request error and should hide the loading spinner', inject(function($timeout) { deferred = $q.defer(); deferred.reject(); spyOn(magnum, 'getClusterNodes').and.returnValue(deferred.promise); service.perform(selected, $scope); $timeout(function() { expect(modal.open).not.toHaveBeenCalled(); expect(spinnerModal.showModalSpinner).toHaveBeenCalled(); expect(spinnerModal.hideModalSpinner).toHaveBeenCalled(); }, 0); $timeout.flush(); $scope.$apply(); })); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9882708 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/rolling-upgrade/0000775000175000017500000000000000000000000030655 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020600000000000011453 xustar0000000000000000112 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/rolling-upgrade/upgrade.service.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/rolling-upgrade/upgrade.service.0000664000175000017500000001644400000000000033755 0ustar00zuulzuul00000000000000/** * Copyright 2017 NEC 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 overview * @name horizon.dashboard.container-infra.clusters.rolling-upgrade.service * @description Service for the container-infra cluster rolling upgrade modal. * Allows user to choose a Cluster template with higher version number the * cluster should upgrade to. Optionally, the number of nodes in a single * upgrade batch can be chosen. */ angular .module('horizon.dashboard.container-infra.clusters') .factory('horizon.dashboard.container-infra.clusters.rolling-upgrade.service', upgradeService); upgradeService.$inject = [ '$q', '$document', 'horizon.app.core.openstack-service-api.magnum', 'horizon.framework.util.actions.action-result.service', 'horizon.framework.util.i18n.gettext', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.form.ModalFormService', 'horizon.framework.widgets.toast.service', 'horizon.framework.widgets.modal-wait-spinner.service', 'horizon.dashboard.container-infra.clusters.resourceType', 'horizon.dashboard.container-infra.utils.service' ]; function upgradeService( $q, $document, magnum, actionResult, gettext, $qExtensions, modal, toast, spinnerModal, resourceType, utils ) { var modalConfig, formModel, isLatestTemplate, clusterTemplatesTitleMap; var service = { perform: perform, allowed: allowed }; return service; ////////////// function perform(selected, $scope) { // Simulate a click to dismiss opened action dropdown, otherwise it could interfere with // correct behaviour of other dropdowns. $document[0].body.click(); var deferred = $q.defer(); spinnerModal.showModalSpinner(gettext('Loading')); var activeTemplateVersion, activeTemplateId; magnum.getCluster(selected.id).then(function(response) { formModel = getFormModelDefaults(); formModel.id = selected.id; clusterTemplatesTitleMap = [ // Default should have 2 optiosn (1+1 the default) expect(modalConfig.form[0].titleMap.length).toBe(2); }, 0); $timeout.flush(); $scope.$apply(); })); it('should not open the modal due to a request error and should hide the loading spinner', inject(function($timeout) { deferred = $q.defer(); deferred.reject(); spyOn(magnum, 'getCluster').and.returnValue(deferred.promise); spyOn(magnum, 'getClusterTemplates').and.returnValue(deferred.promise); service.perform(selected, $scope); $timeout(function() { expect(modal.open).not.toHaveBeenCalled(); expect(spinnerModal.showModalSpinner).toHaveBeenCalled(); expect(spinnerModal.hideModalSpinner).toHaveBeenCalled(); }, 0); $timeout.flush(); $scope.$apply(); })); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9882708 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/rotate-certificate/0000775000175000017500000000000000000000000031340 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022400000000000011453 xustar0000000000000000126 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/rotate-certificate/rotate-certificate.service.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/rotate-certificate/rotate-certif0000664000175000017500000000451600000000000034041 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. */ (function() { 'use strict'; /** * @ngdoc overview * @name horizon.dashboard.container-infra.clusters.rotate-certificate.service * @description Service for the container-infra cluster rotate certificate */ angular .module('horizon.dashboard.container-infra.clusters') .factory( 'horizon.dashboard.container-infra.clusters.rotate-certificate.service', rotateCertificateService); rotateCertificateService.$inject = [ 'horizon.app.core.openstack-service-api.magnum', 'horizon.dashboard.container-infra.clusters.resourceType', 'horizon.framework.util.actions.action-result.service', 'horizon.framework.util.i18n.gettext', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.toast.service' ]; function rotateCertificateService( magnum, resourceType, actionResult, gettext, $qExtensions, toast ) { var message = { success: gettext('Certificate %s was successfully rotated.') }; var service = { initAction: initAction, perform: perform, allowed: allowed }; return service; ////////////// function initAction() { } function perform(selected) { // rotate certificate return magnum.rotateCertificate(selected.id).then(success); } function success(response) { response.data.id = response.data.uuid; toast.add('success', interpolate(message.success, [response.data.id])); var result = actionResult.getActionResult() .deleted(resourceType, response.data.id); return result.result; } function allowed() { // NOTE(flwang): So far, Magnum doesn't support rotate certificate, so // let's disable it now until we can support it. return $qExtensions.booleanAsPromise(false); } } })(); ././@PaxHeader0000000000000000000000000000023100000000000011451 xustar0000000000000000131 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/rotate-certificate/rotate-certificate.service.spec.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/rotate-certificate/rotate-certif0000664000175000017500000000321600000000000034035 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. */ (function() { 'use strict'; describe('horizon.dashboard.container-infra.clusters.rotate-certificate.service', function() { var $q, service, selected, magnum, deferred; beforeEach(module('horizon.app.core')); beforeEach(module('horizon.framework')); beforeEach(module('horizon.dashboard.container-infra.clusters')); beforeEach(inject(function($injector, _$q_) { $q = _$q_; service = $injector.get( 'horizon.dashboard.container-infra.clusters.rotate-certificate.service'); magnum = $injector.get('horizon.app.core.openstack-service-api.magnum'); deferred = $q.defer(); deferred.resolve({}); spyOn(magnum, 'rotateCertificate').and.returnValue(deferred.promise); })); it('should check the policy', function() { var allowed = service.allowed(); expect(allowed).toBeTruthy(); }); it('should get magnum.rotatecertificate', function() { selected = { id: '1' }; service.initAction(); service.perform(selected); expect(magnum.rotateCertificate).toHaveBeenCalled(); }); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9882708 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/show-certificate/0000775000175000017500000000000000000000000031022 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022000000000000011447 xustar0000000000000000122 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/show-certificate/show-certificate.service.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/show-certificate/show-certificat0000664000175000017500000000406100000000000034041 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. */ (function() { 'use strict'; /** * @ngdoc overview * @name horizon.dashboard.container-infra.clusters.show-certificate.service * @description Service for the container-infra cluster show certificate modal */ angular .module('horizon.dashboard.container-infra.clusters') .factory( 'horizon.dashboard.container-infra.clusters.show-certificate.service', showCertificateService); showCertificateService.$inject = [ 'horizon.app.core.openstack-service-api.magnum', 'horizon.dashboard.container-infra.clusters.resourceType', 'horizon.framework.util.actions.action-result.service', 'horizon.framework.util.file.text-download', 'horizon.framework.util.q.extensions' ]; function showCertificateService( magnum, resourceType, actionResult, textDownload, $qExtensions ) { var service = { initAction: initAction, perform: perform, allowed: allowed }; return service; ////////////// function initAction() { } function perform(selected) { // get certificate return magnum.showCertificate(selected.id).then(function(response) { textDownload.downloadTextFile(response.data.pem, selected.name + "_ca.pem"); response.data.id = response.data.uuid; var result = actionResult.getActionResult() .created(resourceType, response.data.id); return result.result; }); } function allowed() { return $qExtensions.booleanAsPromise(true); } } })(); ././@PaxHeader0000000000000000000000000000022500000000000011454 xustar0000000000000000127 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/show-certificate/show-certificate.service.spec.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/show-certificate/show-certificat0000664000175000017500000000326000000000000034041 0ustar00zuulzuul00000000000000/** * (c) Copyright 2016 NEC 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'; describe('horizon.dashboard.container-infra.clusters.show-certificate.service', function() { var $q, service, selected, magnum, deferred; beforeEach(module('horizon.app.core')); beforeEach(module('horizon.framework')); beforeEach(module('horizon.dashboard.container-infra.clusters')); beforeEach(inject(function($injector, _$q_) { $q = _$q_; service = $injector.get( 'horizon.dashboard.container-infra.clusters.show-certificate.service'); magnum = $injector.get('horizon.app.core.openstack-service-api.magnum'); deferred = $q.defer(); deferred.resolve({}); spyOn(magnum, 'showCertificate').and.returnValue(deferred.promise); })); it('should check the policy', function() { var allowed = service.allowed(); expect(allowed).toBeTruthy(); }); it('should get magnum.showcertificate', function() { selected = { id: '1' }; service.initAction(); service.perform(selected); expect(magnum.showCertificate).toHaveBeenCalled(); }); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9882708 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/0000775000175000017500000000000000000000000031002 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000023100000000000011451 xustar0000000000000000131 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificate-modal.controller.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificat0000664000175000017500000000277600000000000034014 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. */ (function() { 'use strict'; /** * @ngdoc controller * @name horizon.dashboard.container-infra.clusters.signCertificateController * @ngController * * @description * Controller for the container-infra cluster in sign certificate modal */ angular .module('horizon.dashboard.container-infra.clusters') .controller( 'horizon.dashboard.container-infra.clusters.signCertificateController', signCertificateController); signCertificateController.$inject = [ 'horizon.app.core.openstack-service-api.magnum', 'horizon.dashboard.container-infra.clusters.sign-certificate-model' ]; function signCertificateController(magnum, model) { var ctrl = this; ctrl.model = model; ctrl.form = null; ctrl.title = gettext("CSR"); magnum.getCluster(model.newCertificateSpec.cluster_uuid).success(onGetCluster); function onGetCluster(response) { ctrl.model.cluster_name = response.name; } } })(); ././@PaxHeader0000000000000000000000000000022000000000000011447 xustar0000000000000000122 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificate-modal.html 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificat0000664000175000017500000000210400000000000033775 0ustar00zuulzuul00000000000000
././@PaxHeader0000000000000000000000000000021600000000000011454 xustar0000000000000000120 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificate-model.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificat0000664000175000017500000000331400000000000034001 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. */ (function() { 'use strict'; angular .module('horizon.dashboard.container-infra.clusters') .factory('horizon.dashboard.container-infra.clusters.sign-certificate-model', CertificateModel); CertificateModel.$inject = [ 'horizon.app.core.openstack-service-api.magnum' ]; function CertificateModel(magnum) { var model = { newCertificateSpec: {}, cluster_name: "", // API methods init: init, signCertificate: signCertificate }; function init(clusterId) { // Reset the new Certificate spec model.newCertificateSpec = { cluster_uuid: clusterId, csr: "" }; model.cluster_name = ""; } function signCertificate() { var finalSpec = angular.copy(model.newCertificateSpec); cleanNullProperties(finalSpec); return magnum.signCertificate(finalSpec); } function cleanNullProperties(finalSpec) { // Initially clean fields that don't have any value. for (var key in finalSpec) { if (finalSpec.hasOwnProperty(key) && finalSpec[key] === null) { delete finalSpec[key]; } } } return model; } })(); ././@PaxHeader0000000000000000000000000000022300000000000011452 xustar0000000000000000125 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificate-model.spec.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificat0000664000175000017500000000305400000000000034002 0ustar00zuulzuul00000000000000/** * (c) Copyright 2016 NEC 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'; describe('horizon.dashboard.container-infra.cluster-templates.model', function() { var certificate; beforeEach(module('horizon.dashboard.container-infra.clusters')); beforeEach(inject(function($injector) { certificate = $injector.get( 'horizon.dashboard.container-infra.clusters.sign-certificate-model'); })); it('should be init CertificateModel', function() { var clusterId = 1; certificate.init(clusterId); expect(certificate.newCertificateSpec.cluster_uuid).toEqual(clusterId); }); it('signCertificate', inject(function($q, $injector) { var magnum = $injector.get('horizon.app.core.openstack-service-api.magnum'); var deferred = $q.defer(); spyOn(magnum, 'signCertificate').and.returnValue(deferred.promise); certificate.init(null); certificate.signCertificate(); expect(magnum.signCertificate).toHaveBeenCalled(); })); }); })(); ././@PaxHeader0000000000000000000000000000022000000000000011447 xustar0000000000000000122 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificate.service.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificat0000664000175000017500000000564300000000000034010 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. */ (function() { 'use strict'; /** * @ngdoc overview * @name horizon.dashboard.container-infra.clusters.sign-certificate.service * @description Service for the container-infra cluster sign certificate modal */ angular .module('horizon.dashboard.container-infra.clusters') .factory( 'horizon.dashboard.container-infra.clusters.sign-certificate.service', signCertificateService); signCertificateService.$inject = [ '$uibModal', 'horizon.app.core.openstack-service-api.magnum', 'horizon.dashboard.container-infra.clusters.basePath', 'horizon.dashboard.container-infra.clusters.resourceType', 'horizon.dashboard.container-infra.clusters.sign-certificate-model', 'horizon.framework.util.actions.action-result.service', 'horizon.framework.util.file.text-download', 'horizon.framework.util.i18n.gettext', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.toast.service' ]; function signCertificateService( $uibModal, magnum, basePath, resourceType, model, actionResult, textDownload, gettext, $qExtensions, toast ) { var message = { success: gettext('Certificate %s was successfully signed.') }; var service = { initAction: initAction, perform: perform, allowed: allowed }; return service; ////////////// function initAction() { } function signCertificateModal() { var localSpec = { backdrop: 'static', controller: 'horizon.dashboard.container-infra.clusters.signCertificateController as ctrl', templateUrl: basePath + 'sign-certificate/sign-certificate-modal.html' }; return $uibModal.open(localSpec).result; } function perform(selected) { model.init(selected.id); return signCertificateModal().then(submit); } function allowed() { return $qExtensions.booleanAsPromise(true); } function submit() { return model.signCertificate().then(success); } function success(response) { textDownload.downloadTextFile(response.data.pem, model.cluster_name + "_cert.pem"); response.data.id = response.data.uuid; toast.add('success', interpolate(message.success, [response.data.id])); var result = actionResult.getActionResult() .created(resourceType, response.data.id); return result.result; } } })(); ././@PaxHeader0000000000000000000000000000022500000000000011454 xustar0000000000000000127 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificate.service.spec.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificat0000664000175000017500000000453100000000000034003 0ustar00zuulzuul00000000000000/** * (c) Copyright 2016 NEC 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'; describe('horizon.dashboard.container-infra.clusters.sign-certificate.service', function() { var $q, service, textDownload, deferred, fakeDeferred, model; var fakeModal = { result: { then: function(callback) { callback('test'); } } }; var fakesignCertificate = { data:{ pem: "" } }; beforeEach(module('horizon.app.core')); beforeEach(module('horizon.framework')); beforeEach(module('horizon.dashboard.container-infra.clusters')); beforeEach(inject(function($injector, _$rootScope_, _$q_, $uibModal) { $q = _$q_; service = $injector.get( 'horizon.dashboard.container-infra.clusters.sign-certificate.service'); textDownload = $injector.get('horizon.framework.util.file.text-download'); deferred = $q.defer(); deferred.resolve({data: {uuid: 1}}); spyOn(textDownload, 'downloadTextFile').and.returnValue(deferred.promise); model = $injector.get('horizon.dashboard.container-infra.clusters.sign-certificate-model'); fakeDeferred = $q.defer(); fakeDeferred.resolve(fakesignCertificate); spyOn(model, 'signCertificate').and.returnValue(fakeDeferred.promise); spyOn($uibModal, 'open').and.returnValue(fakeModal); })); it('should pass allow()', function() { var allowed = service.allowed(); expect(allowed).toBeTruthy(); }); it('should pass submit() and success()', inject(function($timeout) { var selected = {id : 1}; service.initAction(); service.perform(selected); $timeout.flush(); expect(model.signCertificate).toHaveBeenCalled(); expect(textDownload.downloadTextFile).toHaveBeenCalled(); })); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1627552381.9922705 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/workflow/0000775000175000017500000000000000000000000027434 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/workflow/advanced.help.html0000664000175000017500000000061500000000000033020 0ustar00zuulzuul00000000000000

Additional Labels

Specify additional kube_labels to apply to the cluster or override labels set by the cluster template. Overriding labels set by the cluster template may result in your cluster being misconfigured, unstable or unable to be created.

The key=value pair string is case insensitive and will be converted to lower case.

././@PaxHeader0000000000000000000000000000021300000000000011451 xustar0000000000000000117 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/workflow/cluster-template.controller.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/workflow/cluster-template.contro0000664000175000017500000001123400000000000034155 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. */ (function() { 'use strict'; /** * @ngdoc controller * @name clusterTemplateController * @ngController * * @description * Controller to show cluster template info for info step in workflow */ angular .module('horizon.dashboard.container-infra.clusters') .controller( 'horizon.dashboard.container-infra.clusters.workflow.clusterTemplateController', clusterTemplateController); clusterTemplateController.$inject = [ '$scope', 'horizon.app.core.openstack-service-api.magnum' ]; function clusterTemplateController($scope, magnum) { var ctrl = this; init(); function init() { ctrl.clusterTemplate = { name: "", id: "", coe: "", image_id: "", public: "", registry_enabled: "", tls_disabled: "", apiserver_port: "", keypair_id: "", docker_volume_size: "" }; } loadClusterTemplate($scope.model.cluster_template_id); function loadClusterTemplate(id, old) { if (id !== old) { if (id === '' || typeof id === 'undefined') { $scope.model.keypair = ""; init(); } else { magnum.getClusterTemplate(id).then(onGetClusterTemplate); } } } function onGetClusterTemplate(response) { var MODEL_DEFAULTS = $scope.model.DEFAULTS; var template = response.data; ctrl.clusterTemplate = template; // master_lb_enabled=false? Only allow a single Master Node $scope.model.isSingleMasterNode = template.hasOwnProperty('master_lb_enabled') && template.master_lb_enabled === false; $scope.model.master_count = $scope.model.isSingleMasterNode ? 1 : $scope.model.master_count; // Only alter the model if the value is default and exists in the response // Warning: This is loosely coupled with default states. // Sets response.key -> model.key setResponseAsDefaultIfUnset('keypair_id', 'keypair'); setResponseAsDefaultIfUnset('master_count', 'master_count'); setResponseAsDefaultIfUnset('master_flavor_id', 'master_flavor_id'); setResponseAsDefaultIfUnset('node_count', 'node_count'); setResponseAsDefaultIfUnset('flavor_id', 'flavor_id'); if (template.floating_ip_enabled !== null) { $scope.model.floating_ip_enabled = template.floating_ip_enabled; } if (!template.labels) { return; } $scope.model.templateLabels = template.labels; // If a template label exists as a field on the form -> Set it as a default setLabelResponseAsDefault('auto_scaling_enabled', 'auto_scaling_enabled', true); setLabelResponseAsDefault('auto_healing_enabled', 'auto_healing_enabled', true); // Set default `ingress_controller` based on its label if (template.labels.ingress_controller !== null && $scope.model.ingressControllers && $scope.model.ingressControllers.length > 0) { $scope.model.ingress_controller = MODEL_DEFAULTS.ingress_controller; $scope.model.ingressControllers.forEach(function(controller) { if (controller.labels && controller.labels.ingress_controller && controller.labels.ingress_controller === template.labels.ingress_controller) { $scope.model.ingress_controller = controller; } }); } function setResponseAsDefaultIfUnset(responseKey, modelKey) { if ($scope.model[modelKey] === MODEL_DEFAULTS[modelKey] && template[responseKey] !== null) { $scope.model[modelKey] = template[responseKey]; } } function setLabelResponseAsDefault(labelKey, modelKey, isValueBoolean) { if (template.labels[labelKey] !== null) { $scope.model[modelKey] = isValueBoolean ? template.labels[labelKey] === 'true' : template.labels[labelKey]; } } } function watchClusterTemplateId() { return $scope.model.cluster_template_id; } var clusterTemplateWatcher = $scope.$watch( watchClusterTemplateId, loadClusterTemplate, true ); $scope.$on('$destroy', function() { clusterTemplateWatcher(); }); } })(); ././@PaxHeader0000000000000000000000000000022000000000000011447 xustar0000000000000000122 path=magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/workflow/cluster-template.controller.spec.js 22 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/workflow/cluster-template.contro0000664000175000017500000002241400000000000034157 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. */ (function() { 'use strict'; describe('horizon.dashboard.container-infra.clusters', function() { var magnum, controller, $scope, $q, deferred, templateResponse, MODEL_DEFAULTS; function getModelDefaults() { return { // Props used by the form name: '', cluster_template_id: '', availability_zone: '', keypair: '', addons: [], master_count: null, master_flavor_id: '', node_count: null, flavor_id: '', auto_scaling_enabled: false, min_node_count: null, max_node_count: null, create_network: false, fixed_network: '', floating_ip_enabled: false, ingress_controller: '', auto_healing_enabled: true, labels: '', override_labels: false, // Utility properties (not actively used in the form, // populated dynamically) id: null, templateLabels: null, ingressControllers: null, isSingleMasterNode: false }; } beforeEach(module('horizon.framework')); beforeEach(module('horizon.app.core.openstack-service-api')); beforeEach(module('horizon.dashboard.container-infra.clusters')); beforeEach(inject(function ($injector, _$rootScope_, _$q_) { $q = _$q_; $scope = _$rootScope_.$new(); $scope.model = getModelDefaults(); MODEL_DEFAULTS = getModelDefaults(); // Trigger the controller's business logic $scope.model.cluster_template_id = '1'; $scope.model.DEFAULTS = MODEL_DEFAULTS; templateResponse = { "coe": "kubernetes", "docker_storage_driver": "overlay2", "docker_volume_size": 20, "external_network_id": "f10ad6de-a26d-4c29-8c64-2a7418d47f8f", "fixed_network": null, "fixed_subnet": null, "flavor_id": "c1.c4r8", "floating_ip_enabled": false, "id": "6f3869a2-4cff-4e59-9e8e-ee03efa26688", "image_id": "2beb7301-e8c8-4ac1-a321-c63e919094a9", "insecure_registry": null, "keypair_id": null, "labels": { "auto_healing_controller": "magnum-auto-healer", "auto_healing_enabled": "true", "auto_scaling_enabled": "false", "cloud_provider_enabled": "true", "cloud_provider_tag": "1.14.0-catalyst", "container_infra_prefix": "docker.io/catalystcloud/", "etcd_volume_size": "20", "heat_container_agent_tag": "stein-dev", "ingress_controller": "octavia", "k8s_keystone_auth_tag": "v1.15.0", "keystone_auth_enabled": "true", "kube_dashboard_enabled": "true", "kube_tag": "v1.15.6", "magnum_auto_healer_tag": "v1.15.0-catalyst.0", "master_lb_floating_ip_enabled": "false", "octavia_ingress_controller_tag": "1.14.0-catalyst", "prometheus_monitoring": "true" }, "master_flavor_id": "c1.c2r4", "master_lb_enabled": true, "name": "kubernetes-v1.15.6-prod-20191129", "network_driver": "calico", "no_proxy": null, "project_id": "94b566de52f9423fab80ceee8c0a4a23", "public": true, "registry_enabled": false, "server_type": "vm", "tls_disabled": false, "user_id": "098b4de3d94649f8b9ae5bf5ee59451c", "volume_driver": "cinder" }; magnum = $injector.get('horizon.app.core.openstack-service-api.magnum'); controller = $injector.get('$controller'); deferred = $q.defer(); deferred.resolve({data: templateResponse}); spyOn(magnum, 'getClusterTemplate').and.returnValue(deferred.promise); createController($scope); })); function createController($scoped) { return controller( 'horizon.dashboard.container-infra.clusters.workflow.clusterTemplateController', { $scope: $scoped, magnum: magnum }); } it('should load cluster template', function() { expect(magnum.getClusterTemplate).toHaveBeenCalled(); }); it('should override some model default properties by values from ' + 'retrieved cluster template', function() { templateResponse.keypair_id = 1; templateResponse.master_count = 1; templateResponse.master_flavor_id = 'ABC'; templateResponse.node_count = 1; templateResponse.flavor_id = 'ABC'; var model = $scope.model; model.cluster_template_id = '99'; // Triggers bussines logic revalidation $scope.$apply(); expect(model.keypair).toBe(1); expect(model.master_count).toBe(1); expect(model.master_flavor_id).toEqual('ABC'); expect(model.node_count).toBe(1); expect(model.flavor_id).toEqual('ABC'); }); it('should not override some non-default model properties by values ' + 'from retrieved cluster template', function() { var model = $scope.model; model.keypair = 99; model.master_count = 99; model.master_flavor_id = 'XYZ'; model.node_count = 99; model.flavor_id = 'XYZ'; templateResponse.keypair_id = 1; templateResponse.master_count = 1; templateResponse.master_flavor_id = 'ABC'; templateResponse.node_count = 1; templateResponse.flavor_id = 'ABC'; model.cluster_template_id = '99'; // Triggers bussines logic revalidation $scope.$apply(); expect(model.keypair).toBe(99); expect(model.master_count).toBe(99); expect(model.master_flavor_id).toEqual('XYZ'); expect(model.node_count).toBe(99); expect(model.flavor_id).toEqual('XYZ'); }); it('should set number of Master Nodes to 1 if the cluster template ' + 'response contains negative `master_lb_enabled` flag', function() { $scope.model.master_count = 99; templateResponse.master_lb_enabled = false; $scope.model.cluster_template_id = '99'; // Triggers bussines logic revalidation $scope.$apply(); expect($scope.model.master_count).toBe(1); $scope.model.master_count = MODEL_DEFAULTS.master_count; $scope.model.cluster_template_id = '999'; // Triggers bussines logic revalidation $scope.$apply(); expect($scope.model.master_count).toBe(1); }); it('should not process labels if they are not available in the cluster ' + 'template response', function() { templateResponse.labels = null; $scope.model.labels = MODEL_DEFAULTS.labels; $scope.model.cluster_template_id = '99'; // Triggers bussines logic revalidation $scope.$apply(); expect($scope.model.labels).toEqual(MODEL_DEFAULTS.labels); }); it('should always override some model properties by values from ' + 'retrieved cluster template', function() { $scope.model.floating_ip_enabled = !MODEL_DEFAULTS.floating_ip_enabled; templateResponse.floating_ip_enabled = !$scope.model.floating_ip_enabled; $scope.model.cluster_template_id = '99'; // Triggers bussines logic revalidation $scope.$apply(); expect($scope.model.floating_ip_enabled).toBe(templateResponse.floating_ip_enabled); }); it('should always override some model\'s properties by values from ' + 'retrieved cluster template\'s labels', function() { var model = $scope.model; model.auto_scaling_enabled = true; templateResponse.labels.auto_scaling_enabled = 'true'; model.auto_healing_enabled = true; templateResponse.labels.auto_healing_enabled = 'false'; model.cluster_template_id = '99'; // Triggers bussines logic revalidation $scope.$apply(); expect(model.auto_scaling_enabled).toBe(true); expect(model.auto_healing_enabled).toBe(false); }); it('should not fail if the cluster template response is empty', function() { templateResponse = {}; $scope.model.cluster_template_id = '99'; // Triggers bussines logic revalidation $scope.$apply(); }); it('should not fail if the cluster template\'s labels are empty', function() { templateResponse = {labels:{}}; $scope.model.cluster_template_id = '99'; // Triggers bussines logic revalidation $scope.$apply(); }); it('should set the correct Ingress Controller on the model based on the ' + 'label in cluster template response', function() { // Controllers retrieved from the API $scope.model.ingressControllers = [ { name: 'Controller1', labels: { ingress_controller: 'c1'}}, { name: 'Controller2', labels: { ingress_controller: 'c2'}}, { name: 'Controller3', labels: { ingress_controller: 'c3'}}, ]; templateResponse.labels.ingress_controller = 'c2'; $scope.model.cluster_template_id = '99'; // Triggers bussines logic revalidation $scope.$apply(); expect($scope.model.ingress_controller.labels.ingress_controller).toBe('c2'); }); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/workflow/cluster-template.html0000664000175000017500000000244300000000000033617 0ustar00zuulzuul00000000000000
Cluster Template Detail
Name
{$ ctrl.clusterTemplate.name|noName $}
ID
{$ ctrl.clusterTemplate.id $}
COE
{$ ctrl.clusterTemplate.coe $}
Image ID
{$ ctrl.clusterTemplate.image_id $}
Keypair
{$ ctrl.clusterTemplate.keypair_id|noValue $}
Docker Volume Size
{$ ctrl.clusterTemplate.docker_volume_size|gb|noValue $}
Public
{$ ctrl.clusterTemplate.public $}
Registry Enabled
{$ ctrl.clusterTemplate.registry_enabled $}
TLS Disabled
{$ ctrl.clusterTemplate.tls_disabled $}
API Server Port
{$ ctrl.clusterTemplate.apiserver_port|noValue $}
././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/workflow/details.help.html0000664000175000017500000000034500000000000032700 0ustar00zuulzuul00000000000000

Addon software

Any addon software selected will be installed at the latest supported version when the cluster is deployed, but will not be upgraded automatically by rolling upgrades.

././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/workflow/management.help.html0000664000175000017500000000041200000000000033362 0ustar00zuulzuul00000000000000

Security Updates

Please note that updates may cause application downtime if workloads deployed to Kubernetes are not following the best practices outlined in the documentation (for example, not using multiple replicas).

././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/workflow/network.help.html0000664000175000017500000000100200000000000032733 0ustar00zuulzuul00000000000000

Cluster API

Making the Kubernetes API accessible from the private network only is the most secure option (the default), but access will be limited to compute instances on the same private network or a VPN to that network.

Making the Kubernetes API accessible from anywhere on the public internet is convenient, but may represent a security risk. [When selecting this option, it is recommended to limit access to a trusted IP address range.]

././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/workflow/size.help.html0000664000175000017500000000123100000000000032220 0ustar00zuulzuul00000000000000

Auto Scaling

If enabled, the minimum and maximum number of worker nodes must be specified.

Auto scaling requires the use of CPU and memory limits on the resource definition of Pods.

If Kubernetes is unable to schedule a Pod due to insuficient CPU or memory in the cluster, a worker node will be added, as long as the maximum number of worker nodes has not been reached.

If the aggregate resource limits of all existing Pods is lower than 50% of the cluster capacity, a worker node will be removed, as long as the minimum number of worker nodes has not been reached.

././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1627552348.0 magnum-ui-6.0.1/magnum_ui/static/dashboard/container-infra/clusters/workflow/workflow.service.js0000664000175000017500000005560100000000000033312 0ustar00zuulzuul00000000000000/** * Copyright 2015 Cisco Systems, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; /** * @ngdoc overview * @name horizon.dashboard.container-infra.clusters.workflow * @ngModule * * @description * Provides business logic for Cluster creation workflow, including data model, * UI form schema and configuration, fetching and processing of required data. */ angular .module('horizon.dashboard.container-infra.clusters') .factory( 'horizon.dashboard.container-infra.clusters.workflow', ClusterWorkflow); ClusterWorkflow.$inject = [ '$q', 'horizon.dashboard.container-infra.basePath', 'horizon.framework.util.i18n.gettext', 'horizon.app.core.openstack-service-api.magnum', 'horizon.app.core.openstack-service-api.neutron', 'horizon.app.core.openstack-service-api.nova' ]; // comma-separated key=value with optional space after comma var REGEXP_KEY_VALUE = /^(\w+=[^,]+,?\s?)+$/; function ClusterWorkflow($q, basePath, gettext, magnum, neutron, nova) { var workflow = { init: init }; function init(title, $scope) { var schema, form; // Default