././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0906096 magnum_ui-16.0.0/0000775000175000017500000000000000000000000013602 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/.eslintrc0000664000175000017500000000306300000000000015430 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=1743591029.0 magnum_ui-16.0.0/.zuul.yaml0000664000175000017500000000034600000000000015546 0ustar00zuulzuul00000000000000- project: templates: - check-requirements - horizon-non-primary-django-jobs - horizon-nodejs-jobs - openstack-python3-jobs-horizon - publish-openstack-docs-pti - release-notes-jobs-python3 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591079.0 magnum_ui-16.0.0/AUTHORS0000664000175000017500000000542700000000000014662 0ustar00zuulzuul00000000000000Adrian Otto Akihiro Motoki Andreas Jaeger Andreas Jaeger Andrei Nistor Andrew Bogott Andrew Bonney Bharat Kunwar Bharat Kunwar Bradley Jones Cao Xuan Hoang Charles Short Corey Bryant Dale Smith Doug Hellmann Erik Olof Gunnar Andersson Feilong Wang Felipe Reyes Flavio Percoco Ghanshyam Mann Hervé Beraud Hongbin Lu Ian Wienand Ivan Kolodyazhny Jake Yip Jake Yip Kenji Ishii Mateusz Kowalski Md Safiyat Reza 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 niuke nizam pengyuesheng qingszhao ricolin ricolin shangxiaobj shu-mutou songwenping ting.wang wangqi wangqiangbj wu.shiming xiangxinyong xiaojueguan yangle zhangdebo ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/CONTRIBUTING.rst0000664000175000017500000000107200000000000016243 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=1743591079.0 magnum_ui-16.0.0/ChangeLog0000664000175000017500000005423200000000000015362 0ustar00zuulzuul00000000000000CHANGES ======= 16.0.0 ------ * reno: Update master for unmaintained/2023.1 * reno: Update master for unmaintained/zed * Fix resize for CAPI clusters * Bump hacking * Fix indexing into subnet list during cluster creation * Update master for stable/2024.2 * reno: Update master for unmaintained/yoga 15.0.0 ------ * Imported Translations from Zanata * Change floating\_ip to use master\_lb\_floating\_ip\_enabled * Workflow updates for Create Cluster * Restrict actions based on cluster state * Fix all lint warnings * Cluster Overview: Change columns and drawer items * Imported Translations from Zanata * Update master for stable/2024.1 14.0.0 ------ * Update python classifier in setup.cfg * Add dropdown list to select fixed subnet * Test 'trackBy' property in cluster template object * Drop use of features removed in Django 4.0 * Update master for stable/2023.2 13.0.0 ------ * remove unicode from code * Imported Translations from Zanata * Bump magnumclient to support cluster config * Imported Translations from Zanata * Add magnum cluster config support * Cleanup py27 support * sign-certificate-modal.controller.js: replace success() with then() * Update master for stable/2023.1 12.0.0 ------ * Fix tox * Imported Translations from Zanata * Switch to 2023.1 Python3 unit tests and generic template name * Update master for stable/zed * Imported Translations from Zanata 11.0.0 ------ * setup.cfg: Replace dashes by underscores * Migrate to AngularJS v1.8.2 * Use Horizon project template for nodejs jobs * Drop lower-constraints.txt and its testing * Address RemovedInDjango40Warning * Fixed Unit test for magnum-ui * Add Python3 zed unit tests * Update master for stable/yoga 10.0.0 ------ * Updating python testing classifier as per Yoga testing runtime * Remove references to sys.version\_info * Add Python3 yoga unit tests * Update master for stable/xena 9.0.0 ----- * Default \`floating\_ip\_enabled\` to true in cluster template * Update horizon nodejs template * Add overlay2 to Docker storage driver dropdown * Support zero workers nodes on Horizon dashboard * Remove hard\_limit check in dashboard * Add Python3 xena unit tests * Update master for stable/wallaby 8.0.0 ----- * Imported Translations from Zanata * Use TOX\_CONSTRAINTS\_FILE * Update lower-constraints for new pip * Imported Translations from Zanata * Add Python3 wallaby unit tests * Update master for stable/victoria * [goal] Migrate testing to ubuntu focal 7.0.0 ----- * Support enable/disable loadbalancer when creating cluster * [goal] Migrate testing to ubuntu focal * Fix py36 job setup * Imported Translations from Zanata * Imported Translations from Zanata * Fix npm jobs * drop mock from lower-constraints * Fix formatting issue in workflow message * Stop to use the \_\_future\_\_ module * Switch to newer openstackdocstheme and reno versions * Fix cluster resize * Show cluster health status * Imported Translations from Zanata * Imported Translations from Zanata * Add py38 package metadata * Imported Translations from Zanata * Add Python3 victoria unit tests * Update master 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=1743591029.0 magnum_ui-16.0.0/LICENSE0000664000175000017500000002363700000000000014622 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=1743591080.0906096 magnum_ui-16.0.0/PKG-INFO0000644000175000017500000000661400000000000014704 0ustar00zuulzuul00000000000000Metadata-Version: 2.1 Name: magnum-ui Version: 16.0.0 Summary: Magnum User Interface Home-page: https://docs.openstack.org/developer/magnum-ui/ Author: OpenStack Author-email: openstack-discuss@lists.openstack.org 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 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 License-File: LICENSE Requires-Dist: pbr!=2.1.0,>=2.0.0 Requires-Dist: python-magnumclient>=4.2.0 Requires-Dist: python-heatclient>=1.18.0 Requires-Dist: horizon>=17.1.0 ======================== 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=1743591029.0 magnum_ui-16.0.0/README.rst0000664000175000017500000000457700000000000015306 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=1743591029.0 magnum_ui-16.0.0/babel-django.cfg0000664000175000017500000000005400000000000016567 0ustar00zuulzuul00000000000000[python: **.py] [django: templates/**.html] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/babel-djangojs.cfg0000664000175000017500000000006100000000000017122 0ustar00zuulzuul00000000000000[javascript: **.js] [angular: **/static/**.html] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/bindep.txt0000664000175000017500000000031700000000000015605 0ustar00zuulzuul00000000000000# This is a cross-platform list tracking distribution packages needed for install and tests; # see https://docs.openstack.org/infra/bindep/ for additional information. libfontconfig1 [nodejs platform:dpkg] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0506108 magnum_ui-16.0.0/devstack/0000775000175000017500000000000000000000000015406 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/devstack/plugin.sh0000664000175000017500000000370000000000000017240 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=1743591029.0 magnum_ui-16.0.0/devstack/settings0000664000175000017500000000007600000000000017174 0ustar00zuulzuul00000000000000# settings file for magnum-ui plugin enable_service magnum-ui ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0546105 magnum_ui-16.0.0/doc/0000775000175000017500000000000000000000000014347 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/doc/Makefile0000664000175000017500000001270000000000000016007 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=1743591029.0 magnum_ui-16.0.0/doc/requirements.txt0000664000175000017500000000121300000000000017630 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>=2.2.1 # Apache-2.0 reno>=3.1.0 # Apache-2.0 sphinx>=2.0.0,!=2.1.0 # BSD sphinxcontrib-apidoc>=0.2.0 # BSD # NOTE: The following are required as horizon.test.settings loads it. ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0546105 magnum_ui-16.0.0/doc/source/0000775000175000017500000000000000000000000015647 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/doc/source/conf.py0000664000175000017500000002460500000000000017155 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. import os import sys import django 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 = 'Magnum UI' copyright = '2015, Cisco Systems, Inc.' # 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 = 'native' # 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 openstackdocs_repo_name = 'openstack/magnum-ui' openstackdocs_pdf_link = True openstackdocs_auto_name = False openstackdocs_bug_project = 'magnum-ui' openstackdocs_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 = [''] # 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', 'Magnum UI Documentation', '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', 'Magnum UI Documentation', 'Documentation for the Magnum UI plugin to the Openstack\ Dashboard (Horizon)', ['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', 'Horizon Documentation', '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 = 'Horizon' epub_author = 'OpenStack' epub_publisher = 'OpenStack' epub_copyright = '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=1743591080.0546105 magnum_ui-16.0.0/doc/source/configuration/0000775000175000017500000000000000000000000020516 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/doc/source/configuration/index.rst0000664000175000017500000000625300000000000022365 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=1743591080.0546105 magnum_ui-16.0.0/doc/source/contributor/0000775000175000017500000000000000000000000020221 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/doc/source/contributor/api.rst0000664000175000017500000000016500000000000021526 0ustar00zuulzuul00000000000000===================== Source Code Reference ===================== .. toctree:: :maxdepth: 1 :glob: api/* ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/doc/source/contributor/index.rst0000664000175000017500000000040300000000000022057 0ustar00zuulzuul00000000000000================= Contributor Guide ================= There is no topic specific to Magnum UI now. See `Horizon Developer Documents `__ ---- .. toctree:: :glob: :maxdepth: 1 api ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/doc/source/index.rst0000664000175000017500000000101100000000000017501 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=1743591080.0546105 magnum_ui-16.0.0/doc/source/install/0000775000175000017500000000000000000000000017315 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/doc/source/install/index.rst0000664000175000017500000000355100000000000021162 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/ ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0546105 magnum_ui-16.0.0/magnum_ui/0000775000175000017500000000000000000000000015563 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/__init__.py0000664000175000017500000000000000000000000017662 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0546105 magnum_ui-16.0.0/magnum_ui/api/0000775000175000017500000000000000000000000016334 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/api/__init__.py0000664000175000017500000000000000000000000020433 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/api/heat.py0000664000175000017500000000356600000000000017641 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 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/api/magnum.py0000664000175000017500000002415400000000000020200 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 from django.conf import settings from horizon import exceptions from horizon.utils.memoized import memoized from openstack_dashboard.api import base from magnumclient.common import utils as client_utils 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']) DEFAULT_API_VERSION = '1.10' 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, DEFAULT_API_VERSION) LOG.debug('Using magnum_api_version = %s.' % magnum_api_version) 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_config(request, id): cluster = magnumclient(request).clusters.get(id) if (hasattr(cluster, 'api_address') and cluster.api_address is None): LOG.debug(f"api_address for cluster {id} is not known yet.") cluster_template = magnumclient(request).cluster_templates.get( cluster.cluster_template_id ) opts = { 'cluster_uuid': cluster.uuid, } tls = {} if not cluster_template.tls_disabled: tls = client_utils.generate_csr_and_key() tls["ca"] = magnumclient(request).certificates.get(**opts).pem opts["csr"] = tls.pop("csr") tls["cert"] = magnumclient(request).certificates.create(**opts).pem config = client_utils.config_cluster( cluster, cluster_template, cfg_dir="", direct_output=True ) result = {"cluster_config": config} result.update(tls) return result 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) def nodegroup_list(request, cluster_id=None, limit=None, marker=None): return magnumclient(request).nodegroups.list(cluster_id, limit=limit, marker=marker) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0546105 magnum_ui-16.0.0/magnum_ui/api/rest/0000775000175000017500000000000000000000000017311 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/api/rest/__init__.py0000664000175000017500000000117700000000000021430 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/api/rest/magnum.py0000664000175000017500000003735100000000000021160 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 heatclient import exc as heatexc 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 ClusterConfig(generic.View): """API for retrieving config for a single cluster""" url_regex = r'container_infra/clusters/(?P[^/]+)/config$' @rest_utils.ajax() def get(self, request, cluster_id): """Get config for a specific cluster""" return magnum.cluster_config(request, cluster_id) @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() try: ngs = magnum.nodegroup_list(request, cluster_id) nodegroups = [n.to_dict() for n in ngs] except AttributeError: return HttpResponseNotFound() try: stack = heat.stack_get(request, cluster["stack_id"]) except heatexc.HTTPNotFound: stack = None worker_nodes = [] if stack: search_opts = {"name": "%s-" % stack.stack_name} servers = api.nova.server_list(request, search_opts=search_opts)[0] 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, "nodegroups": nodegroups} @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=1743591080.0546105 magnum_ui-16.0.0/magnum_ui/content/0000775000175000017500000000000000000000000017235 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/content/__init__.py0000664000175000017500000000000000000000000021334 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0586104 magnum_ui-16.0.0/magnum_ui/content/cluster_templates/0000775000175000017500000000000000000000000022774 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/content/cluster_templates/__init__.py0000664000175000017500000000000000000000000025073 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/content/cluster_templates/panel.py0000664000175000017500000000142500000000000024447 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 gettext_lazy as _ import horizon class ClusterTemplates(horizon.Panel): name = _("Cluster Templates") slug = "cluster_templates" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/content/cluster_templates/tests.py0000664000175000017500000000144300000000000024512 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/content/cluster_templates/urls.py0000664000175000017500000000204600000000000024335 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.urls import re_path from django.utils.translation import gettext_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 = [ re_path(r'^$', views.AngularIndexView.as_view(title=title, page_title=page_title), name='index'), ] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0586104 magnum_ui-16.0.0/magnum_ui/content/clusters/0000775000175000017500000000000000000000000021101 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/content/clusters/__init__.py0000664000175000017500000000000000000000000023200 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/content/clusters/panel.py0000664000175000017500000000162200000000000022553 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 gettext_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=1743591029.0 magnum_ui-16.0.0/magnum_ui/content/clusters/tests.py0000664000175000017500000000142200000000000022614 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/content/clusters/urls.py0000664000175000017500000000174200000000000022444 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.urls import re_path from django.utils.translation import gettext_lazy as _ from horizon.browsers import views from magnum_ui.content.clusters import panel title = _("Container Infra - Clusters") page_title = panel.Clusters.name urlpatterns = [ re_path(r'^$', views.AngularIndexView.as_view( title=title, page_title=page_title), name='index'), ] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0586104 magnum_ui-16.0.0/magnum_ui/content/container_infra/0000775000175000017500000000000000000000000022376 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/content/container_infra/__init__.py0000664000175000017500000000000000000000000024475 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0586104 magnum_ui-16.0.0/magnum_ui/content/container_infra/quotas/0000775000175000017500000000000000000000000023712 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/content/container_infra/quotas/__init__.py0000664000175000017500000000000000000000000026011 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/content/container_infra/quotas/panel.py0000664000175000017500000000133600000000000025366 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 gettext_lazy as _ import horizon class Quotas(horizon.Panel): name = _("Quotas") slug = "container_infra.quotas" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/content/container_infra/quotas/urls.py0000664000175000017500000000171300000000000025253 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.urls import re_path from django.utils.translation import gettext_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 = [ re_path(r'^$', views.AngularIndexView.as_view( title=title, page_title=page_title), name='index'), ] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0586104 magnum_ui-16.0.0/magnum_ui/enabled/0000775000175000017500000000000000000000000017155 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/enabled/_1370_project_container_infra_panel_group.py0000664000175000017500000000232400000000000027623 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 gettext_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=1743591029.0 magnum_ui-16.0.0/magnum_ui/enabled/_1371_project_container_infra_clusters_panel.py0000664000175000017500000000173400000000000030340 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/enabled/_1372_project_container_infra_cluster_templates_panel.py0000664000175000017500000000176600000000000032241 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/enabled/_2370_admin_container_infra_panel_group.py0000664000175000017500000000163300000000000027250 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 gettext_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=1743591029.0 magnum_ui-16.0.0/magnum_ui/enabled/_2371_admin_container_infra_quotas_panel.py0000664000175000017500000000171200000000000027427 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/enabled/__init__.py0000664000175000017500000000000000000000000021254 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/karma.conf.js0000664000175000017500000001257600000000000020153 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: ['Firefox'], browserNoActivityTimeout: 60000, reporters: ['progress', 'coverage', 'threshold'], plugins: [ 'karma-firefox-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 } }); }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591080.042611 magnum_ui-16.0.0/magnum_ui/locale/0000775000175000017500000000000000000000000017022 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591080.038611 magnum_ui-16.0.0/magnum_ui/locale/cs/0000775000175000017500000000000000000000000017427 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0586104 magnum_ui-16.0.0/magnum_ui/locale/cs/LC_MESSAGES/0000775000175000017500000000000000000000000021214 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/cs/LC_MESSAGES/django.po0000664000175000017500000000136100000000000023017 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/cs/LC_MESSAGES/djangojs.po0000664000175000017500000002735600000000000023370 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" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591080.038611 magnum_ui-16.0.0/magnum_ui/locale/de/0000775000175000017500000000000000000000000017412 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0586104 magnum_ui-16.0.0/magnum_ui/locale/de/LC_MESSAGES/0000775000175000017500000000000000000000000021177 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/de/LC_MESSAGES/django.po0000664000175000017500000000175600000000000023012 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/de/LC_MESSAGES/djangojs.po0000664000175000017500000004604100000000000023343 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-21 09:21+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-26 06:12+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 "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 "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" msgid "Cluster is being resized." msgstr "Größe des Clusters wird geändert." #, 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 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 "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 "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 "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 "Mesos" msgstr "Mesos" msgid "Miscellaneous" msgstr "Verschiedenes" msgid "Name" msgstr "Name" msgid "Name of the cluster template." msgstr "Name für die Clustervorlage." msgid "Network" msgstr "Netzwerk" msgid "Network Driver" msgstr "Netzwerktreiber" 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 "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 "Used {$ ctrl.stats.clusters $} of {$ ctrl.quota.clusters $}" msgstr "Benutzt {$ ctrl.stats.clusters $} von {$ ctrl.quota.clusters $}" msgid "Volume Driver" msgstr "Datenträgertreiber" #, 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" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591080.038611 magnum_ui-16.0.0/magnum_ui/locale/en_AU/0000775000175000017500000000000000000000000020011 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0586104 magnum_ui-16.0.0/magnum_ui/locale/en_AU/LC_MESSAGES/0000775000175000017500000000000000000000000021576 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/en_AU/LC_MESSAGES/djangojs.po0000664000175000017500000003110700000000000023737 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" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591080.038611 magnum_ui-16.0.0/magnum_ui/locale/en_GB/0000775000175000017500000000000000000000000017774 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0586104 magnum_ui-16.0.0/magnum_ui/locale/en_GB/LC_MESSAGES/0000775000175000017500000000000000000000000021561 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/en_GB/LC_MESSAGES/django.po0000664000175000017500000000177100000000000023371 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/en_GB/LC_MESSAGES/djangojs.po0000664000175000017500000006517600000000000023737 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 # Andi Chandler , 2022. #zanata # Andi Chandler , 2023. #zanata # Andi Chandler , 2024. #zanata msgid "" msgstr "" "Project-Id-Version: magnum-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2024-06-06 07:30+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2024-04-18 12:35+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 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 Subnet" msgstr "Choose an existing Subnet" msgid "Choose an existing network" msgstr "Choose an existing network" msgid "Choose an existing subnet" msgstr "Choose an existing Subnet" 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 Load Balancer for Master Nodes" msgstr "Enable Load Balancer for Master Nodes" 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 Worker Nodes" msgstr "Flavour of Worker Nodes" msgid "Floating IP" msgstr "Floating IP" msgid "Floating IP Enabled" msgstr "Floating IP Enabled " msgid "Get Cluster Config" msgstr "Get Cluster Config" msgid "HTTP Proxy" msgstr "HTTP Proxy" msgid "HTTPS Proxy" msgstr "HTTPS Proxy" msgid "Hard Limit" msgstr "Hard Limit" msgid "Health Status" msgstr "Health Status" msgid "Health Status Reason" msgstr "Health Status Reason" 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 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 "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 Worker Nodes" msgstr "Number of Worker Nodes" msgid "Overlay" msgstr "Overlay" msgid "Overlay2" msgstr "Overlay2" msgid "" "Overriding labels already defined by the cluster template or workflow might " "result in unpredictable behaviour." msgstr "" "Overriding labels already defined by the 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 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 worker nodes for the cluster" msgstr "The number of worker nodes for the cluster" 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 config." msgstr "Unable to retrieve the cluster config." 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 "Use an Existing Subnet" msgstr "Use an existing Subnet" 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 fewer than zero worker nodes." msgstr "You cannot resize to fewer than zero worker nodes." #, 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" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591080.038611 magnum_ui-16.0.0/magnum_ui/locale/fr/0000775000175000017500000000000000000000000017431 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0626104 magnum_ui-16.0.0/magnum_ui/locale/fr/LC_MESSAGES/0000775000175000017500000000000000000000000021216 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/fr/LC_MESSAGES/django.po0000664000175000017500000000170400000000000023022 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/fr/LC_MESSAGES/djangojs.po0000664000175000017500000004000500000000000023354 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" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591080.038611 magnum_ui-16.0.0/magnum_ui/locale/id/0000775000175000017500000000000000000000000017416 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0626104 magnum_ui-16.0.0/magnum_ui/locale/id/LC_MESSAGES/0000775000175000017500000000000000000000000021203 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/id/LC_MESSAGES/django.po0000664000175000017500000000212200000000000023002 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/id/LC_MESSAGES/djangojs.po0000664000175000017500000004340400000000000023347 0ustar00zuulzuul00000000000000# suhartono , 2016. #zanata # Ian Y. Choi , 2017. #zanata # suhartono , 2017. #zanata # suhartono , 2018. #zanata # suhartono , 2019. #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: 2019-01-21 04:54+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 "ADOPT COMPLETE" msgstr "ADOPT COMPLETE (adopsi lengkap)" msgid "API Address" msgstr "API Address (alamat API)" msgid "API Server Port" msgstr "API Server Port" msgid "An arbitrary human-readable name" msgstr "nama human-readable sebarang" 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 "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 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 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 Image" msgstr "Pilih Image" msgid "Cinder" msgstr "Cinder" msgid "Cluster" msgstr "Cluster (klaster)" #, python-format msgid "Cluster %s was successfully created." msgstr "Klaster %s berhasil dibuat." 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)" #, 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 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 "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 "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 "ID" msgstr "ID (id)" 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 "Insecure Registry" msgstr "Registry tidak aman" 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 "Make cluster template public. Default: False" msgstr "Membuat publik template klaster. Default: False" 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 "Mesos" msgstr "Mesos" msgid "Miscellaneous" msgstr "Miscellaneous (lain-lain)" msgid "Name" msgstr "Name (nama)" msgid "Name of the cluster template." msgstr "Nama dari template cluster." msgid "Network" msgstr "Network" msgid "Network Driver" msgstr "Network Driver (driver jaringan)" 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 "Overlay" msgstr "Overlay" msgid "Overview" msgstr "Overview (ikhtisar)" 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 "Resource" msgstr "Resource" msgid "Rexray" msgstr "Rexray" msgid "Rotate Certificate" msgstr "Putar Sertifikat" msgid "SNAPSHOT COMPLETE" msgstr "SNAPSHOT COMPLETE (snapshot lengkap)" 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 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 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 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 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 "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)" #, 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" #, 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 "as follows:" msgstr "sebagai berikut:" msgid "error" msgid_plural "errors" msgstr[0] "kesalahan" 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" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591080.038611 magnum_ui-16.0.0/magnum_ui/locale/ja/0000775000175000017500000000000000000000000017414 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0626104 magnum_ui-16.0.0/magnum_ui/locale/ja/LC_MESSAGES/0000775000175000017500000000000000000000000021201 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/ja/LC_MESSAGES/django.po0000664000175000017500000000210300000000000022777 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/ja/LC_MESSAGES/djangojs.po0000664000175000017500000004652200000000000023351 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 $} 分" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591080.042611 magnum_ui-16.0.0/magnum_ui/locale/ko_KR/0000775000175000017500000000000000000000000020027 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0626104 magnum_ui-16.0.0/magnum_ui/locale/ko_KR/LC_MESSAGES/0000775000175000017500000000000000000000000021614 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/ko_KR/LC_MESSAGES/django.po0000664000175000017500000000205100000000000023414 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/ko_KR/LC_MESSAGES/djangojs.po0000664000175000017500000004400300000000000023754 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 $} 분" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591080.042611 magnum_ui-16.0.0/magnum_ui/locale/pt_BR/0000775000175000017500000000000000000000000020030 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0626104 magnum_ui-16.0.0/magnum_ui/locale/pt_BR/LC_MESSAGES/0000775000175000017500000000000000000000000021615 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/pt_BR/LC_MESSAGES/django.po0000664000175000017500000000212700000000000023421 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/pt_BR/LC_MESSAGES/djangojs.po0000664000175000017500000004433300000000000023763 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" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591080.042611 magnum_ui-16.0.0/magnum_ui/locale/ru/0000775000175000017500000000000000000000000017450 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0626104 magnum_ui-16.0.0/magnum_ui/locale/ru/LC_MESSAGES/0000775000175000017500000000000000000000000021235 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/ru/LC_MESSAGES/django.po0000664000175000017500000000243000000000000023036 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/ru/LC_MESSAGES/djangojs.po0000664000175000017500000007461500000000000023411 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: 2024-06-06 07:30+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-09 10:50+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 "" "A minimum number of Worker Nodes cannot be higher than the default number of " "Worker Nodes." msgstr "" "Минимальное количество рабочих узлов не может превышать стандартное значение " "рабочих узлов." msgid "ADOPT COMPLETE" msgstr "Принятие завершено" msgid "API Address" msgstr "Адрес API" msgid "API Server Port" msgstr "Серверный порт API" msgid "Accessible on private network only" msgstr "Доступен только на приватной сети" msgid "Accessible on the public internet" msgstr "Доступен на публичной сети" msgid "Additional Labels" msgstr "Дополнительные метки" msgid "Addon Software" msgstr "Дополнительное программное обеспечение" msgid "Addon software" msgstr "Дополнительное программное обеспечение" msgid "Advanced" msgstr "Дополнительно" 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 "Auto Healing" msgstr "Авто восстановление" msgid "Auto Scaling" msgstr "Автоматическое масштабирование" msgid "Auto-scale Worker Nodes" msgstr "Автоматическое масштабирование рабочих узлов" msgid "Automatically Repair Unhealthy Nodes" msgstr "Автоматически восстанавливать нездоровые узлы" msgid "Availability Zone" 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 Availability Zone" msgstr "Выберите зону доступности" msgid "Choose an Image" msgstr "Выберите образ" msgid "Choose an existing network" msgstr "Выберите существующую сеть" msgid "Choose an ingress controller" 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 API" msgstr "API Кластера" 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 New Cluster" msgstr "Создать новый кластер" msgid "Create New Network" 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 "Details" msgstr "Детали" 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 "Flavor of Worker Nodes" msgstr "Тип рабочих нод" 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 "I do want to override Template and Workflow Labels" 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 "Ingress" msgstr "Входящий" msgid "Ingress Controller" msgstr "Входящий контроллер" msgid "Insecure Registry" msgstr "Небезопасный реестр" msgid "" "Invalid format. Must be a comma-separated key-value string: key=value," "key2=value2" msgstr "" "Неправильный формат. Необходимо указать строку в формате ключ-значение, " "разделенные запятой: key=value,key2=value2" msgid "It is generally not recommended to give public access." 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 "Management" 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 "Maximum number of Worker Nodes" msgstr "Максимальное количество рабочих узлов" msgid "Mesos" msgstr "Mesos" msgid "Minimum Number of Worker Nodes" msgstr "Минимальное количество рабочих узлов" msgid "Miscellaneous" msgstr "Другое" msgid "Name" msgstr "Имя" msgid "Name of the cluster" msgstr "Имя кластера" msgid "Name of the cluster template." msgstr "Имя шаблона кластера" msgid "Network" msgstr "Сеть" msgid "Network Access Control" 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 "Number of Worker Nodes" 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 "Security Updates" 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 minimum number of Worker Nodes a new cluster can auto scale to cannot " "exceed the total amount of Worker Nodes." 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 number of worker nodes for the cluster" msgstr "Количество рабочих узлов для кластера" 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 "Не удалось выполнить поэтапное обновление." msgid "Unable to process `Additional Labels`. Not all labels will be applied." msgstr "" "Не удалось обработать `Дополнительные метки`. Не все метки будут применены." #, python-format msgid "Unable to resize given cluster id: %(id)s." msgstr "Не удалось изменить размер кластера с ID: %(id)s" msgid "Unable to retrieve available add-ons." msgstr "Не удалось получить доступные дополнения." msgid "Unable to retrieve available ingress controllers." 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 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 "Use an Existing Network" msgstr "Использовать существующую сеть" msgid "Used {$ ctrl.stats.clusters $} of {$ ctrl.quota.clusters $}" msgstr "Использовано {$ ctrl.stats.clusters $} из {$ ctrl.quota.clusters $}" msgid "Volume Driver" msgstr "Драйвер диска" msgid "Worker Nodes" 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 auto-scale 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 "key=value,key2=value2..." msgstr "key=value,key2=value2..." 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 $} минут" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591080.042611 magnum_ui-16.0.0/magnum_ui/locale/tr_TR/0000775000175000017500000000000000000000000020054 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0626104 magnum_ui-16.0.0/magnum_ui/locale/tr_TR/LC_MESSAGES/0000775000175000017500000000000000000000000021641 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/tr_TR/LC_MESSAGES/django.po0000664000175000017500000000157600000000000023454 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/locale/tr_TR/LC_MESSAGES/djangojs.po0000664000175000017500000003474200000000000024012 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" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591080.042611 magnum_ui-16.0.0/magnum_ui/static/0000775000175000017500000000000000000000000017052 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591080.042611 magnum_ui-16.0.0/magnum_ui/static/dashboard/0000775000175000017500000000000000000000000021001 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0626104 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/0000775000175000017500000000000000000000000024060 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0666103 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/0000775000175000017500000000000000000000000027535 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/actions.module.js0000664000175000017500000000562500000000000033027 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/actions.module.spec.js0000664000175000017500000000412600000000000033753 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) { return action.id === value; } } }); })(); ././@PaxHeader0000000000000000000000000000021100000000000011447 xustar0000000000000000115 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.module.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.modu0000664000175000017500000001160300000000000034101 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 * @returns {String[]} List of 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' }); } })(); ././@PaxHeader0000000000000000000000000000021600000000000011454 xustar0000000000000000120 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.module.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.modu0000664000175000017500000000154500000000000034105 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(); }); }); })(); ././@PaxHeader0000000000000000000000000000021200000000000011450 xustar0000000000000000116 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.service.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.serv0000664000175000017500000000415200000000000034115 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; } } })(); ././@PaxHeader0000000000000000000000000000021700000000000011455 xustar0000000000000000121 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.service.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/cluster-templates.serv0000664000175000017500000000435100000000000034116 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', updated_at: '2020-01-01'}, {id: 456, name: 'template2', created_at: '2021-12-12'}, ] } }); $timeout.flush(); expect(magnum.getClusterTemplates).toHaveBeenCalled(); expect(result.$$state.value.data.items[0].name).toBe('template1'); expect(result.$$state.value.data.items[0].trackBy).toBe('1232020-01-01'); expect(result.$$state.value.data.items[1].name).toBe('template2'); expect(result.$$state.value.data.items[1].trackBy).toBe('4562021-12-12'); })); }); describe('urlFunction', function() { it("get url", inject(function() { var result = service.urlFunction({id:"123abc"}); expect(result).toBe(detailRoute + "OS::Magnum::ClusterTemplate/123abc"); })); }); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0666103 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/create/0000775000175000017500000000000000000000000031000 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020600000000000011453 xustar0000000000000000112 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/create/create.service.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/create/create.service.0000664000175000017500000000560100000000000033705 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; } } })(); ././@PaxHeader0000000000000000000000000000021300000000000011451 xustar0000000000000000117 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/create/create.service.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/create/create.service.0000664000175000017500000000471500000000000033712 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(); })); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0666103 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/delete/0000775000175000017500000000000000000000000030777 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020600000000000011453 xustar0000000000000000112 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/delete/delete.service.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/delete/delete.service.0000664000175000017500000001354000000000000033704 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} $rootScope * @param {Object} magnum service * @param {Object} policy * @param {Object} actionResult * @param {Object} gettext * @param {Object} $qExtensions * @param {Object} deleteModal * @param {Object} tableEvents * @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().catch(angular.noop); // Reject the promise by default if (result.fail.length > 0) { toast.add('error', getMessage(notAllowedMessage, result.fail)); outcome = $q.reject(result.fail).catch(angular.noop); } 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); return null; } 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); } } })(); ././@PaxHeader0000000000000000000000000000021300000000000011451 xustar0000000000000000117 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/delete/delete.service.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/delete/delete.service.0000664000175000017500000001030000000000000033673 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); } }); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0666103 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/details/0000775000175000017500000000000000000000000031162 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020700000000000011454 xustar0000000000000000113 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/details/details.module.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/details/details.module0000664000175000017500000000330100000000000034013 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); } } })(); ././@PaxHeader0000000000000000000000000000021200000000000011450 xustar0000000000000000116 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/details/drawer.controller.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/details/drawer.control0000664000175000017500000000255400000000000034056 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 (obj && typeof obj === 'object') { length = Object.keys(obj).length; } return length; } } })(); ././@PaxHeader0000000000000000000000000000021700000000000011455 xustar0000000000000000121 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/details/drawer.controller.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/details/drawer.control0000664000175000017500000000222700000000000034053 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()).toBe(0); expect(ctrl.objLen(null)).toBe(0); expect(ctrl.objLen({})).toBe(0); expect(ctrl.objLen({a: 0})).toBe(1); })); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/details/drawer.html0000664000175000017500000000157600000000000033345 0ustar00zuulzuul00000000000000
ID
{$ item.id $}
Network Driver
{$ item.network_driver $}
Image ID
{$ item.image_id $}
Registry Enabled
{$ item.registry_enabled | yesno $}
Labels
None
{$ key + '=' + value $}
././@PaxHeader0000000000000000000000000000021400000000000011452 xustar0000000000000000118 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/details/overview.controller.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/details/overview.contr0000664000175000017500000000317600000000000034106 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 (obj && typeof obj === 'object') { length = Object.keys(obj).length; } return length; } } })(); ././@PaxHeader0000000000000000000000000000022100000000000011450 xustar0000000000000000123 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/details/overview.controller.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/details/overview.contr0000664000175000017500000000332500000000000034102 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()).toBe(0); expect(ctrl.objLen(null)).toBe(0); expect(ctrl.objLen({})).toBe(0); expect(ctrl.objLen({a: 0})).toBe(1); })); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/details/overview.html0000664000175000017500000001016200000000000033716 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/panel.html0000664000175000017500000000033500000000000031523 0ustar00zuulzuul00000000000000 ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0666103 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/update/0000775000175000017500000000000000000000000031017 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020600000000000011453 xustar0000000000000000112 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/update/update.service.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/update/update.service.0000664000175000017500000001173300000000000033746 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) { function setModelFromResponse(key, defaultValue) { if (response.data[key]) { config.model[key] = response.data[key]; } else { config.model[key] = defaultValue; } } setModelFromResponse('name', ""); setModelFromResponse('coe', ""); setModelFromResponse('server_type', ""); setModelFromResponse('public', false); setModelFromResponse('hidden', false); setModelFromResponse('registry_enabled', false); setModelFromResponse('tls_disabled', false); setModelFromResponse('image_id', ""); setModelFromResponse('flavor_id', ""); setModelFromResponse('master_flavor_id', ""); setModelFromResponse('docker_volume_size', ""); setModelFromResponse('docker_storage_driver', ""); setModelFromResponse('keypair_id', ""); setModelFromResponse('network_driver', ""); setModelFromResponse('volume_driver', ""); setModelFromResponse('insecure_registry', ""); setModelFromResponse('http_proxy', ""); setModelFromResponse('https_proxy', ""); setModelFromResponse('no_proxy', ""); setModelFromResponse('external_network_id', ""); setModelFromResponse('fixed_network', ""); setModelFromResponse('fixed_subnet', ""); setModelFromResponse('dns_nameserver', ""); setModelFromResponse('master_lb_enabled', false); setModelFromResponse('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; } } })(); ././@PaxHeader0000000000000000000000000000021300000000000011451 xustar0000000000000000117 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/update/update.service.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/update/update.service.0000664000175000017500000000560100000000000033743 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=1743591080.0666103 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/0000775000175000017500000000000000000000000031407 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020500000000000011452 xustar0000000000000000111 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/info.help.html 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/info.help.htm0000664000175000017500000000104700000000000034005 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
././@PaxHeader0000000000000000000000000000020700000000000011454 xustar0000000000000000113 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/labels.help.html 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/labels.help.h0000664000175000017500000000020300000000000033744 0ustar00zuulzuul00000000000000

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

././@PaxHeader0000000000000000000000000000021000000000000011446 xustar0000000000000000114 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/network.help.html 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/network.help.0000664000175000017500000000104200000000000034025 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
././@PaxHeader0000000000000000000000000000020500000000000011452 xustar0000000000000000111 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/spec.help.html 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/spec.help.htm0000664000175000017500000000130000000000000033774 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.
././@PaxHeader0000000000000000000000000000021200000000000011450 xustar0000000000000000116 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/workflow.service.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/workflow.serv0000664000175000017500000005032000000000000034162 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")}, {value: "overlay2", name: gettext("Overlay2")} ] } ] }, { 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: true, 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; } })(); ././@PaxHeader0000000000000000000000000000021700000000000011455 xustar0000000000000000121 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/workflow.service.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/cluster-templates/workflow/workflow.serv0000664000175000017500000000503300000000000034163 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=1743591080.0706103 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/0000775000175000017500000000000000000000000025724 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/actions.module.js0000664000175000017500000000751600000000000031217 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.config.service', 'horizon.dashboard.container-infra.clusters.resourceType' ]; function registerClusterActions ( registry, gettext, createClusterService, deleteClusterService, resizeClusterService, rollingUpgradeClusterService, showCertificateService, signCertificateService, rotateCertificateService, getClusterConfigService, 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: 'getClusterConfigAction', service: getClusterConfigService, template: { text: gettext('Get Cluster Config') } }) .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=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/actions.module.spec.js0000664000175000017500000000562300000000000032145 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); }); it('registers Get Cluster Config as an item action', function() { var actions = registry.getResourceType('OS::Magnum::Cluster').itemActions; expect(actionHasId(actions, 'getClusterConfigAction')).toBe(true); }); function actionHasId(list, value) { return list.filter(matchesId).length === 1; function matchesId(action) { return action.id === value; } } }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/cluster-stats.controller.js0000664000175000017500000000564500000000000033273 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; max = response.data.hard_limit; dataClusters[1].value = max - sum; var percent = Math.round(sum / max * 100); // shows 100% used if max = 0 if (max === 0) { percent = 100; } var overMax = percent > 100; ctrl.chartDataClusters = { title: gettext("Clusters"), label: percent + '%', maxLimit: max, overMax: overMax, data: dataClusters }; ctrl.quota = {clusters: max}; } } })(); ././@PaxHeader0000000000000000000000000000020500000000000011452 xustar0000000000000000111 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/cluster-stats.controller.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/cluster-stats.controller.spec.j0000664000175000017500000000524100000000000034031 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 zero quota', function() { deferredQuota = $q.defer(); deferredQuota.resolve({data: {hard_limit: 0}}); spyOn(magnum, 'getQuota').and.returnValue(deferredQuota.promise); $scope.$apply(); expect(magnum.getStats).toHaveBeenCalled(); expect(magnum.getQuota).toHaveBeenCalled(); }); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/clusters.module.js0000664000175000017500000001512100000000000031412 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' ]) .decorator('actionsDirective', actionsDirectiveDecorator) .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('health_status', { label: gettext('Health Status') }) .setProperty('master_count', { label: gettext('Control Plane Count') }) .setProperty('node_count', { label: gettext('Node Count') }) .setProperty('coe_version', { label: gettext('Kubernetes Version') }) .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: 'health_status', priority: 1 }) .append({ id: 'master_count', priority: 2 }) .append({ id: 'node_count', priority: 2 }) .append({ id: 'coe_version', 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('Health Status'), 'name': 'health_status', 'singleton': true }) .append({ 'label': gettext('Control Plane Count'), 'name': 'master_count', 'singleton': true }) .append({ 'label': gettext('Node Count'), 'name': 'node_count', 'singleton': true }) .append({ 'label': gettext('Kubernetes Version'), 'name': 'coe_version', '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' }); } actionsDirectiveDecorator.$inject = [ '$delegate', 'horizon.dashboard.container-infra.clusters.utils' ]; /** * @param {Object} $delegate * @param {Object} clustersUtils * @description Extends behaviour of `horizon.framework.widgets.action-list.directive:actions` * with business logic in clusters.getActionsDirectiveLinkFn(); * @return {Object} Returns the ammended directive. */ function actionsDirectiveDecorator($delegate, clustersUtils) { var directive = $delegate[0]; // Angular's `link` is wrapped inside the compile function directive.compile = function() { return clustersUtils.getActionsDirectiveLinkFn(directive); }; return $delegate; } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/clusters.module.spec.js0000664000175000017500000000152300000000000032344 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/clusters.scss0000664000175000017500000000165600000000000030475 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; } } } .dropdown-menu > li.disabled { cursor: not-allowed; } // prevents click propagation to ng-click .split-button.disabled, .dropdown-menu > li.disabled > a { pointer-events: none; }././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/clusters.service.js0000664000175000017500000000364700000000000031577 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/clusters.service.spec.js0000664000175000017500000000457200000000000032526 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"); })); }); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/clusters.utils.js0000664000175000017500000001055500000000000031273 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.utils * @description Service utilities for Clusters module. */ angular .module('horizon.dashboard.container-infra.clusters') .factory('horizon.dashboard.container-infra.clusters.utils', clustersUtilsService); clustersUtilsService.$inject = [ '$parse', 'horizon.framework.util.q.extensions', '$timeout' ]; function clustersUtilsService($parse, $qExtensions, $timeout) { var service = { getActionsDirectiveLinkFn: getActionsDirectiveLinkFn }; return service; ////////////// /** * Extends directive by conditionally enabling/disabling selected actions in the * cluster item's dropdown menu. This allows to block actions that are unavailable in certain * cluster states. * @param {Object} directive Extended directive * @returns {function} Directive's Link function */ function getActionsDirectiveLinkFn(directive) { // List of Cluster statuses that will enable the 'conditional action' var ALLOWED_STATUSES_LIST = [ 'DELETE_COMPLETE', 'CREATE_COMPLETE', 'UPDATE_COMPLETE', 'ROLLBACK_COMPLETE', 'SNAPSHOT_COMPLETE', 'CHECK_COMPLETE', 'ADOPT_COMPLETE' ]; // List of actions disabled/enabled based on the allowed statuses var CONDITIONAL_ACTIONS_LIST = [ 'resizeClusterAction', 'rollingUpgradeClusterAction' ]; // Important: If the directive template structure changes, // this selector might need to be updated. var ELEMENT_ACTIONS_SELECTOR = '.split-button,.dropdown-menu>li'; var DISABLED_CLASS_NAME = 'disabled'; var actionsDirectiveLinkFn = function(scope, element, attrs) { // Call the original `link` method to keep the default behaviour directive.link.apply(this, arguments); var listType = attrs.type; // Only do this for actions in the table's row if (listType !== 'row') { return; } var item = $parse(attrs.item)(scope); var allowedActions; var actionsParam = $parse(attrs.allowed)(scope); if (angular.isFunction(actionsParam)) { allowedActions = actionsParam(); } else { allowedActions = actionsParam; } allowedActions.forEach(function(allowedAction) { allowedAction.promise = allowedAction.service.allowed(item); }); $qExtensions.allSettled(allowedActions).then(disableConditionalRowActions); function disableConditionalRowActions(permittedActions) { if (permittedActions.pass.length < 1) { return; } // Gets evaluated AFTER DOM finishes rendering $timeout(applyActionAvailability, 0); function applyActionAvailability() { var actionElementsList = element[0].querySelectorAll(ELEMENT_ACTIONS_SELECTOR); permittedActions.pass.forEach(function(action, actionIndex) { if (isConditionalAction(action.context.id)) { var actionElement = angular.element(actionElementsList[actionIndex]); // If the status is not allowed - add disabling class if (isAllowedStatus(item.status)) { actionElement.removeClass(DISABLED_CLASS_NAME); } else { actionElement.addClass(DISABLED_CLASS_NAME); } } }); } } }; function isAllowedStatus(statusId) { return ALLOWED_STATUSES_LIST.indexOf(statusId) > -1; } function isConditionalAction(actionId) { return CONDITIONAL_ACTIONS_LIST.indexOf(actionId) > -1; } return actionsDirectiveLinkFn; } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/clusters.utils.spec.js0000664000175000017500000000343000000000000032216 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.utils', function() { var service, $scope, mockDirective, actionsDirectiveLinkFn, attrs; /////////////////// beforeEach(module('horizon.app.core')); beforeEach(module('horizon.framework')); beforeEach(module('horizon.dashboard.container-infra.clusters')); beforeEach(inject(function($injector, _$rootScope_) { $scope = _$rootScope_.$new(); service = $injector.get( 'horizon.dashboard.container-infra.clusters.utils'); mockDirective = {link:{apply:function() {}}}; actionsDirectiveLinkFn = service.getActionsDirectiveLinkFn(mockDirective); attrs = { type: 'row', item: 'item', allowed: 'allowed' }; })); it('should not amend the directive because the action type is ' + 'not \'row\'', function() { attrs.type = 'main'; actionsDirectiveLinkFn($scope, angular.element(""), attrs); }); it('should attempt to amend the directive without critical failure', function() { $scope.allowed = []; actionsDirectiveLinkFn($scope, angular.element(""), attrs); }); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0706103 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/config/0000775000175000017500000000000000000000000027171 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/config/config.service.js0000664000175000017500000000446600000000000032445 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.config.service * @description Service for the container-infra cluster get config modal */ angular .module('horizon.dashboard.container-infra.clusters') .factory( 'horizon.dashboard.container-infra.clusters.config.service', getClusterConfigService); getClusterConfigService.$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 getClusterConfigService( magnum, resourceType, actionResult, textDownload, $qExtensions ) { var service = { initAction: initAction, perform: perform, allowed: allowed }; return service; ////////////// function initAction() { } function perform(selected) { // get config return magnum.getClusterConfig(selected.id).then(function(response) { if (typeof response.data.key !== "undefined") { textDownload.downloadTextFile(response.data.key, selected.name + "_key.pem"); textDownload.downloadTextFile(response.data.ca, selected.name + "_ca.pem"); textDownload.downloadTextFile(response.data.cert, selected.name + "_cert.pem"); } textDownload.downloadTextFile(response.data.cluster_config, selected.name + "_config"); var result = actionResult.getActionResult() .created(resourceType, selected.id); return result.result; }); } function allowed() { return $qExtensions.booleanAsPromise(true); } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/config/config.service.spec.js0000664000175000017500000000541300000000000033367 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.config.service', function() { var $scope, service, selected, magnum, textDownload; beforeEach(module('horizon.app.core')); beforeEach(module('horizon.framework')); beforeEach(module('horizon.dashboard.container-infra.clusters')); beforeEach(inject(function($injector) { service = $injector.get( 'horizon.dashboard.container-infra.clusters.config.service'); magnum = $injector.get('horizon.app.core.openstack-service-api.magnum'); textDownload = $injector.get('horizon.framework.util.file.text-download'); spyOn(textDownload, 'downloadTextFile').and.returnValue(Promise.resolve(true)); $scope = $injector.get('$rootScope'); selected = {id: '1'}; })); it('should check the policy', function() { var allowed = service.allowed(); expect(allowed).toBeTruthy(); }); it('should get magnum.getClusterConfig', function() { var returnValue = {data: {cluster_config: "config1"}}; spyOn(magnum, 'getClusterConfig').and.returnValue(Promise.resolve(returnValue)); service.initAction(); var promise = service.perform(selected); promise.then(verifyContents); $scope.$apply(); expect(magnum.getClusterConfig).toHaveBeenCalled(); function verifyContents (contents) { expect(contents.created).toBeDefined(); expect(contents.failed).toEqual([]); expect(textDownload.downloadTextFile.calls.count()).toBe(1); } }); it('should download', inject(function() { var returnValue = {data: {key: "key1", cluster_config: "config1", ca: "ca1", cert: "cert1"}}; spyOn(magnum, 'getClusterConfig').and.returnValue(Promise.resolve(returnValue)); service.initAction(); var promise = service.perform(selected); promise.then(verifyContents); $scope.$apply(); expect(magnum.getClusterConfig).toHaveBeenCalled(); function verifyContents (contents) { expect(contents.created).toBeDefined(); expect(contents.failed).toEqual([]); expect(textDownload.downloadTextFile.calls.count()).toBe(4); } })); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0706103 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/create/0000775000175000017500000000000000000000000027167 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/create/create.service.js0000664000175000017500000001516400000000000032436 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, labels: requestLabels, master_lb_enabled: model.master_lb_enabled }; // 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'); addFieldToRequestObjectIfSet('fixed_subnet','fixed_subnet'); } // 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; requestLabels.master_lb_floating_ip_enabled = model.master_lb_floating_ip_enabled; if (model.api_master_lb_allowed_cidrs !== '') { requestLabels.api_master_lb_allowed_cidrs = model.api_master_lb_allowed_cidrs; } 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/create/create.service.spec.js0000664000175000017500000001027200000000000033362 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, $httpBackend; 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_, _$httpBackend_) { $q = _$q_; $httpBackend = _$httpBackend_; $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); $httpBackend.expectGET('/static/dashboard/container-infra/clusters/panel.html').respond({}); $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); $httpBackend.expectGET('/static/dashboard/container-infra/clusters/panel.html').respond({}); $timeout.flush(); $scope.$apply(); })); }); })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591080.0706103 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/delete/0000775000175000017500000000000000000000000027166 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/delete/delete.service.js0000664000175000017500000001330000000000000032422 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} $rootScope * @param {Object} magnum * @param {Object} policy * @param {Object} actionResult * @param {Object} gettext * @param {Object} $qExtensions * @param {Object} deleteModal * @param {Object} tableEvents * @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().catch(angular.noop); // Reject the promise by default if (result.fail.length > 0) { toast.add('error', getMessage(notAllowedMessage, result.fail)); outcome = $q.reject(result.fail).catch(angular.noop); } 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); return null; } 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/delete/delete.service.spec.js0000664000175000017500000001016500000000000033361 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=1743591080.0706103 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/details/0000775000175000017500000000000000000000000027351 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/details/details.module.js0000664000175000017500000000316300000000000032623 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/details/drawer.controller.js0000664000175000017500000000250600000000000033360 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 (obj && typeof obj === 'object') { length = Object.keys(obj).length; } return length; } } })(); ././@PaxHeader0000000000000000000000000000020600000000000011453 xustar0000000000000000112 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/details/drawer.controller.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/details/drawer.controller.spec.0000664000175000017500000000216400000000000033754 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()).toBe(0); expect(ctrl.objLen(null)).toBe(0); expect(ctrl.objLen({})).toBe(0); expect(ctrl.objLen({a: 0})).toBe(1); })); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/details/drawer.html0000664000175000017500000000333700000000000031531 0ustar00zuulzuul00000000000000
ID
{$ item.id $}
Master Count
{$ item.master_count $}
Node Count
{$ item.node_count $}
Keypair
{$ item.keypair $}
Cluster Template
{$ item.cluster_template_id $}
Kubernetes API Address
{$ item.api_address $}
Control Plane Addresses
None
{$ addr $}
Node Addresses
None
{$ addr $}
Health Status Reason
{$ item.health_status_reason | json $}
Status Reason
{$ item.status_reason $}
././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/details/overview.controller.js0000664000175000017500000000277500000000000033752 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 (obj && typeof obj === 'object') { length = Object.keys(obj).length; } return length; } } })(); ././@PaxHeader0000000000000000000000000000021000000000000011446 xustar0000000000000000114 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/details/overview.controller.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/details/overview.controller.spe0000664000175000017500000000326700000000000034122 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()).toBe(0); expect(ctrl.objLen(null)).toBe(0); expect(ctrl.objLen({})).toBe(0); expect(ctrl.objLen({a: 0})).toBe(1); })); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/details/overview.html0000664000175000017500000001064200000000000032110 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 $}
Health Status
{$ ctrl.cluster.health_status $}
Health Status Reason
{$ ctrl.cluster.health_status_reason | noValue $}
././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/panel.html0000664000175000017500000000175500000000000027721 0ustar00zuulzuul00000000000000

Stats


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

././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1743591080.07461 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/resize/0000775000175000017500000000000000000000000027225 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.js0000664000175000017500000001457700000000000032541 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.nodegroups, response.data.worker_nodes); deferred.resolve(modal.open(modalConfig).then(onModalSubmit)); $scope.model = formModel; spinnerModal.hideModalSpinner(); } function hideSpinnerOnError(error) { spinnerModal.hideModalSpinner(); deferred.promise.catch(angular.noop); return deferred.reject(error); } return deferred.promise; } function allowed() { return $qExtensions.booleanAsPromise(true); } function constructModalConfig(nodegroups, workerNodesList) { var defaultWorker = nodegroups.filter(function(ng) { return ng.name === 'default-worker'; })[0]; formModel.original_node_count = defaultWorker.node_count; formModel.node_count = defaultWorker.node_count; formModel.worker_nodes = workerNodesList; return { title: gettext('Resize Cluster'), schema: { type: 'object', properties: { 'node_count': { type: 'number', minimum: 0 }, '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 (default-worker)'), placeholder: gettext('The default-worker nodegroup node_count.'), required: true, validationMessage: { 101: gettext('You cannot resize to fewer than zero worker nodes.') }, 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 && ' + 'model.worker_nodes.length > 0', 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.spec.js0000664000175000017500000001112500000000000033454 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) { // 2 nodegroups, default-worker and another-nodegroup, with 2 and 3 // nodes respectively. cluster.node_count will be total nodes in all // nodegroups var mockDefaultWorker = {name: 'default-worker', node_count: 2}; var mockNodegroups = [mockDefaultWorker, {name: 'default-master', node_count: 1}, {name: 'another-nodegroup', node_count: 3}]; var mockCluster = {node_count: 5}; // only populated with heat, [] for capi var mockWorkerNodes = [{id: "456", name: "Worker Node 1"}, {id: "457", name: "Worker Node 2"}]; deferred = $q.defer(); deferred.resolve({data: {cluster: mockCluster, worker_nodes: mockWorkerNodes, nodegroups: mockNodegroups}}); 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(mockDefaultWorker.node_count); expect(modalConfig.model.node_count).toBe(mockDefaultWorker.node_count); 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(); })); }); })(); ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1743591080.07461 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/rolling-upgrade/0000775000175000017500000000000000000000000031017 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020700000000000011454 xustar0000000000000000113 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/rolling-upgrade/upgrade.service.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/rolling-upgrade/upgrade.service0000664000175000017500000001652200000000000034036 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(); })); }); })(); ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1743591080.07461 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/rotate-certificate/0000775000175000017500000000000000000000000031502 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022500000000000011454 xustar0000000000000000127 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/rotate-certificate/rotate-certificate.service.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/rotate-certificate/rotate-certi0000664000175000017500000000451600000000000034035 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); } } })(); ././@PaxHeader0000000000000000000000000000023200000000000011452 xustar0000000000000000132 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/rotate-certificate/rotate-certificate.service.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/rotate-certificate/rotate-certi0000664000175000017500000000321600000000000034031 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(); }); }); })(); ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1743591080.07461 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/show-certificate/0000775000175000017500000000000000000000000031164 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022100000000000011450 xustar0000000000000000123 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/show-certificate/show-certificate.service.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/show-certificate/show-certifica0000664000175000017500000000406100000000000034017 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); } } })(); ././@PaxHeader0000000000000000000000000000022600000000000011455 xustar0000000000000000128 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/show-certificate/show-certificate.service.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/show-certificate/show-certifica0000664000175000017500000000326000000000000034017 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(); }); }); })(); ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1743591080.07461 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/0000775000175000017500000000000000000000000031144 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000023200000000000011452 xustar0000000000000000132 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificate-modal.controller.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certifica0000664000175000017500000000277300000000000033767 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).then(onGetCluster); function onGetCluster(response) { ctrl.model.cluster_name = response.name; } } })(); ././@PaxHeader0000000000000000000000000000022100000000000011450 xustar0000000000000000123 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificate-modal.html 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certifica0000664000175000017500000000210400000000000033753 0ustar00zuulzuul00000000000000
././@PaxHeader0000000000000000000000000000021700000000000011455 xustar0000000000000000121 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificate-model.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certifica0000664000175000017500000000331400000000000033757 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; } })(); ././@PaxHeader0000000000000000000000000000022400000000000011453 xustar0000000000000000126 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificate-model.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certifica0000664000175000017500000000305400000000000033760 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(); })); }); })(); ././@PaxHeader0000000000000000000000000000022100000000000011450 xustar0000000000000000123 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificate.service.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certifica0000664000175000017500000000564300000000000033766 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; } } })(); ././@PaxHeader0000000000000000000000000000022600000000000011455 xustar0000000000000000128 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificate.service.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certifica0000664000175000017500000000453100000000000033761 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(); })); }); })(); ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1743591080.07461 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/workflow/0000775000175000017500000000000000000000000027576 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/workflow/advanced.help.html0000664000175000017500000000061100000000000033156 0ustar00zuulzuul00000000000000

Additional Labels

Specify additional 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.

././@PaxHeader0000000000000000000000000000021400000000000011452 xustar0000000000000000118 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/workflow/cluster-template.controller.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/workflow/cluster-template.contr0000664000175000017500000001164300000000000034144 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'); setResponseAsDefaultIfUnset('master_lb_enabled', 'master_lb_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); setLabelResponseAsDefault( 'master_lb_floating_ip_enabled', 'master_lb_floating_ip_enabled', true); // Forcibly clear allowed cidr values on template load. Otherwise this value becomes nil. $scope.model.api_master_lb_allowed_cidrs = MODEL_DEFAULTS.api_master_lb_allowed_cidrs; // 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(); }); } })(); ././@PaxHeader0000000000000000000000000000022100000000000011450 xustar0000000000000000123 path=magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/workflow/cluster-template.controller.spec.js 22 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/workflow/cluster-template.contr0000664000175000017500000002313100000000000034137 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 business 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 business 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 business 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 business 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 business 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.master_lb_floating_ip_enabled = !MODEL_DEFAULTS.master_lb_floating_ip_enabled; templateResponse.master_lb_floating_ip_enabled = !$scope.model.master_lb_floating_ip_enabled; $scope.model.cluster_template_id = '99'; // Triggers business logic revalidation $scope.$apply(); expect($scope.model.master_lb_floating_ip_enabled).toBe( templateResponse.master_lb_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.api_master_lb_allowed_cidrs = "192.168.67.0/24"; templateResponse.labels.api_master_lb_allowed_cidrs = "10.0.0.1/16"; model.cluster_template_id = '99'; // Triggers business logic revalidation $scope.$apply(); expect(model.auto_scaling_enabled).toBe(true); expect(model.auto_healing_enabled).toBe(false); expect($scope.model.api_master_lb_allowed_cidrs).toBe( MODEL_DEFAULTS.api_master_lb_allowed_cidrs ); }); it('should not fail if the cluster template response is empty', function() { templateResponse = {}; $scope.model.cluster_template_id = '99'; // Triggers business 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 business 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 business logic revalidation $scope.$apply(); expect($scope.model.ingress_controller.labels.ingress_controller).toBe('c2'); }); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/workflow/cluster-template.html0000664000175000017500000000244300000000000033761 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/workflow/details.help.html0000664000175000017500000000034500000000000033042 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/workflow/management.help.html0000664000175000017500000000041200000000000033524 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=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/workflow/network.help.html0000664000175000017500000000227300000000000033110 0ustar00zuulzuul00000000000000

Network

You can choose to create a new network for this cluster, or use an existing network. If you use an existing, it needs to have a subnet and router with a gateway on the external network. You may also need to take care not to conflict with CIDRs in use by the Kubernetes pod and service network.

API Loadbalancer: Floating IP

Making the Kubernetes API accessible from your 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 the public internet with a floating IP is convenient, but may represent a security risk. When selecting this option, it is recommended to set Allowed CIDRs to limit access to a trusted IP address range.

API Loadbalancer: Allowed CIDRs

If this field is left empty, the API Loadbalancer will accept connections from any address. When set to one or more CIDR then only those, plus the internal network, are permitted access to the Kubernetes API Loadbalancer.

././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/workflow/size.help.html0000664000175000017500000000153500000000000032371 0ustar00zuulzuul00000000000000

Control Plane size

Only uneven number of control plane nodes are supported. This provides the best balance of fault tolerance and cost for etcd.

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 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.

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=1743591029.0 magnum_ui-16.0.0/magnum_ui/static/dashboard/container-infra/clusters/workflow/workflow.service.js0000664000175000017500000007220400000000000033452 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?)+$/; // Comma-separated CIDR list. Allows lots of variation to include v4 and v6. var REGEXP_CIDR_LIST = /^[a-f0-9\.:]+\/[0-9]+(,\s?[a-f0-9\.:]+\/[0-9]+)*$/; // Object name, must start with alphabetical character. var REGEXP_CLUSTER_NAME = /^[a-zA-Z][a-zA-Z0-9_\-\.]*$/; function ClusterWorkflow($q, basePath, gettext, magnum, neutron, nova) { var workflow = { init: init }; function init(title, $scope) { var schema, form; var fixedSubnetsInitial = gettext('Choose an existing subnet'); // Default