././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.585148 zaqar_ui-18.0.0/0000775000175000017500000000000000000000000013436 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/.eslintrc0000664000175000017500000000306400000000000015265 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=1743591551.0 zaqar_ui-18.0.0/.zuul.yaml0000664000175000017500000000034600000000000015402 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=1743591596.0 zaqar_ui-18.0.0/AUTHORS0000664000175000017500000000312300000000000014505 0ustar00zuulzuul0000000000000098k <18552437190@163.com> Akihiro Motoki Andreas Jaeger AvnishPal Cao Xuan Hoang Charles Short Corey Bryant David Cusatis Doug Hellmann Eva Balycheva Fei Long Wang Feilong Wang Flavio Percoco Ghanshyam Mann Hervé Beraud Ian Wienand Ivan Kolodyazhny Kenji Ishii Li Wei M V P Nitesh Monty Taylor Nguyen Hung Phuong OpenStack Release Bot Sean McGinnis Shu Muto Shu Muto Takashi Kajinami Takashi Kajinami Thai Tran avnish gujin howardlee huang.zhiping jacky06 liyanhang manchandavishal melissaml ricolin shangxiaobj shu-mutou wangjiaqi07 wu.shiming zhangboye zhulingjie “e ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591596.0 zaqar_ui-18.0.0/ChangeLog0000664000175000017500000002505100000000000015213 0ustar00zuulzuul00000000000000CHANGES ======= 18.0.0 ------ * Remove unused Babel * Bump hacking * reno: Update master for unmaintained/2023.1 * Drop support for Python 3.8 and older * Add note about requirements lower bounds * Fix outedated tox minversion * Update master for stable/2024.2 * reno: Update master for unmaintained/zed * Imported Translations from Zanata 17.0.0 ------ * Update master for stable/2024.1 * reno: Update master for unmaintained/xena * reno: Update master for unmaintained/wallaby * reno: Update master for unmaintained/victoria * reno: Update master for unmaintained/yoga 16.0.0 ------ * Update python classifier in setup.cfg * Imported Translations from Zanata * Update master for stable/2023.2 * Cleanup py27 support 15.0.0 ------ * Update master for stable/2023.1 14.0.0 ------ * Imported Translations from Zanata * Fix tox4 error 14.0.0.0b1 ---------- * Switch to 2023.1 Python3 unit tests and generic template name * Update master for stable/zed 13.0.0 ------ * Django 4.x: Replace removed features * Migrate to AngularJS v1.8.2 * Imported Translations from Zanata * Use Horizon project template for nodejs jobs * Add Python3 zed unit tests * Update master for stable/yoga 12.0.0 ------ * setup.cfg: Replace dashes by underscores * 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 11.0.0 ------ * Drop horizon-nodejs10-jobs template * Dropping lower constraints testing * Add horizon-nodejs14-job template * Add Python3 xena unit tests * Update master for stable/wallaby 10.0.0 ------ * Imported Translations from Zanata * Use TOX\_CONSTRAINTS\_FILE * Add py38 package metadata * Run npm nodejs job with Firefox browser * Imported Translations from Zanata * Add Python3 wallaby unit tests * Update master for stable/victoria 9.0.0 ----- * [goal] Migrate testing to ubuntu focal * Fix npm jobs * Imported Translations from Zanata * Use unittest.mock instead of mock * Stop to use the \_\_future\_\_ module * Switch to newer openstackdocstheme and reno versions * Imported Translations from Zanata * Imported Translations from Zanata * Add Python3 victoria unit tests * Update master for stable/ussuri 8.0.0 ----- * Imported Translations from Zanata * Imported Translations from Zanata * Fix pyScss version in lower-constraints.txt * Fix python36 job setup * Remove six usage * Drop Django 1.11 support * Imported Translations from Zanata * translation: drop babel extractor definitions * Add requirements.txt to docs reqs * [ussuri][goal] Drop python 2.7 support and testing * Imported Translations from Zanata * Use Horizon project template for django jobs * Imported Translations from Zanata * Update master for stable/train * Sync Sphinx requirement 7.0.0 ----- * Imported Translations from Zanata * Replace git.openstack.org URLs with opendev.org URLs * OpenDev Migration Patch * Dropping the py35 testing * Imported Translations from Zanata * Replace openstack.org git:// URLs with https:// * Update master for stable/stein * Add nodejs10 jobs on bionic 6.0.0 ----- * Switch to horizon-nodejs4-jobs template * Imported Translations from Zanata * Update hacking version * One more letter d * Change openstack-dev to openstack-discuss * Bump horizon for Stein * Change openstack-dev to openstack-discuss * Imported Translations from Zanata * Increment versioning with pbr instruction * Imported Translations from Zanata * Install horizon with upper-constraints.txt in post-install * Cleanup .zuul.yaml * switch documentation job to new PTI * import zuul job settings from project-config * Remove mox3 from doc/requirements.txt * Drop nose dependencies * Imported Translations from Zanata * Update reno for stable/rocky 5.0.0 ----- * Prepare to support python3.6 * fix tox python3 overrides 5.0.0.0b3 --------- * Add python3 django 1.11 job instead of django 2.0 job * Rename test files to test\_\* pattern * Fix postinstall for npm job * Fix tox jobs and remove tox\_helper.sh * Add py35dj20 job * Follow the new PTI for document build * Remove mox3 from test-requirements.txt * Imported Translations from Zanata * Require the (soon-to-be) Rocky version of Horizon 5.0.0.0b1 --------- * Imported Translations from Zanata * Add documentation and releasenotes links to README * Install horizon from git for tox testenv py35dj20 * Django 2.0 support * Updated from global requirements * add lower-constraints job * Install horizon directly from pypi * Updated from global requirements * Updated from global requirements * Updated from global requirements * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Replaces yaml.load() with yaml.safe\_load() * 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 * Fix for Queens rc-1 * Imported Translations from Zanata 4.0.0.0b3 --------- * Update old http links in docs * Updated from global requirements * Add .idea for pycharm into .gitignore * Updated from global requirements * Imported Translations from Zanata 4.0.0.0b2 --------- * Remove setting of version/release from releasenotes * Updated from global requirements 4.0.0.0b1 --------- * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Fix Zaqar-ui with wrong reference pbr version * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Fix queue create/update without metadata modification * Fix js test * Imported Translations from Zanata * Un-use 'scope' attribute for wizard modal service * Updated from global requirements * Imported Translations from Zanata * Update reno for stable/pike 3.0.0 ----- * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata 3.0.0.0b3 --------- * Add release notes for Pike * Fix view messages dialog * Updated from global requirements * Use pbr autodoc feature rather than custom logic * Rearrange existing documentation to fit the new standard layout * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Switch from oslosphinx to openstackdocstheme * Updated from global requirements * Improve docs build * Rename pool-flavors module * Clean up doc/ and releasenotes/ * Imported Translations from Zanata * Imported Translations from Zanata * Fix translate tag * hacking: Specify white list rules in noqa explicity * ignore nose test results * fix translation extraction 3.0.0.0b2 --------- * Updated from global requirements * Imported Translations from Zanata * Add signed url action for queue * Support post messages and get messages * Updated from global requirements * Add 'rm -f .testrepository/times.dbm' command in testenv * Updated from global requirements * Imported Translations from Zanata * Use common Angular view for Queues panel * Refresh test environment * Updated from global requirements * Imported Translations from Zanata * Imported Translations from Zanata 3.0.0.0b1 --------- * Updated from global requirements * Imported Translations from Zanata * Support purge queue * Updated from global requirements * Update to a newer hacking library * Support subscriptoin age and confirmed * Better looking to show the queue metadata * Fix queue metadata update issue * Fix filter that doesn't work properly * Fix deletion of subscriber * Updated from global requirements * Clean imports in code * Imported Translations from Zanata * Update reno for stable/ocata * Imported Translations from Zanata 2.0.0 ----- * Imported Translations from Zanata * Imported Translations from Zanata * Add CRUD actions for pool flavor * Imported Translations from Zanata * Imported Translations from Zanata 2.0.0.0b3 --------- * Add CRUD actions for pool * Imported Translations from Zanata * Add release notes for initAction * Updated from global requirements * Add reno for releasenotes management * Add pool flavors panel into admin dashboard * Add pools panel into admin dashboard * Add REST APIs for pools and flavors 2.0.0.0b2 --------- * Use initAction instead initScope * Updated from global requirements * Show team and repo badges on README * Remove mox in zaqar\_ui/test/helpers.py 2.0.0.0b1 --------- * Updated from global requirements * Imported Translations from Zanata * Change "Openstack" to "OpenStack" * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * Updated from global requirements * Add .mo to .gitignore * Add Apache 2.0 license to source file * Enable test coverage for python in tox * Fix eslint errors * Setup JavaScript test environment * Update homepage with developer documentation page * Remove \*openstack/common\* in flake8 exclude list * Setup python test environment 1.0.0 ----- * Imported Translations from Zanata 1.0.0.0b3 --------- * Updated from global requirements * Use upper constraints for all jobs in tox.ini * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * fix use of Horizon's registration service 1.0.0.0b2 --------- * Subscriber form validation * Queue and Subscriptions file renames * Imported Translations from Zanata * Ability to add and remove subscriptions * Imported Translations from Zanata * Fix typo * Remove obsolote pot files * Fix translation setup * Add subscriptions API piece * Removing unnecessary requirements * Replace deprecated library function os.popen() with subprocess * tox tests should respect upper-constraints.txt * Remove py27dj17 from tox.ini * Deprecated tox -downloadcache option removed * Remove version number to fix build * Add DevStack plugin settings * Fix styles of table views * Add update queue action * New queues does not display message count * Update use of action registration service * Removed batch action service * Remove unused pngmath Sphinx extension * Ability to delete queues * Enable auto discovery * Queues create wizard * Update URLs to Django 1.8 style * Fix H405 violations * Add queues API and table * Fixes test settings * Fix installation instruction in README.rst * Re-enabling checkout and small fixes * Zaqar-ui base project with empty queues panel * Added .gitreview ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/LICENSE0000664000175000017500000002363700000000000014456 0ustar00zuulzuul00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/MANIFEST.in0000664000175000017500000000015400000000000015174 0ustar00zuulzuul00000000000000include setup.py recursive-include zaqar_ui/content/queues/templates * recursive-include zaqar_ui/static * ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.585148 zaqar_ui-18.0.0/PKG-INFO0000644000175000017500000000616500000000000014541 0ustar00zuulzuul00000000000000Metadata-Version: 2.1 Name: zaqar-ui Version: 18.0.0 Summary: Zaqar User Interface Home-page: https://docs.openstack.org/zaqar/latest/ Author: OpenStack Author-email: openstack-discuss@lists.openstack.org Classifier: Environment :: OpenStack Classifier: Framework :: Django 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.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Requires-Python: >=3.9 License-File: LICENSE Requires-Dist: pbr!=2.1.0,>=2.0.0 Requires-Dist: python-zaqarclient>=1.0.0 Requires-Dist: horizon>=17.1.0 ======================== Team and repository tags ======================== .. image:: https://governance.openstack.org/tc/badges/zaqar-ui.svg :target: https://governance.openstack.org/tc/reference/tags/index.html .. Change things from this point on ======== Zaqar UI ======== Horizon plugin for Zaqar * Free software: Apache license * Documentation: https://docs.openstack.org/zaqar-ui/latest/ * Release notes: https://docs.openstack.org/releasenotes/zaqar-ui/ * Source: https://opendev.org/openstack/zaqar-ui * Bugs: https://bugs.launchpad.net/zaqar-ui Enabling in DevStack -------------------- Add this repo as an external repository into your ``local.conf`` file:: [[local|localrc]] enable_plugin zaqar-ui https://github.com/openstack/zaqar-ui Manual Installation ------------------- Begin by cloning the Horizon and Zaqar UI repositories:: git clone https://github.com/openstack/horizon git clone https://github.com/openstack/zaqar-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 Zaqar UI with all dependencies in your virtual environment:: tools/with_venv.sh pip install -e ../zaqar-ui/ And enable it in Horizon:: cp ../zaqar-ui/zaqar_ui/enabled/_1510_project_messaging_group.py openstack_dashboard/local/enabled cp ../zaqar-ui/zaqar_ui/enabled/_1520_project_queues.py openstack_dashboard/local/enabled To run horizon with the newly enabled Zaqar 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=1743591551.0 zaqar_ui-18.0.0/README.rst0000664000175000017500000000430700000000000015131 0ustar00zuulzuul00000000000000======================== Team and repository tags ======================== .. image:: https://governance.openstack.org/tc/badges/zaqar-ui.svg :target: https://governance.openstack.org/tc/reference/tags/index.html .. Change things from this point on ======== Zaqar UI ======== Horizon plugin for Zaqar * Free software: Apache license * Documentation: https://docs.openstack.org/zaqar-ui/latest/ * Release notes: https://docs.openstack.org/releasenotes/zaqar-ui/ * Source: https://opendev.org/openstack/zaqar-ui * Bugs: https://bugs.launchpad.net/zaqar-ui Enabling in DevStack -------------------- Add this repo as an external repository into your ``local.conf`` file:: [[local|localrc]] enable_plugin zaqar-ui https://github.com/openstack/zaqar-ui Manual Installation ------------------- Begin by cloning the Horizon and Zaqar UI repositories:: git clone https://github.com/openstack/horizon git clone https://github.com/openstack/zaqar-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 Zaqar UI with all dependencies in your virtual environment:: tools/with_venv.sh pip install -e ../zaqar-ui/ And enable it in Horizon:: cp ../zaqar-ui/zaqar_ui/enabled/_1510_project_messaging_group.py openstack_dashboard/local/enabled cp ../zaqar-ui/zaqar_ui/enabled/_1520_project_queues.py openstack_dashboard/local/enabled To run horizon with the newly enabled Zaqar 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=1743591551.0 zaqar_ui-18.0.0/babel-django.cfg0000664000175000017500000000005400000000000016423 0ustar00zuulzuul00000000000000[python: **.py] [django: templates/**.html] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/babel-djangojs.cfg0000664000175000017500000000006100000000000016756 0ustar00zuulzuul00000000000000[javascript: **.js] [angular: **/static/**.html] ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.557146 zaqar_ui-18.0.0/devstack/0000775000175000017500000000000000000000000015242 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/devstack/plugin.sh0000664000175000017500000000364400000000000017103 0ustar00zuulzuul00000000000000# plugin.sh - DevStack plugin.sh dispatch script zaqar-ui ZAQAR_UI_DIR=$(cd $(dirname $BASH_SOURCE)/.. && pwd) function install_zaqar_ui { # NOTE(shu-mutou): workaround for devstack bug: 1540328 # where devstack install 'test-requirements' but should not do it # for zaqar-ui project as it installs Horizon from url. # Remove following two 'mv' commands when mentioned bug is fixed. mv $ZAQAR_UI_DIR/test-requirements.txt $ZAQAR_UI_DIR/_test-requirements.txt setup_develop ${ZAQAR_UI_DIR} mv $ZAQAR_UI_DIR/_test-requirements.txt $ZAQAR_UI_DIR/test-requirements.txt } function configure_zaqar_ui { #cp -a ${ZAQAR_UI_DIR}/zaqar_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 ${ZAQAR_UI_DIR}/zaqar_ui/locale ]; then (cd ${ZAQAR_UI_DIR}/zaqar_ui; DJANGO_SETTINGS_MODULE=openstack_dashboard.settings ../manage.py compilemessages) fi } # check for service enabled if is_service_enabled zaqar-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 Zaqar UI" install_zaqar_ui elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then # Configure after the other layer 1 and 2 services have been configured echo_summary "Configuring Zaqar UI" configure_zaqar_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=1743591551.0 zaqar_ui-18.0.0/devstack/settings0000664000175000017500000000007500000000000017027 0ustar00zuulzuul00000000000000# settings file for zaqar-ui plugin enable_service zaqar-ui ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.557146 zaqar_ui-18.0.0/doc/0000775000175000017500000000000000000000000014203 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/doc/requirements.txt0000664000175000017500000000020000000000000017457 0ustar00zuulzuul00000000000000openstackdocstheme>=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 ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.557146 zaqar_ui-18.0.0/doc/source/0000775000175000017500000000000000000000000015503 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/doc/source/conf.py0000664000175000017500000002407700000000000017014 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() 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', 'openstack_dashboard.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', 'sphinxcontrib.apidoc', 'openstackdocstheme', ] # Add any paths that contain templates here, relative to this directory. # templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Zaqar UI' copyright = u'2015, Catalyst IT Ltd' # 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 = '../../zaqar_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/zaqar-ui' openstackdocs_auto_name = False openstackdocs_bug_project = 'zaqar-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. # 'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass # [howto/manual]). latex_documents = [ ('index', 'Horizon.tex', u'Horizon Documentation', u'OpenStack Foundation', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output ------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', u'Zaqar UI Documentation', 'Documentation for the Zaqar UI plugin to the OpenStack\ Dashboard (Horizon)', [u'OpenStack'], 1) ] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for Texinfo output ----------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'Horizon', u'Horizon Documentation', u'OpenStack', 'Horizon', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' # -- Options for Epub output -------------------------------------------------- # Bibliographic Dublin Core info. epub_title = u'Horizon' epub_author = u'OpenStack' epub_publisher = u'OpenStack' epub_copyright = u'2012, OpenStack' # The language of the text. It defaults to the language option # or en if the language is not set. # epub_language = '' # The scheme of the identifier. Typical schemes are ISBN or URL. # epub_scheme = '' # The unique identifier of the text. This can be an ISBN number # or the project homepage. # epub_identifier = '' # A unique identification for the text. # epub_uid = '' # A tuple containing the cover image and cover page html template filenames. # epub_cover = () # HTML files that should be inserted before the pages created by sphinx. # The format is a list of tuples containing the path and title. # epub_pre_files = [] # HTML files shat should be inserted after the pages created by sphinx. # The format is a list of tuples containing the path and title. # epub_post_files = [] # A list of files that should not be packed into the epub file. # epub_exclude_files = [] # The depth of the table of contents in toc.ncx. # epub_tocdepth = 3 # Allow duplicate toc entries. # epub_tocdup = True ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.557146 zaqar_ui-18.0.0/doc/source/configuration/0000775000175000017500000000000000000000000020352 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/doc/source/configuration/index.rst0000664000175000017500000000035300000000000022214 0ustar00zuulzuul00000000000000============= Configuration ============= Zaqar UI has no configuration option. For more configurations, see `Configuration Guide `__ in the Horizon documentation. ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.557146 zaqar_ui-18.0.0/doc/source/contributor/0000775000175000017500000000000000000000000020055 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/doc/source/contributor/api.rst0000664000175000017500000000016400000000000021361 0ustar00zuulzuul00000000000000===================== Source Code Reference ===================== .. toctree:: :maxdepth: 1 :glob: api/* ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/doc/source/contributor/index.rst0000664000175000017500000000047700000000000021726 0ustar00zuulzuul00000000000000================= Contributor Guide ================= There is no topic specific to Zaqar UI now. See `Horizon Contributor Documentation `__ for general topic on developing a dashboard on horizon. ---- .. toctree:: :glob: :maxdepth: 1 api ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/doc/source/index.rst0000664000175000017500000000071000000000000017342 0ustar00zuulzuul00000000000000======== Zaqar UI ======== Horizon plugin for Zaqar * Free software: Apache license * Source: https://opendev.org/openstack/zaqar-ui * Bugs: https://bugs.launchpad.net/zaqar-ui User Documentation ------------------ .. toctree:: :maxdepth: 2 install/index configuration/index Release Notes Contributor Guide ----------------- .. toctree:: :glob: :maxdepth: 2 contributor/index ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.557146 zaqar_ui-18.0.0/doc/source/install/0000775000175000017500000000000000000000000017151 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/doc/source/install/index.rst0000664000175000017500000000270100000000000021012 0ustar00zuulzuul00000000000000============ Installation ============ Enabling in DevStack -------------------- Add this repo as an external repository into your ``local.conf`` file:: [[local|localrc]] enable_plugin zaqar-ui https://github.com/openstack/zaqar-ui Manual Installation ------------------- Begin by cloning the Horizon and Zaqar UI repositories:: git clone https://github.com/openstack/horizon git clone https://github.com/openstack/zaqar-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 Zaqar UI with all dependencies in your virtual environment:: tools/with_venv.sh pip install -e ../zaqar-ui/ And enable it in Horizon:: cp ../zaqar-ui/enabled/_1510_messaging_panel_group.py openstack_dashboard/local/enabled cp ../zaqar-ui/enabled/_1520_zaqar_project_queues.py openstack_dashboard/local/enabled ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/manage.py0000775000175000017500000000147600000000000015253 0ustar00zuulzuul00000000000000#!/usr/bin/env python # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import os import sys from django.core.management import execute_from_command_line if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "openstack_dashboard.settings") execute_from_command_line(sys.argv) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/package.json0000664000175000017500000000173400000000000015731 0ustar00zuulzuul00000000000000{ "name": "zaqar-ui", "description": "Zaqar UI JavaScript tests", "repository": { "type": "git", "url": "https://opendev.org/openstack/zaqar-ui" }, "version": "0.0.0", "private": true, "license": "Apache 2.0", "author": "Openstack ", "devDependencies": { "eslint": "^1.10.3", "eslint-config-openstack": "^1.2.4", "eslint-plugin-angular": "1.0.1", "jasmine-core": "2.4.1", "karma": "1.1.2", "karma-firefox-launcher": "2.1.0", "karma-cli": "1.0.1", "karma-coverage": "1.1.1", "karma-jasmine": "1.0.2", "karma-ng-html2js-preprocessor": "1.0.0", "karma-threshold-reporter": "0.1.15" }, "dependencies": {}, "scripts": { "postinstall": "if [ ! -d .tox ] || [ ! -d .tox/karma ]; then tox -ekarma --notest; fi", "lint": "eslint --no-color zaqar_ui/static", "lintq": "eslint --quiet zaqar_ui/static", "test": "karma start zaqar_ui/karma.conf.js --single-run" } } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.545145 zaqar_ui-18.0.0/releasenotes/0000775000175000017500000000000000000000000016127 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5611463 zaqar_ui-18.0.0/releasenotes/notes/0000775000175000017500000000000000000000000017257 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/notes/.placeholder0000664000175000017500000000000000000000000021530 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/notes/add-reno-73ba99b04ff2e5c8.yaml0000664000175000017500000000007200000000000024140 0ustar00zuulzuul00000000000000--- other: - Switch to reno for managing release notes. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/notes/drop-py-2-7-d9e918f5c9f3bb33.yaml0000664000175000017500000000031100000000000024346 0ustar00zuulzuul00000000000000--- upgrade: - | Python 2.7 support has been dropped. Last release of zaqar-ui to support py2.7 is OpenStack Train. The minimum version of Python now supported by zaqar-ui is Python 3.6. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/notes/init-action-fe41bfe3e2473364.yaml0000664000175000017500000000022500000000000024577 0ustar00zuulzuul00000000000000--- features: - > Use initAction() instead initScope(). initScope() is deprecated from Horizon in Ocata and will be removed in Queens. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/notes/pike-9c813ecd64a1e2f2.yaml0000664000175000017500000000267500000000000023401 0ustar00zuulzuul00000000000000--- features: - > [`blueprint format-queue-metadata `_] Show the queue metadata as each items in drawer. - > [`blueprint subscription-confirmation `_] Support subscription age and confirmed. This shows age and confirmation for subscription. - > [`blueprint purge-queue `_] Support purge queue. This allows user to purge a queue to remove all the messages and subscriptions. - > [`blueprint post-get-messages `_] Support post messages and get messages. "Post Messages" and "View Messages" actions are added. - > [`blueprint support-presigned-queue `_] Support signed url. "Signed URL" action for queue is added. fixes: - > [`bug/1664374 `_] Use AngularIndexView for queues panel. Also, this fixes to show breadcrumb properly. upgrade: - > Support python 3.5. - > Use only tox for test and remove run_tests.sh that is no longer used. - > Switch theme for documentation from oslosphinx to openstackdocstheme. - > Use pbr autodoc feature rather than custom logic. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/notes/pool-flavor-panel-acf61d32e34246f2.yaml0000664000175000017500000000041400000000000025706 0ustar00zuulzuul00000000000000--- features: - > Storage pool flavors management panel is added. This panel is added into Admin dashboard. Also create, update and delete actions are implemeted. Create action is implemented as globalAction, so it is callable from other panels. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/notes/pool-panel-020bf94bc34b4cd8.yaml0000664000175000017500000000040500000000000024475 0ustar00zuulzuul00000000000000--- features: - > Storage pools management panel is added. This panel is added into Admin dashboard. Also create, update and delete actions are implemeted. Create action is implemented as globalAction, so it is callable from other panels. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/notes/queens-ae86cb21aebaadfd.yaml0000664000175000017500000000036400000000000024307 0ustar00zuulzuul00000000000000--- fixes: - > [`bug/1647995 `_] Fixed queue create/update without metadata modification. When metadata is not modified in queue create/update, the operation had been failed. ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5651467 zaqar_ui-18.0.0/releasenotes/source/0000775000175000017500000000000000000000000017427 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/2023.1.rst0000664000175000017500000000021000000000000020677 0ustar00zuulzuul00000000000000=========================== 2023.1 Series Release Notes =========================== .. release-notes:: :branch: unmaintained/2023.1 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/2023.2.rst0000664000175000017500000000020200000000000020701 0ustar00zuulzuul00000000000000=========================== 2023.2 Series Release Notes =========================== .. release-notes:: :branch: stable/2023.2 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/2024.1.rst0000664000175000017500000000020200000000000020701 0ustar00zuulzuul00000000000000=========================== 2024.1 Series Release Notes =========================== .. release-notes:: :branch: stable/2024.1 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/2024.2.rst0000664000175000017500000000020200000000000020702 0ustar00zuulzuul00000000000000=========================== 2024.2 Series Release Notes =========================== .. release-notes:: :branch: stable/2024.2 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/conf.py0000664000175000017500000002116200000000000020730 0ustar00zuulzuul00000000000000# -*- coding: utf-8 -*- # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.insert(0, os.path.abspath('.')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'openstackdocstheme', 'reno.sphinxext', ] # Add any paths that contain templates here, relative to this directory. # templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Zaqar UI Release Notes' copyright = u'2017, Zaqar UI Developers' # Release notes are version independent. # The full version, including alpha/beta/rc tags. release = '' # The short X.Y version. version = '' # 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 = [] # If true, keep warnings as "system message" paragraphs in the built documents. # keep_warnings = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'openstackdocs' # openstackdocstheme options openstackdocs_repo_name = 'openstack/zaqar-ui' openstackdocs_auto_name = False openstackdocs_bug_project = 'zaqar-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 = [''] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. # html_extra_path = [] # If 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 = 'ZaqarUIReleaseNotesDoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # 'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ('index', 'ZaqarUIReleaseNotes.tex', u'Zaqar UI Release Notes Documentation', u'Zaqar UI Developers', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'ZaqarUIReleaseNotes', u'Zaqar UI Release Notes Documentation', [u'Zaqar UI Developers'], 1) ] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'ZaqarUIReleaseNotes', u'Zaqar UI Release Notes Documentation', u'Zaqar UI Developers', 'ZaqarUIReleaseNotes', 'User Interface for Zaqar.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. # texinfo_no_detailmenu = False # -- Options for Internationalization output ------------------------------ locale_dirs = ['locale/'] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/releasenotes/source/index.rst0000664000175000017500000000041700000000000021272 0ustar00zuulzuul00000000000000======================== Zaqar UI Release Notes ======================== .. toctree:: :maxdepth: 1 unreleased 2024.2 2024.1 2023.2 2023.1 zed yoga xena wallaby victoria ussuri train stein rocky queens pike ocata ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.545145 zaqar_ui-18.0.0/releasenotes/source/locale/0000775000175000017500000000000000000000000020666 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.545145 zaqar_ui-18.0.0/releasenotes/source/locale/de/0000775000175000017500000000000000000000000021256 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5651467 zaqar_ui-18.0.0/releasenotes/source/locale/de/LC_MESSAGES/0000775000175000017500000000000000000000000023043 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/locale/de/LC_MESSAGES/releasenotes.po0000664000175000017500000001553500000000000026105 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2017. #zanata # Robert Simai , 2017. #zanata # Robert Simai , 2018. #zanata # Andreas Jaeger , 2019. #zanata # Andreas Jaeger , 2020. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-16 23:58+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2020-04-25 09:32+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 "2.0.0" msgstr "2.0.0" msgid "3.0.0" msgstr "3.0.0" msgid "4.0.0" msgstr "4.0.0" msgid "Bug Fixes" msgstr "Fehlerkorrekturen" msgid "Current Series Release Notes" msgstr "Aktuelle Serie Releasenotes" msgid "New Features" msgstr "Neue Features" msgid "Ocata Series Release Notes" msgstr "Ocata Serie Releasenotes" msgid "Other Notes" msgstr "Andere Notizen" msgid "Pike Series Release Notes" msgstr "Pike Serie Release Notes" msgid "" "Python 2.7 support has been dropped. Last release of zaqar-ui to support " "py2.7 is OpenStack Train. The minimum version of Python now supported by " "zaqar-ui is Python 3.6." msgstr "" "Python 2.7 Unterstützung wurde beendet. Der letzte Release von zaqar-ui, " "welcher Python 2.7 unterstützt, ist OpenStack Train. Die minimal Python " "Version, welche von zaqar-ui unterstützt wird, ist Python 3.6." msgid "Queens Series Release Notes" msgstr "Queens Serie Releasenotes" msgid "Rocky Series Release Notes" msgstr "Rocky Serie Releasenotes" msgid "Stein Series Release Notes" msgstr "Stein Serie Releasenotes" msgid "" "Storage pool flavors management panel is added. This panel is added into " "Admin dashboard. Also create, update and delete actions are implemeted. " "Create action is implemented as globalAction, so it is callable from other " "panels." msgstr "" "Management-Paneel für Storage-Pool-Varianten wurde zum Admin Dashboard " "hinzugefügt. Aktionen zum erstellen, aktualisieren und löschen sind " "implementiert. Die Erstell-Aktion ist als globalAction angelegt, so dass sie " "von anderen Paneelen aufgerufen werden kann. " msgid "" "Storage pools management panel is added. This panel is added into Admin " "dashboard. Also create, update and delete actions are implemeted. Create " "action is implemented as globalAction, so it is callable from other panels." msgstr "" "Management-Paneel für Storage-Pools wurde zum Admin Dashboard hinzugefügt. " "Aktionen zum erstellen, aktualisieren und löschen sind implementiert. Die " "Erstell-Aktion ist als globalAction angelegt, so dass sie von anderen " "Paneelen aufgerufen werden kann. " msgid "Support python 3.5." msgstr "Unterstützung für Python 3.5." msgid "Switch theme for documentation from oslosphinx to openstackdocstheme." msgstr "" "Motiv der Dokumentation von oslosphinx nach openstackdocstheme gewechselt." msgid "Switch to reno for managing release notes." msgstr "Reno wird für die Verwaltung der Releasenotes verwendet." msgid "Train Series Release Notes" msgstr "Train Serie Releasenotes" msgid "Upgrade Notes" msgstr "Aktualisierungsnotizen" msgid "" "Use initAction() instead initScope(). initScope() is deprecated from Horizon " "in Ocata and will be removed in Queens." msgstr "" "Verwenden Sie initAction() an Stelle von initScope(). initScope() ist " "veraltet für Horizon in Ocata und wird in Queens entfernt werden." msgid "Use only tox for test and remove run_tests.sh that is no longer used." msgstr "" "Nur verwenden von tox zum testen und entfernen von run_tests.sh, welches " "nicht mehr benötigt wird." msgid "Use pbr autodoc feature rather than custom logic." msgstr "Verwendung der pbr autodoc-Funktion anstatt benutzerdefinierter Logik." msgid "Zaqar UI Release Notes" msgstr "Zaqar UI Releasenotes" msgid "" "[`blueprint format-queue-metadata `_] Show the queue metadata as each items in " "drawer." msgstr "" "[`blueprint format-queue-metadata `_] Zeige die Queue Metadaten als Einzelheiten " "in drawer." msgid "" "[`blueprint post-get-messages `_] Support post messages and get messages. \"Post " "Messages\" and \"View Messages\" actions are added." msgstr "" "[`blueprint post-get-messages `_] Unterstützung für post und get von Nachrichten. " "\"Post Messages\" und \"View Messages\" Aktionen hinzugefügt." msgid "" "[`blueprint purge-queue `_] Support purge queue. This allows user to purge a queue to " "remove all the messages and subscriptions." msgstr "" "[`blueprint purge-queue `_] Unterstützung zum Bereinigen der Queue. Dies erlaubt allen " "Benutzern das Bereinigen der Queue sowie das Entfernen aller Nachrichten und " "Subskriptrionen." msgid "" "[`blueprint subscription-confirmation `_] Support subscription age and " "confirmed. This shows age and confirmation for subscription." msgstr "" "[`Blueprint subscription-confirmation `_] Unterstützung für Subscription " "Alter und Bestätigung. Dies zeigt Alter und Bestätigung für Subscriptions." msgid "" "[`blueprint support-presigned-queue `_] Support signed url. \"Signed URL\" " "action for queue is added." msgstr "" "[`Blueprint support-presigned-queue `_] Unterstützung für signierte URL. " "\"Signierte URL\" Aktion zu Queue hinzugefügt." msgid "" "[`bug/1647995 `_] Fixed " "queue create/update without metadata modification. When metadata is not " "modified in queue create/update, the operation had been failed." msgstr "" "[`bug/1647995 `_] Queue " "erstellen/aktualisieren ohne Metadatenänderung gefixt. Wenn Metadaten beim " "Queue erstellen/aktualisieren nicht verändert werden, schlägt die Operation " "fehl." msgid "" "[`bug/1664374 `_] Use " "AngularIndexView for queues panel. Also, this fixes to show breadcrumb " "properly." msgstr "" "[`bug/1664374 `_] Verwende " "AngularIndexView für Queues Paneel. Dies löst auch einen Fehler bei der " "Anzeige von Breadcrumb." ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.545145 zaqar_ui-18.0.0/releasenotes/source/locale/en_GB/0000775000175000017500000000000000000000000021640 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5651467 zaqar_ui-18.0.0/releasenotes/source/locale/en_GB/LC_MESSAGES/0000775000175000017500000000000000000000000023425 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po0000664000175000017500000001635600000000000026471 0ustar00zuulzuul00000000000000# Andi Chandler , 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: Zaqar UI Release Notes\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-03-19 12:53+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:20+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 "2.0.0" msgstr "2.0.0" msgid "2023.1 Series Release Notes" msgstr "2023.1 Series Release Notes" msgid "2023.2 Series Release Notes" msgstr "2023.2 Series Release Notes" msgid "2024.1 Series Release Notes" msgstr "2024.1 Series Release Notes" msgid "3.0.0" msgstr "3.0.0" msgid "4.0.0" msgstr "4.0.0" msgid "8.0.0" msgstr "8.0.0" msgid "Bug Fixes" msgstr "Bug Fixes" msgid "Current Series Release Notes" msgstr "Current Series Release Notes" msgid "New Features" msgstr "New Features" msgid "Ocata Series Release Notes" msgstr "Ocata Series Release Notes" msgid "Other Notes" msgstr "Other Notes" msgid "Pike Series Release Notes" msgstr "Pike Series Release Notes" msgid "" "Python 2.7 support has been dropped. Last release of zaqar-ui to support " "py2.7 is OpenStack Train. The minimum version of Python now supported by " "zaqar-ui is Python 3.6." msgstr "" "Python 2.7 support has been dropped. Last release of Zaqar-ui to support " "Python 2.7 is OpenStack Train. The minimum version of Python now supported " "by Zaqar-ui is Python 3.6." msgid "Queens Series Release Notes" msgstr "Queens Series Release Notes" msgid "Rocky Series Release Notes" msgstr "Rocky Series Release Notes" msgid "Stein Series Release Notes" msgstr "Stein Series Release Notes" msgid "" "Storage pool flavors management panel is added. This panel is added into " "Admin dashboard. Also create, update and delete actions are implemeted. " "Create action is implemented as globalAction, so it is callable from other " "panels." msgstr "" "Storage pool flavours management panel is added. This panel is added into " "Admin dashboard. Also create, update and delete actions are implemented. " "Create action is implemented as globalAction, so it is callable from other " "panels." msgid "" "Storage pools management panel is added. This panel is added into Admin " "dashboard. Also create, update and delete actions are implemeted. Create " "action is implemented as globalAction, so it is callable from other panels." msgstr "" "Storage pools management panel is added. This panel is added into Admin " "dashboard. Also create, update and delete actions are implemented. Create " "action is implemented as globalAction, so it is callable from other panels." msgid "Support python 3.5." msgstr "Support python 3.5." msgid "Switch theme for documentation from oslosphinx to openstackdocstheme." msgstr "Switch theme for documentation from oslosphinx to openstackdocstheme." msgid "Switch to reno for managing release notes." msgstr "Switch to reno for managing release notes." msgid "Train Series Release Notes" msgstr "Train Series Release Notes" msgid "Upgrade Notes" msgstr "Upgrade Notes" msgid "" "Use initAction() instead initScope(). initScope() is deprecated from Horizon " "in Ocata and will be removed in Queens." msgstr "" "Use initAction() instead initScope(). initScope() is deprecated from Horizon " "in Ocata and will be removed in Queens." msgid "Use only tox for test and remove run_tests.sh that is no longer used." msgstr "Use only tox for test and remove run_tests.sh that is no longer used." msgid "Use pbr autodoc feature rather than custom logic." msgstr "Use pbr autodoc feature rather than custom logic." msgid "Ussuri Series Release Notes" msgstr "Ussuri Series Release Notes" msgid "Victoria Series Release Notes" msgstr "Victoria Series Release Notes" msgid "Wallaby Series Release Notes" msgstr "Wallaby Series Release Notes" msgid "Xena Series Release Notes" msgstr "Xena Series Release Notes" msgid "Yoga Series Release Notes" msgstr "Yoga Series Release Notes" msgid "Zaqar UI Release Notes" msgstr "Zaqar UI Release Notes" msgid "Zed Series Release Notes" msgstr "Zed Series Release Notes" msgid "" "[`blueprint format-queue-metadata `_] Show the queue metadata as each items in " "drawer." msgstr "" "[`blueprint format-queue-metadata `_] Show the queue metadata as each items in " "drawer." msgid "" "[`blueprint post-get-messages `_] Support post messages and get messages. \"Post " "Messages\" and \"View Messages\" actions are added." msgstr "" "[`blueprint post-get-messages `_] Support post messages and get messages. \"Post " "Messages\" and \"View Messages\" actions are added." msgid "" "[`blueprint purge-queue `_] Support purge queue. This allows user to purge a queue to " "remove all the messages and subscriptions." msgstr "" "[`blueprint purge-queue `_] Support purge queue. This allows user to purge a queue to " "remove all the messages and subscriptions." msgid "" "[`blueprint subscription-confirmation `_] Support subscription age and " "confirmed. This shows age and confirmation for subscription." msgstr "" "[`blueprint subscription-confirmation `_] Support subscription age and " "confirmed. This shows age and confirmation for subscription." msgid "" "[`blueprint support-presigned-queue `_] Support signed url. \"Signed URL\" " "action for queue is added." msgstr "" "[`blueprint support-presigned-queue `_] Support signed url. \"Signed URL\" " "action for queue is added." msgid "" "[`bug/1647995 `_] Fixed " "queue create/update without metadata modification. When metadata is not " "modified in queue create/update, the operation had been failed." msgstr "" "[`bug/1647995 `_] Fixed " "queue create/update without metadata modification. When metadata is not " "modified in queue create/update, the operation had been failed." msgid "" "[`bug/1664374 `_] Use " "AngularIndexView for queues panel. Also, this fixes to show breadcrumb " "properly." msgstr "" "[`bug/1664374 `_] Use " "AngularIndexView for queues panel. Also, this fixes to show breadcrumb " "properly." ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.545145 zaqar_ui-18.0.0/releasenotes/source/locale/fr/0000775000175000017500000000000000000000000021275 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5651467 zaqar_ui-18.0.0/releasenotes/source/locale/fr/LC_MESSAGES/0000775000175000017500000000000000000000000023062 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po0000664000175000017500000000206500000000000026116 0ustar00zuulzuul00000000000000# Loic Nicolle , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: Zaqar UI Release Notes 3.0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-10-06 01:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-10-09 07:35+0000\n" "Last-Translator: Loic Nicolle \n" "Language-Team: French\n" "Language: fr\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" msgid "2.0.0" msgstr "2.0.0" msgid "3.0.0" msgstr "3.0.0" msgid "Bug Fixes" msgstr "Corrections de bugs" msgid "Current Series Release Notes" msgstr "Note de la release actuelle" msgid "New Features" msgstr "Nouvelles fonctionnalités" msgid "Ocata Series Release Notes" msgstr "Note de release pour Ocata" msgid "Other Notes" msgstr "Autres notes" msgid "Pike Series Release Notes" msgstr "Note de release pour Pike" msgid "Upgrade Notes" msgstr "Notes de mises à jours" msgid "Zaqar UI Release Notes" msgstr "Note de release pour Zaqar UI" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.545145 zaqar_ui-18.0.0/releasenotes/source/locale/id/0000775000175000017500000000000000000000000021262 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5651467 zaqar_ui-18.0.0/releasenotes/source/locale/id/LC_MESSAGES/0000775000175000017500000000000000000000000023047 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/locale/id/LC_MESSAGES/releasenotes.po0000664000175000017500000001403600000000000026104 0ustar00zuulzuul00000000000000# suhartono , 2017. #zanata # suhartono , 2018. #zanata # suhartono , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-01-09 09:35+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:51+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 "2.0.0" msgstr "2.0.0" msgid "3.0.0" msgstr "3.0.0" msgid "4.0.0" msgstr "4.0.0" msgid "Bug Fixes" msgstr "Perbaikan bug" msgid "Current Series Release Notes" msgstr "Catatan rilis seri saat ini" msgid "New Features" msgstr "Fitur baru" msgid "Ocata Series Release Notes" msgstr "Ocata Series Release Notes" msgid "Other Notes" msgstr "Catatan lainnya" msgid "Pike Series Release Notes" msgstr "Catatan Rilis Seri Pike" msgid "Queens Series Release Notes" msgstr "Catatan Rilis Seri Queen" msgid "Rocky Series Release Notes" msgstr "Rocky Series Release Notes" msgid "" "Storage pool flavors management panel is added. This panel is added into " "Admin dashboard. Also create, update and delete actions are implemeted. " "Create action is implemented as globalAction, so it is callable from other " "panels." msgstr "" "Panel manajemen flavor kolam penyimpanan ditambahkan. Panel ini ditambahkan " "ke dalam dashboard Admin. Juga pembuatan, pembaharuan dan penghapusan " "tindakan dilaksanakan. Buat tindakan yang diimplementasikan sebagai " "globalAction, sehingga hal itu menjadi callable dari panel lainnya." msgid "" "Storage pools management panel is added. This panel is added into Admin " "dashboard. Also create, update and delete actions are implemeted. Create " "action is implemented as globalAction, so it is callable from other panels." msgstr "" "Panel manajemen kolam penyimpanan ditambahkan. Panel ini ditambahkan ke " "dalam dashboard Admin. Juga pembuatan, pembaharuan dan penghapusan tindakan " "dilaksanakan. Buat tindakan yang diimplementasikan sebagai globalAction, " "sehingga hal itu menjadi callable dari panel lainnya." msgid "Support python 3.5." msgstr "Dukungan python 3.5." msgid "Switch theme for documentation from oslosphinx to openstackdocstheme." msgstr "Beralih tema untuk dokumentasi dari oslosphinx ke openstackdocstheme." msgid "Switch to reno for managing release notes." msgstr "Switch ke Reno untuk mengelola catatan rilis." msgid "Upgrade Notes" msgstr "Catatan Upgrade" msgid "" "Use initAction() instead initScope(). initScope() is deprecated from Horizon " "in Ocata and will be removed in Queens." msgstr "" "Gunakan initAction() bukannya initScope(). initScope() sudah ditinggalkan " "dari Horizon di Ocata dan akan dihapus di Queens." msgid "Use only tox for test and remove run_tests.sh that is no longer used." msgstr "" "Gunakan hanya tox for test dan hapus run_tests.sh yang sudah tidak digunakan " "lagi." msgid "Use pbr autodoc feature rather than custom logic." msgstr "Gunakan fitur autodoc pbr daripada custom logic." msgid "Zaqar UI Release Notes" msgstr "Catatan Rilis Zaqar UI" msgid "" "[`blueprint format-queue-metadata `_] Show the queue metadata as each items in " "drawer." msgstr "" "[`blueprint format-queue-metadata ` _] Tunjukkan queue metadata setiap item dalam " "drawer." msgid "" "[`blueprint post-get-messages `_] Support post messages and get messages. \"Post " "Messages\" and \"View Messages\" actions are added." msgstr "" "[`blueprint post-get-messages `_] Dukung post messages and get messages. Tindakan " "\"Post Messages\" dan \"View Messages\" ditambahkan." msgid "" "[`blueprint purge-queue `_] Support purge queue. This allows user to purge a queue to " "remove all the messages and subscriptions." msgstr "" "[`blueprint purge-queue `_] Mendukung purge queue. Hal ini memungkinkan pengguna " "membersihkan antrian untuk menghapus semua messages dan subscriptions." msgid "" "[`blueprint subscription-confirmation `_] Support subscription age and " "confirmed. This shows age and confirmation for subscription." msgstr "" "[`blueprint subscription-confirmation `_] Dukung subscription age dan " "konfirmasi. Ini menunjukkan usia dan konfirmasi untuk subscription." msgid "" "[`blueprint support-presigned-queue `_] Support signed url. \"Signed URL\" " "action for queue is added." msgstr "" "[`blueprint support-presigned-queue `_] Dukungan signed url. Tindakan \"Signed " "URL\" untuk antrean ditambahkan." msgid "" "[`bug/1647995 `_] Fixed " "queue create/update without metadata modification. When metadata is not " "modified in queue create/update, the operation had been failed." msgstr "" "[`bug/1647995 `_] Create/" "update antrean perbaikan tanpa modifikasi metadata. Ketika metadata tidak " "diubah dalam create/update antrean, operasi telah gagal." msgid "" "[`bug/1664374 `_] Use " "AngularIndexView for queues panel. Also, this fixes to show breadcrumb " "properly." msgstr "" "[`bug/1664374 `_] Gunakan " "AngularIndexView untuk panel antrian. Selain itu, perbaikan ini menunjukkan " "breadcrumb dengan benar." ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.545145 zaqar_ui-18.0.0/releasenotes/source/locale/ja/0000775000175000017500000000000000000000000021260 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5651467 zaqar_ui-18.0.0/releasenotes/source/locale/ja/LC_MESSAGES/0000775000175000017500000000000000000000000023045 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/locale/ja/LC_MESSAGES/releasenotes.po0000664000175000017500000001611300000000000026100 0ustar00zuulzuul00000000000000# Shu Muto , 2017. #zanata # Shu Muto , 2018. #zanata # Shu Muto , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-03-25 04:09+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-03-27 02:12+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 "2.0.0" msgstr "2.0.0" msgid "3.0.0" msgstr "3.0.0" msgid "4.0.0" msgstr "4.0.0" msgid "Bug Fixes" msgstr "バグ修正" msgid "Current Series Release Notes" msgstr "開発中バージョンのリリースノート" msgid "New Features" msgstr "新機能" msgid "Ocata Series Release Notes" msgstr "Ocata バージョンのリリースノート" msgid "Other Notes" msgstr "その他の注意点" msgid "Pike Series Release Notes" msgstr "Pike バージョンのリリースノート" msgid "Queens Series Release Notes" msgstr "Queens バージョンのリリースノート" msgid "Rocky Series Release Notes" msgstr "Rocky バージョンのリリースノート" msgid "Stein Series Release Notes" msgstr "Stein バージョンのリリースノート" msgid "" "Storage pool flavors management panel is added. This panel is added into " "Admin dashboard. Also create, update and delete actions are implemeted. " "Create action is implemented as globalAction, so it is callable from other " "panels." msgstr "" "ストレージプールのフレーバー管理パネルが追加されました。このパネルは管理ダッ" "シュボードに追加されています。また、作成、更新、および削除アクションが実装さ" "れました。作成アクションはグローバルアクションとして実装されており、他のパネ" "ルから呼び出し可能です。" msgid "" "Storage pools management panel is added. This panel is added into Admin " "dashboard. Also create, update and delete actions are implemeted. Create " "action is implemented as globalAction, so it is callable from other panels." msgstr "" "ストレージのプール管理パネルが追加されました。このパネルは管理ダッシュボード" "に追加されています。また、作成、更新、および削除アクションが実装されました。" "作成アクションはグローバルアクションとして実装されており、他のパネルから呼び" "出し可能です。" msgid "Support python 3.5." msgstr "Python 3.5 をサポートしました。" msgid "Switch theme for documentation from oslosphinx to openstackdocstheme." msgstr "" "ドキュメントサイトのテーマを oslosphinx から openstackdocstheme に変更しまし" "た。" msgid "Switch to reno for managing release notes." msgstr "リリースノートの管理を reno に切り替えました。" msgid "Upgrade Notes" msgstr "アップグレード時の注意" msgid "" "Use initAction() instead initScope(). initScope() is deprecated from Horizon " "in Ocata and will be removed in Queens." msgstr "" "initScope 関数の代わりに、 initAction 関数を使用します。initScope 関数は、 " "Horizon において Ocata で非推奨になり、 Queens で削除される予定です。" msgid "Use only tox for test and remove run_tests.sh that is no longer used." msgstr "" "テストには tox のみを使用し、使用されなくなった run_test.sh を削除しました。" msgid "Use pbr autodoc feature rather than custom logic." msgstr "pbr の autodoc 機能を使用し、独自のロジックを排除しました。" msgid "Zaqar UI Release Notes" msgstr "Zaqar UI リリースノート" msgid "" "[`blueprint format-queue-metadata `_] Show the queue metadata as each items in " "drawer." msgstr "" "[`blueprint format-queue-metadata `_] キューのメタデータの各アイテムをテーブル行の" "拡張に表示しました。" msgid "" "[`blueprint post-get-messages `_] Support post messages and get messages. \"Post " "Messages\" and \"View Messages\" actions are added." msgstr "" "[`blueprint post-get-messages `_] メッセージ送信とメッセージ取得をサポートしまし" "た。「メッセージの送信」と「メッセージ一覧の閲覧」アクションを追加しました。" msgid "" "[`blueprint purge-queue `_] Support purge queue. This allows user to purge a queue to " "remove all the messages and subscriptions." msgstr "" "[`blueprint purge-queue `_] キューを空にする機能をサポートしました。キューにあるすべての" "メッセージとサブスクリプションを削除するために、キューを空にすることができま" "す。" msgid "" "[`blueprint subscription-confirmation `_] Support subscription age and " "confirmed. This shows age and confirmation for subscription." msgstr "" "[`blueprint subscription-confirmation `_] サブスクリプションの保存期間や確" "認状態をサポートしました。サブスクリプションの保存期間や確認状態を表示するよ" "うにしました。" msgid "" "[`blueprint support-presigned-queue `_] Support signed url. \"Signed URL\" " "action for queue is added." msgstr "" "[`blueprint support-presigned-queue `_] 署名済み URL をサポートしました。キュー" "に「署名済み URL」アクションをついかしました。" msgid "" "[`bug/1647995 `_] Fixed " "queue create/update without metadata modification. When metadata is not " "modified in queue create/update, the operation had been failed." msgstr "" "[`bug/1647995 `_] メタデー" "タの編集をしない場合の、キューの作成/更新を修正しました。キューの作成/削除" "でメタデータを編集しない場合に、操作に失敗していました。" msgid "" "[`bug/1664374 `_] Use " "AngularIndexView for queues panel. Also, this fixes to show breadcrumb " "properly." msgstr "" "[`bug/1664374 `_] " "AngularIndexView をキューパネルにしようしました。これにより、パンくずリストも" "適切に表示されるようになりました。" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.545145 zaqar_ui-18.0.0/releasenotes/source/locale/ko_KR/0000775000175000017500000000000000000000000021673 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5651467 zaqar_ui-18.0.0/releasenotes/source/locale/ko_KR/LC_MESSAGES/0000775000175000017500000000000000000000000023460 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/locale/ko_KR/LC_MESSAGES/releasenotes.po0000664000175000017500000000217700000000000026520 0ustar00zuulzuul00000000000000# minwook-shin , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: Zaqar UI Release Notes\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-02-19 00:40+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-10 10:35+0000\n" "Last-Translator: \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 "2.0.0" msgstr "2.0.0" msgid "Bug Fixes" msgstr "버그 수정" msgid "Current Series Release Notes" msgstr "최신 시리즈에 대한 릴리즈 노트" msgid "New Features" msgstr "새로운 기능" msgid "Ocata Series Release Notes" msgstr "Ocata 시리즈에 대한 릴리즈 노트" msgid "Other Notes" msgstr "기타 노트" msgid "Support python 3.5." msgstr "파이썬 3.5를 지원합니다." msgid "Switch to reno for managing release notes." msgstr "릴리즈 노트를 관리하려면 reno로 전환하십시오." msgid "Upgrade Notes" msgstr "업그레이드 노트" msgid "Zaqar UI Release Notes" msgstr "Zaqar UI 릴리즈 노트" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.545145 zaqar_ui-18.0.0/releasenotes/source/locale/zh_CN/0000775000175000017500000000000000000000000021667 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5651467 zaqar_ui-18.0.0/releasenotes/source/locale/zh_CN/LC_MESSAGES/0000775000175000017500000000000000000000000023454 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/locale/zh_CN/LC_MESSAGES/releasenotes.po0000664000175000017500000001215500000000000026511 0ustar00zuulzuul00000000000000# TigerFang , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: Zaqar UI Release Notes\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-02-19 00:40+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-12-05 02:47+0000\n" "Last-Translator: TigerFang \n" "Language-Team: Chinese (China)\n" "Language: zh_CN\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "2.0.0" msgstr "2.0.0" msgid "3.0.0" msgstr "3.0.0" msgid "Bug Fixes" msgstr "修复的问题" msgid "Current Series Release Notes" msgstr "当前版本发布声明" msgid "New Features" msgstr "新功能" msgid "Ocata Series Release Notes" msgstr "Ocata版本发布声明" msgid "Other Notes" msgstr "其他声明" msgid "Pike Series Release Notes" msgstr "Pike版本发布声明" msgid "" "Storage pool flavors management panel is added. This panel is added into " "Admin dashboard. Also create, update and delete actions are implemeted. " "Create action is implemented as globalAction, so it is callable from other " "panels." msgstr "" "在管理员控制台中增加了存储池配置模板管理面板,提供了创建、更新、删除的操作。" "其中创建的动作是全局性的,所以可以在其他控制台中直接调用。" msgid "" "Storage pools management panel is added. This panel is added into Admin " "dashboard. Also create, update and delete actions are implemeted. Create " "action is implemented as globalAction, so it is callable from other panels." msgstr "" "在管理员控制台中增加了存储池配置模板管理面板,提供了创建、更新、删除的操作。" "其中创建的动作是全局性的,所以可以在其他控制台中直接调用。" msgid "Support python 3.5." msgstr "支持python 3.5" msgid "Switch theme for documentation from oslosphinx to openstackdocstheme." msgstr "将文档的主题从oslosphinx切换到openstackdoc主题。" msgid "Switch to reno for managing release notes." msgstr "切换到reno以便对发布声明进行管理。" msgid "Upgrade Notes" msgstr "升级声明" msgid "" "Use initAction() instead initScope(). initScope() is deprecated from Horizon " "in Ocata and will be removed in Queens." msgstr "" "使用initAction()而不是initScope()。initScope()已经在Ocata版的Horizon项目中被" "弃用了并且会在Queens版中移除。" msgid "Use only tox for test and remove run_tests.sh that is no longer used." msgstr "请使用tox来进行测试,run_test.sh不能再使用了,所以请删除它。" msgid "Use pbr autodoc feature rather than custom logic." msgstr "请使用pbr autodoc功能而不是惯用的logic。" msgid "Zaqar UI Release Notes" msgstr "Zaqar用户界面发布声明" msgid "" "[`blueprint format-queue-metadata `_] Show the queue metadata as each items in " "drawer." msgstr "" "[`format-queue-metadata蓝图 `_] 中以表格形式展示了队列元数据。" msgid "" "[`blueprint post-get-messages `_] Support post messages and get messages. \"Post " "Messages\" and \"View Messages\" actions are added." msgstr "" "[`post-get-messages蓝图 `_] 提供了post和get消息相关信息。其中增加了\"提交消息\"和 " "\"查看消息\"的操作。" msgid "" "[`blueprint purge-queue `_] Support purge queue. This allows user to purge a queue to " "remove all the messages and subscriptions." msgstr "" "[`purge-queue 蓝图 `_] 提供了清除队列相关信息。可以让用户清空一个队列,从而删除队列中的所" "有消息和订阅信息。" msgid "" "[`blueprint subscription-confirmation `_] Support subscription age and " "confirmed. This shows age and confirmation for subscription." msgstr "" "[`subscription-confirmation 蓝图`_] 提供订阅者年龄和确认相关信息。展示了订阅" "者的年龄和确认信息。" msgid "" "[`blueprint support-presigned-queue `_] Support signed url. \"Signed URL\" " "action for queue is added." msgstr "" "[`support-presigned-queue 蓝图 `_] 提供已注册链接。增加了队列的\"已注册链接\"." msgid "" "[`bug/1664374 `_] Use " "AngularIndexView for queues panel. Also, this fixes to show breadcrumb " "properly." msgstr "" "[`bug/1664374 `_] 在队列控" "制面板上使用AngularIndexView。同时也修复了正确显示面包屑的问题。" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/ocata.rst0000664000175000017500000000023000000000000021243 0ustar00zuulzuul00000000000000=================================== Ocata Series Release Notes =================================== .. release-notes:: :branch: origin/stable/ocata ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/pike.rst0000664000175000017500000000021700000000000021111 0ustar00zuulzuul00000000000000=================================== Pike Series Release Notes =================================== .. release-notes:: :branch: stable/pike ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/queens.rst0000664000175000017500000000022300000000000021456 0ustar00zuulzuul00000000000000=================================== Queens Series Release Notes =================================== .. release-notes:: :branch: stable/queens ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/rocky.rst0000664000175000017500000000017600000000000021314 0ustar00zuulzuul00000000000000========================== Rocky Series Release Notes ========================== .. release-notes:: :branch: stable/rocky ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/stein.rst0000664000175000017500000000017600000000000021307 0ustar00zuulzuul00000000000000========================== Stein Series Release Notes ========================== .. release-notes:: :branch: stable/stein ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/train.rst0000664000175000017500000000017600000000000021302 0ustar00zuulzuul00000000000000========================== Train Series Release Notes ========================== .. release-notes:: :branch: stable/train ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/unreleased.rst0000664000175000017500000000016100000000000022306 0ustar00zuulzuul00000000000000============================== Current Series Release Notes ============================== .. release-notes:: ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/ussuri.rst0000664000175000017500000000020200000000000021505 0ustar00zuulzuul00000000000000=========================== Ussuri Series Release Notes =========================== .. release-notes:: :branch: stable/ussuri ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/victoria.rst0000664000175000017500000000022000000000000021773 0ustar00zuulzuul00000000000000============================= Victoria Series Release Notes ============================= .. release-notes:: :branch: unmaintained/victoria ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/wallaby.rst0000664000175000017500000000021400000000000021611 0ustar00zuulzuul00000000000000============================ Wallaby Series Release Notes ============================ .. release-notes:: :branch: unmaintained/wallaby ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/xena.rst0000664000175000017500000000020000000000000021104 0ustar00zuulzuul00000000000000========================= Xena Series Release Notes ========================= .. release-notes:: :branch: unmaintained/xena ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/yoga.rst0000664000175000017500000000020000000000000021110 0ustar00zuulzuul00000000000000========================= Yoga Series Release Notes ========================= .. release-notes:: :branch: unmaintained/yoga ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/releasenotes/source/zed.rst0000664000175000017500000000017400000000000020745 0ustar00zuulzuul00000000000000======================== Zed Series Release Notes ======================== .. release-notes:: :branch: unmaintained/zed ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/requirements.txt0000664000175000017500000000050700000000000016724 0ustar00zuulzuul00000000000000# Requirements lower bounds listed here are our best effort to keep them up to # date but we do not test them so no guarantee of having them all correct. If # you find any incorrect lower bounds, let us know or propose a fix. pbr!=2.1.0,>=2.0.0 # Apache-2.0 python-zaqarclient>=1.0.0 # Apache-2.0 horizon>=17.1.0 # Apache-2.0 ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5891485 zaqar_ui-18.0.0/setup.cfg0000664000175000017500000000140700000000000015261 0ustar00zuulzuul00000000000000[metadata] name = zaqar-ui summary = Zaqar User Interface description_file = README.rst author = OpenStack author_email = openstack-discuss@lists.openstack.org home_page = https://docs.openstack.org/zaqar/latest/ python_requires = >=3.9 classifier = Environment :: OpenStack Framework :: Django Intended Audience :: Information Technology Intended Audience :: System Administrators License :: OSI Approved :: Apache Software License Operating System :: POSIX :: Linux Programming Language :: Python Programming Language :: Python :: 3 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 [files] packages = zaqar_ui [egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/setup.py0000664000175000017500000000127100000000000015151 0ustar00zuulzuul00000000000000# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import setuptools setuptools.setup( setup_requires=['pbr>=2.0.0'], pbr=True) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/test-requirements.txt0000664000175000017500000000013400000000000017675 0ustar00zuulzuul00000000000000hacking>=6.1.0,<6.2.0 # Apache-2.0 coverage!=4.4,>=4.0 # Apache-2.0 testtools>=2.2.0 # MIT ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/test-shim.js0000664000175000017500000000511400000000000015712 0ustar00zuulzuul00000000000000/* * Shim for Javascript unit tests; supplying expected global features. * This should be removed from the codebase once i18n services are provided. * Taken from default i18n file provided by Django. */ var horizonPlugInModules = []; (function (globals) { var django = globals.django || (globals.django = {}); django.pluralidx = function (count) { return (count == 1) ? 0 : 1; }; /* gettext identity library */ django.gettext = function (msgid) { return msgid; }; django.ngettext = function (singular, plural, count) { return (count == 1) ? singular : plural; }; django.gettext_noop = function (msgid) { return msgid; }; django.pgettext = function (context, msgid) { return msgid; }; django.npgettext = function (context, singular, plural, count) { return (count == 1) ? singular : plural; }; django.interpolate = function (fmt, obj, named) { if (named) { return fmt.replace(/%\(\w+\)s/g, function(match){return String(obj[match.slice(2,-2)])}); } else { return fmt.replace(/%s/g, function(match){return String(obj.shift())}); } }; /* formatting library */ django.formats = { "DATETIME_FORMAT": "N j, Y, P", "DATETIME_INPUT_FORMATS": [ "%Y-%m-%d %H:%M:%S", "%Y-%m-%d %H:%M:%S.%f", "%Y-%m-%d %H:%M", "%Y-%m-%d", "%m/%d/%Y %H:%M:%S", "%m/%d/%Y %H:%M:%S.%f", "%m/%d/%Y %H:%M", "%m/%d/%Y", "%m/%d/%y %H:%M:%S", "%m/%d/%y %H:%M:%S.%f", "%m/%d/%y %H:%M", "%m/%d/%y" ], "DATE_FORMAT": "N j, Y", "DATE_INPUT_FORMATS": [ "%Y-%m-%d", "%m/%d/%Y", "%m/%d/%y" ], "DECIMAL_SEPARATOR": ".", "FIRST_DAY_OF_WEEK": "0", "MONTH_DAY_FORMAT": "F j", "NUMBER_GROUPING": "3", "SHORT_DATETIME_FORMAT": "m/d/Y P", "SHORT_DATE_FORMAT": "m/d/Y", "THOUSAND_SEPARATOR": ",", "TIME_FORMAT": "P", "TIME_INPUT_FORMATS": [ "%H:%M:%S", "%H:%M:%S.%f", "%H:%M" ], "YEAR_MONTH_FORMAT": "F Y" }; django.get_format = function (format_type) { var value = django.formats[format_type]; if (typeof(value) == 'undefined') { return format_type; } else { return value; } }; /* add to global namespace */ globals.pluralidx = django.pluralidx; globals.gettext = django.gettext; globals.ngettext = django.ngettext; globals.gettext_noop = django.gettext_noop; globals.pgettext = django.pgettext; globals.npgettext = django.npgettext; globals.interpolate = django.interpolate; globals.get_format = django.get_format; globals.STATIC_URL = '/static/'; globals.WEBROOT = '/'; }(this)); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5651467 zaqar_ui-18.0.0/tools/0000775000175000017500000000000000000000000014576 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/tools/install_venv.py0000664000175000017500000000446700000000000017667 0ustar00zuulzuul00000000000000# Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # # Copyright 2010 OpenStack Foundation # Copyright 2013 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import os import sys import install_venv_common as install_venv def print_help(venv, root): help = """ OpenStack development environment setup is complete. OpenStack development uses virtualenv to track and manage Python dependencies while in development and testing. To activate the OpenStack virtualenv for the extent of your current shell session you can run: $ source %s/bin/activate Or, if you prefer, you can run commands in the virtualenv on a case by case basis by running: $ %s/tools/with_venv.sh Also, make test will automatically use the virtualenv. """ print(help % (venv, root)) def main(argv): root = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) if os.environ.get('tools_path'): root = os.environ['tools_path'] venv = os.path.join(root, '.venv') if os.environ.get('venv'): venv = os.environ['venv'] pip_requires = os.path.join(root, 'requirements.txt') test_requires = os.path.join(root, 'test-requirements.txt') py_version = "python%s.%s" % (sys.version_info[0], sys.version_info[1]) project = 'OpenStack' install = install_venv.InstallVenv(root, venv, pip_requires, test_requires, py_version, project) options = install.parse_args(argv) install.check_dependencies() install.create_virtualenv(no_site_packages=options.no_site_packages) install.install_dependencies() print_help(venv, root) if __name__ == '__main__': main(sys.argv) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/tools/install_venv_common.py0000664000175000017500000001324200000000000021226 0ustar00zuulzuul00000000000000# Copyright 2013 OpenStack Foundation # Copyright 2013 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. """Provides methods needed by installation script for OpenStack development virtual environments. Since this script is used to bootstrap a virtualenv from the system's Python environment, it should be kept strictly compatible with Python 2.6. Synced in from openstack-common """ import optparse import os import subprocess import sys class InstallVenv(object): def __init__(self, root, venv, requirements, test_requirements, py_version, project): self.root = root self.venv = venv self.requirements = requirements self.test_requirements = test_requirements self.py_version = py_version self.project = project def die(self, message, *args): print(message % args, file=sys.stderr) sys.exit(1) def run_command_with_code(self, cmd, redirect_output=True, check_exit_code=True): """Runs a command in an out-of-process shell. Returns the output of that command. Working directory is self.root. """ if redirect_output: stdout = subprocess.PIPE else: stdout = None proc = subprocess.Popen(cmd, cwd=self.root, stdout=stdout) output = proc.communicate()[0] if check_exit_code and proc.returncode != 0: self.die('Command "%s" failed.\n%s', ' '.join(cmd), output) return (output, proc.returncode) def run_command(self, cmd, redirect_output=True, check_exit_code=True): return self.run_command_with_code(cmd, redirect_output, check_exit_code)[0] def get_distro(self): if (os.path.exists('/etc/fedora-release') or os.path.exists('/etc/redhat-release')): return Fedora( self.root, self.venv, self.requirements, self.test_requirements, self.py_version, self.project) else: return Distro( self.root, self.venv, self.requirements, self.test_requirements, self.py_version, self.project) def check_dependencies(self): self.get_distro().install_virtualenv() def create_virtualenv(self, no_site_packages=True): """Creates the virtual environment and installs PIP. Creates the virtual environment and installs PIP only into the virtual environment. """ if not os.path.isdir(self.venv): print('Creating venv...', end=' ') if no_site_packages: self.run_command(['virtualenv', '-q', '--no-site-packages', self.venv]) else: self.run_command(['virtualenv', '-q', self.venv]) print('done.') else: print("venv already exists...") pass def pip_install(self, *args): self.run_command(['tools/with_venv.sh', 'pip', 'install', '--upgrade'] + list(args), redirect_output=False) def install_dependencies(self): print('Installing dependencies with pip (this can take a while)...') # First things first, make sure our venv has the latest pip and # setuptools and pbr self.pip_install('pip>=1.4') self.pip_install('setuptools') self.pip_install('pbr') self.pip_install('-r', self.requirements, '-r', self.test_requirements) def parse_args(self, argv): """Parses command-line arguments.""" parser = optparse.OptionParser() parser.add_option('-n', '--no-site-packages', action='store_true', help="Do not inherit packages from global Python " "install.") return parser.parse_args(argv[1:])[0] class Distro(InstallVenv): def check_cmd(self, cmd): return bool(self.run_command(['which', cmd], check_exit_code=False).strip()) def install_virtualenv(self): if self.check_cmd('virtualenv'): return if self.check_cmd('easy_install'): print('Installing virtualenv via easy_install...', end=' ') if self.run_command(['easy_install', 'virtualenv']): print('Succeeded') return else: print('Failed') self.die('ERROR: virtualenv not found.\n\n%s development' ' requires virtualenv, please install it using your' ' favorite package management tool' % self.project) class Fedora(Distro): """This covers all Fedora-based distributions. Includes: Fedora, RHEL, CentOS, Scientific Linux """ def check_pkg(self, pkg): return self.run_command_with_code(['rpm', '-q', pkg], check_exit_code=False)[1] == 0 def install_virtualenv(self): if self.check_cmd('virtualenv'): return if not self.check_pkg('python-virtualenv'): self.die("Please install 'python-virtualenv'.") super(Fedora, self).install_virtualenv() ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/tools/with_venv.sh0000775000175000017500000000077200000000000017154 0ustar00zuulzuul00000000000000#!/bin/bash TOOLS_PATH=${TOOLS_PATH:-$(dirname $0)} VENV_PATH=${VENV_PATH:-${TOOLS_PATH}} VENV_DIR=${VENV_NAME:-/../.venv} TOOLS=${TOOLS_PATH} VENV=${VENV:-${VENV_PATH}/${VENV_DIR}} HORIZON_DIR=${TOOLS%/tools} # This horrible mangling of the PYTHONPATH is required to get the # babel-angular-gettext extractor to work. To fix this the extractor needs to # be packaged on pypi and added to global requirements. That work is in progress. export PYTHONPATH="$HORIZON_DIR" source ${VENV}/bin/activate && "$@" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/tox.ini0000664000175000017500000000537500000000000014763 0ustar00zuulzuul00000000000000[tox] envlist = pep8,eslint,karma-local,docs-local,releasenotes,lower-constraints-local minversion = 3.18.0 [testenv] usedevelop = True setenv = VIRTUAL_ENV={envdir} NOSE_WITH_OPENSTACK=1 NOSE_OPENSTACK_COLOR=1 NOSE_OPENSTACK_RED=0.05 NOSE_OPENSTACK_YELLOW=0.025 NOSE_OPENSTACK_SHOW_ELAPSED=1 DJANGO_SETTINGS_MODULE=zaqar_ui.test.settings deps = -c{env:TOX_CONSTRAINTS_FILE:https://opendev.org/openstack/requirements/raw/branch/master/upper-constraints.txt} -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt commands = python manage.py test {posargs} # For installation of horizon on local # NOTICE: this tox.ini requires horizon repository cloned in sibling directory. [testenv:hz-local] commands = pip install -e ../horizon [testenv:venv] commands = {posargs} [testenv:pep8] commands = flake8 {posargs} [flake8] ignore = F405,W504 exclude = .venv,.git,.tox,dist,*lib/python*,*egg,build,panel_template,dash_template,local_settings.py,*/local/*,*/test/test_plugins/*,.ropeproject,node_modules max-complexity = 20 [testenv:cover] commands = coverage erase coverage run {toxinidir}/manage.py test zaqar_ui coverage xml --omit '.tox/cover/*' -o 'cover/coverage.xml' coverage html --omit '.tox/cover/*' -d 'cover/htmlcov' # NOTE(shu-mutow): On CI infra, horizon will be installed # according to job setting. but on local, we need to install # horizon from master branch. [testenv:py36-local] basepython = python3.6 commands = {[testenv:hz-local]commands} {[testenv]commands} [testenv:eslint] allowlist_externals = npm commands = npm install npm run lint # NOTE(shu-mutow): The "postinstall" script on package.json will install horizon # from master branch into python3.x environment for testing javascripts. # Horizon from master is needed to be cloned into ../horizon on both local and CI. [testenv:karma] allowlist_externals = {[testenv:eslint]whitelist_externals} commands = npm install npm run test [testenv:karma-local] allowlist_externals = {[testenv:eslint]whitelist_externals} commands = {[testenv:karma]commands} [testenv:docs] deps = -c{env:TOX_CONSTRAINTS_FILE:https://opendev.org/openstack/requirements/raw/branch/master/upper-constraints.txt} # zaqar-ui doc generated the module reference, # so requirements.txt should be here to apply upper-constraints -r{toxinidir}/requirements.txt -r{toxinidir}/doc/requirements.txt commands= sphinx-build -W -b html doc/source doc/build/html [testenv:docs-local] deps = {[testenv:docs]deps} commands= {[testenv:hz-local]commands} {[testenv:docs]commands} [testenv:releasenotes] deps = {[testenv:docs]deps} commands = sphinx-build -a -E -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5651467 zaqar_ui-18.0.0/zaqar_ui/0000775000175000017500000000000000000000000015251 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/__init__.py0000664000175000017500000000122400000000000017361 0ustar00zuulzuul00000000000000# Copyright 2015 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import pbr.version __version__ = pbr.version.VersionInfo('zaqar_ui').version_string() ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5691469 zaqar_ui-18.0.0/zaqar_ui/api/0000775000175000017500000000000000000000000016022 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/api/__init__.py0000664000175000017500000000241600000000000020136 0ustar00zuulzuul00000000000000# Copyright 2015 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Methods and interface objects used to interact with external APIs. API method calls return objects that are in many cases objects with attributes that are direct maps to the data returned from the API http call. Unfortunately, these objects are also often constructed dynamically, making it difficult to know what data is available from the API object. Because of this, all API calls should wrap their returned object in one defined here, using only explicitly defined attributes and/or methods. In other words, Horizon developers not working on openstack_dashboard.api shouldn't need to understand the finer details of APIs for Keystone/Nova/Glance/Swift et. al. """ from zaqar_ui.api import zaqar # noqa: F401 ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5691469 zaqar_ui-18.0.0/zaqar_ui/api/rest/0000775000175000017500000000000000000000000016777 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/api/rest/__init__.py0000664000175000017500000000176500000000000021121 0ustar00zuulzuul00000000000000# Copyright 2015 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """This package holds the REST API that supports the LBaaS v2 dashboard Javascript code. It is not intended to be used outside of Horizon, and makes no promises of stability or fitness for purpose outside of that scope. It does not promise to adhere to the general OpenStack API Guidelines set out in https://wiki.openstack.org/wiki/APIChangeGuidelines. """ # import REST API modules here from zaqar_ui.api.rest import zaqar # noqa: F401 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/api/rest/zaqar.py0000664000175000017500000003102300000000000020466 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 json import yaml from django.utils.translation import gettext_lazy as _ from django.views import generic from openstack_dashboard.api.rest import urls from openstack_dashboard.api.rest import utils as rest_utils from zaqar_ui.api import zaqar def _convert_to_yaml(data, default_flow_style=False): if not data: return '' try: return yaml.safe_dump(data, default_flow_style=default_flow_style) except Exception: return '' def _load_yaml(data): if not data: loaded_data = {} else: try: loaded_data = yaml.safe_load(data) except Exception as ex: raise Exception(_('The specified input is not a valid ' 'YAML format: %s') % str(ex)) return loaded_data @urls.register class Queue(generic.View): """API for retrieving a single queue""" url_regex = r'zaqar/queues/(?P[^/]+)$' @rest_utils.ajax() def get(self, request, queue_name): """Get a specific queue""" queue = zaqar.queue_get(request, queue_name) stats = queue.stats['messages'] queue_info = {'name': queue_name, 'claimed': stats['claimed'], 'free': stats['free'], 'total': stats['total'], 'metadata': queue.metadata()} return queue_info @rest_utils.ajax(data_required=True) def post(self, request, queue_name): """Update a queue. Returns the updated queue object on success. """ queue = zaqar.queue_update(request, queue_name, **request.DATA) location = '/api/zaqars/queue/%s' % queue._name response = {'name': queue._name, 'metadata': queue._metadata} return rest_utils.CreatedResponse(location, response) @urls.register class QueueActions(generic.View): """API for actions on a single queue""" url_regex = r'zaqar/queues/(?P[^/]+)/(?P[^/]+)$' @rest_utils.ajax(data_required=True) def post(self, request, queue_name, action): """Actions for a queue""" if action == "purge": resource_types = request.DATA.get("resource_types") zaqar.queue_purge(request, queue_name, resource_types) elif action == "share": paths = request.DATA.get("paths") ttl_seconds = request.DATA.get("ttl_seconds") methods = request.DATA.get("methods") return zaqar.queue_signed_url(request, queue_name, paths, ttl_seconds, methods) @urls.register class Queues(generic.View): """API for queues""" url_regex = r'zaqar/queues/$' @rest_utils.ajax() def get(self, request): """Get a list of the Queues for a project. The returned result is an object with property 'items' and each item under this is a queue. """ result = zaqar.queue_list(request) queues = [] for q in result: stats = q.stats['messages'] queues.append({'name': q.name, 'claimed': stats['claimed'], 'free': stats['free'], 'total': stats['total'], 'metadata': q.metadata()}) return queues @rest_utils.ajax(data_required=True) def delete(self, request): """Delete one or more queue by name. Returns HTTP 204 (no content) on successful deletion. """ for queue_name in request.DATA: zaqar.queue_delete(request, queue_name) @rest_utils.ajax(data_required=True) def put(self, request): """Create a new queue. Returns the new queue object on success. """ new_queue = zaqar.queue_create(request, **request.DATA) location = '/api/zaqar/queues/%s' % new_queue.name response = {'name': new_queue.name, 'claimed': 0, 'free': 0, 'total': 0, 'metadata': new_queue._metadata} return rest_utils.CreatedResponse(location, response) @urls.register class Subscriptions(generic.View): """API for Subscriptions""" url_regex = r'zaqar/queues/(?P[^/]+)/subscriptions/$' @rest_utils.ajax() def get(self, request, queue_name): """Get a list of the Subscriptions for a queue.""" return zaqar.subscription_list(request, queue_name) @rest_utils.ajax(data_required=True) def delete(self, request, queue_name): """Delete one or more queue by name. Returns HTTP 204 (no content) on successful deletion. """ zaqar.subscription_delete(request, queue_name, request.DATA) @rest_utils.ajax(data_required=True) def put(self, request, queue_name): """Create a new subscription. Returns the new queue object on success. """ return zaqar.subscription_create(request, queue_name, request.DATA) @urls.register class Messages(generic.View): """API for messages""" url_regex = r'zaqar/queues/(?P[^/]+)/messages/$' @rest_utils.ajax() def get(self, request, queue_name): """Get a list of messages""" result = zaqar.message_list(request, queue_name) messages = [] for m in result: claim_id = None if m.claim_id: claim_id = m.claim_id() messages.append({'age': m.age, 'body': m.body, 'claim_id': claim_id, 'id': m.id, 'href': m.href, 'ttl': m.ttl}) return messages @rest_utils.ajax(data_required=True) def post(self, request, queue_name): """Create new messages""" messages = json.loads(request.DATA.get("messages")) return zaqar.message_post(request, queue_name, messages) @urls.register class Subscription(generic.View): """API for retrieving a single subscription""" url_regex = r'zaqar/queues/(?P[^/]+)/' \ r'subscription/(?P[^/]+)/$' @rest_utils.ajax(data_required=True) def post(self, request, queue_name, subscriber): zaqar.subscription_update(request, queue_name, {'id': subscriber}, request.DATA) @urls.register class Pool(generic.View): """API for retrieving a single pool""" url_regex = r'zaqar/pools/(?P[^/]+)$' @rest_utils.ajax() def get(self, request, pool_name): """Get a specific pool""" pool = zaqar.pool_get(request, pool_name) pool['id'] = pool.get('name') pool['options'] = _convert_to_yaml(pool.get('options')) return pool @rest_utils.ajax(data_required=True) def post(self, request, pool_name): """Update a pool. Returns the updated pool object on success. """ request.DATA["options"] = _load_yaml(request.DATA.get("options")) params = request.DATA pool_name = params.pop('name') new_pool = zaqar.pool_update(request, pool_name, params) location = '/api/zaqar/pools/%s' % new_pool.name response = {'name': new_pool.name, 'uri': new_pool.uri, 'weight': new_pool.weight, 'group': new_pool.group, 'options': new_pool.options} return rest_utils.CreatedResponse(location, response) @urls.register class Pools(generic.View): """API for pools""" url_regex = r'zaqar/pools/$' @rest_utils.ajax() def get(self, request): """Get a list of the Pools for admin. The returned result is an object with property 'items' and each item under this is a pool. """ result = zaqar.pool_list(request) pools = [] for p in result: options = _convert_to_yaml(p.options) pools.append({'id': p.name, 'name': p.name, 'uri': p.uri, 'weight': p.weight, 'group': p.group, 'options': options}) return {'items': pools} @rest_utils.ajax(data_required=True) def delete(self, request): """Delete one or more pool by name. Returns HTTP 204 (no content) on successful deletion. """ for pool_name in request.DATA: zaqar.pool_delete(request, pool_name) @rest_utils.ajax(data_required=True) def put(self, request): """Create a new pool. Returns the new pool object on success. """ request.DATA['options'] = _load_yaml(request.DATA.get('options')) params = request.DATA pool_name = params.pop('name') new_pool = zaqar.pool_create(request, pool_name, params) location = '/api/zaqar/pools/%s' % new_pool.name response = {'name': new_pool.name, 'uri': new_pool.uri, 'weight': new_pool.weight, 'group': new_pool.group, 'options': new_pool.options} return rest_utils.CreatedResponse(location, response) @urls.register class Flavor(generic.View): """API for retrieving a single flavor""" url_regex = r'zaqar/flavors/(?P[^/]+)$' @rest_utils.ajax() def get(self, request, flavor_name): """Get a specific flavor""" flavor = zaqar.flavor_get(request, flavor_name) flavor['id'] = flavor.get('name') flavor['capabilities'] = _convert_to_yaml(flavor.get('capabilities')) return flavor @rest_utils.ajax(data_required=True) def post(self, request, flavor_name): """Update a flavor. Returns the updated flavor object on success. """ capabilities = request.DATA.get('capabilities') request.DATA['capabilities'] = _load_yaml(capabilities) params = request.DATA flavor_name = params.pop('name') new_flavor = zaqar.flavor_update(request, flavor_name, params) location = '/api/zaqar/flavors/%s' % new_flavor.name response = {'name': new_flavor.name, 'pool_group': new_flavor.pool_group, 'capabilities': new_flavor.capabilities} return rest_utils.CreatedResponse(location, response) @urls.register class Flavors(generic.View): """API for flavors""" url_regex = r'zaqar/flavors/$' @rest_utils.ajax() def get(self, request): """Get a list of the Flavors for admin. The returned result is an object with property 'items' and each item under this is a flavor. """ result = zaqar.flavor_list(request) flavors = [] for f in result: capabilities = _convert_to_yaml(f.capabilities) flavors.append({'id': f.name, 'name': f.name, 'pool_group': f.pool_group, 'capabilities': capabilities}) return {'items': flavors} @rest_utils.ajax(data_required=True) def delete(self, request): """Delete one or more flavor by name. Returns HTTP 204 (no content) on successful deletion. """ for flavor_name in request.DATA: zaqar.flavor_delete(request, flavor_name) @rest_utils.ajax(data_required=True) def put(self, request): """Create a new flavor. Returns the new flavor object on success. """ capabilities = request.DATA.get('capabilities') request.DATA['capabilities'] = _load_yaml(capabilities) params = request.DATA flavor_name = params.pop('name') new_flavor = zaqar.flavor_create(request, flavor_name, params) location = '/api/zaqar/flavors/%s' % new_flavor.name response = {'name': new_flavor.name, 'pool_group': new_flavor.pool_group, 'capabilities': new_flavor.capabilities} return rest_utils.CreatedResponse(location, response) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/api/zaqar.py0000664000175000017500000001364200000000000017520 0ustar00zuulzuul00000000000000# Copyright 2015 Catalyst IT Ltd. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # 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 zaqarclient.queues import client as zaqar_client from horizon import exceptions from horizon.utils.memoized import memoized from openstack_dashboard.api import base LOG = logging.getLogger(__name__) RESERVED_QUEUE_METADATA = ["_max_messages_post_size", "_default_message_ttl"] @memoized def zaqarclient(request): zaqar_url = "" service_type = 'messaging' try: zaqar_url = base.url_for(request, service_type) except exceptions.ServiceCatalogException: LOG.debug('No messaging service is configured.') return None LOG.debug('zaqarclient connection created using the token "%s" and url' '"%s"' % (request.user.token.id, zaqar_url)) opts = {'os_auth_token': request.user.token.id, 'os_auth_url': base.url_for(request, 'identity'), 'os_project_id': request.user.tenant_id, 'os_service_type': service_type} auth_opts = {'backend': 'keystone', 'options': opts} conf = {'auth_opts': auth_opts} return zaqar_client.Client(url=zaqar_url, version=2, conf=conf) def queue_list(request, limit=None, marker=None): return zaqarclient(request).queues(limit=limit, marker=marker) def queue_create(request, queue_name, metadata): # Pop up a modal form, which contains several inputbox: # 1. queue_name # 2. ttl # 3. max message size # 4. Metadata queue = zaqarclient(request).queue(queue_name, force_create=True) queue.metadata(new_meta=metadata) return queue def queue_delete(request, queue_name): queue = zaqarclient(request).queue(queue_name, auto_create=False) queue.delete() def queue_update(request, queue_name, metadata): # Popup a modal form, the queue name is a realonly label or inputbox. # user can change ttl, max message size and metadata queue = zaqarclient(request).queue(queue_name, auto_create=False) for key in RESERVED_QUEUE_METADATA: if (key in metadata and isinstance(metadata[key], str)): metadata[key] = int(metadata[key]) queue.metadata(new_meta=metadata) return queue def queue_get(request, queue_name): return zaqarclient(request).queue(queue_name, auto_create=False) def queue_purge(request, queue_name, resource_types): queue = zaqarclient(request).queue(queue_name, auto_create=False) queue.purge(resource_types=resource_types) def message_post(request, queue_name, messages_data): return zaqarclient(request).queue(queue_name).post(messages_data) def message_list(request, queue_name): return zaqarclient(request).queue(queue_name).messages() def queue_signed_url(request, queue_name, paths, ttl_seconds, methods): queue = zaqarclient(request).queue(queue_name, auto_create=False) return queue.signed_url(paths=paths, ttl_seconds=ttl_seconds, methods=methods) def subscription_list(request, queue_name): return [{'subscriber': s.subscriber, 'id': s.id, 'ttl': s.ttl, 'age': s.age, 'confirmed': s.confirmed, 'options': s.options} for s in zaqarclient(request).subscriptions(queue_name)] def subscription_create(request, queue_name, sub_data): subscription = zaqarclient(request).subscription(queue_name, **sub_data) return {'subscriber': subscription.subscriber, 'id': subscription.id, 'ttl': subscription.ttl, 'age': subscription.age, 'confirmed': subscription.confirmed, 'options': subscription.options} def subscription_delete(request, queue_name, sub_data): subscription = zaqarclient(request).subscription(queue_name, **sub_data) subscription.delete() def subscription_update(request, queue_name, old_data, new_data): subscription = zaqarclient(request).subscription(queue_name, **old_data) subscription.update(new_data) return subscription def pool_list(request, limit=None, marker=None): return zaqarclient(request).pools(limit=limit, marker=marker, detailed=True) def pool_create(request, pool_name, params): pool = zaqarclient(request).pool(pool_name, **params) return pool def pool_delete(request, pool_name): pool = zaqarclient(request).pool(pool_name, auto_create=False) pool.delete() def pool_update(request, pool_name, params): pool = zaqarclient(request).pool(pool_name, auto_create=False) pool.update(params) return pool def pool_get(request, pool_name): return zaqarclient(request).pool(pool_name, auto_create=False).get() def flavor_list(request, limit=None, marker=None): return zaqarclient(request).flavors(limit=limit, marker=marker, detailed=True) def flavor_create(request, flavor_name, params): flavor = zaqarclient(request).flavor(flavor_name, **params) return flavor def flavor_delete(request, flavor_name): flavor = zaqarclient(request).flavor(flavor_name, auto_create=False) flavor.delete() def flavor_update(request, flavor_name, params): flavor = zaqarclient(request).flavor(flavor_name, auto_create=False) flavor.update(params) return flavor def flavor_get(request, flavor_name): return zaqarclient(request).flavor(flavor_name, auto_create=False).get() ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5691469 zaqar_ui-18.0.0/zaqar_ui/content/0000775000175000017500000000000000000000000016723 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/content/__init__.py0000664000175000017500000000000000000000000021022 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5691469 zaqar_ui-18.0.0/zaqar_ui/content/pool_flavors/0000775000175000017500000000000000000000000021430 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/content/pool_flavors/__init__.py0000664000175000017500000000000000000000000023527 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/content/pool_flavors/panel.py0000664000175000017500000000133700000000000023105 0ustar00zuulzuul00000000000000# Copyright 2015 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import gettext_lazy as _ import horizon class PoolFlavors(horizon.Panel): name = _("Pool Flavors") slug = "pool_flavors" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/content/pool_flavors/urls.py0000664000175000017500000000127300000000000022772 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 horizon.browsers import views urlpatterns = [ re_path(r'^$', views.AngularIndexView.as_view(), name='index'), ] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5691469 zaqar_ui-18.0.0/zaqar_ui/content/pools/0000775000175000017500000000000000000000000020057 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/content/pools/__init__.py0000664000175000017500000000000000000000000022156 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/content/pools/panel.py0000664000175000017500000000131300000000000021526 0ustar00zuulzuul00000000000000# Copyright 2015 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import gettext_lazy as _ import horizon class Pools(horizon.Panel): name = _("Pools") slug = "pools" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/content/pools/urls.py0000664000175000017500000000127300000000000021421 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 horizon.browsers import views urlpatterns = [ re_path(r'^$', views.AngularIndexView.as_view(), name='index'), ] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5691469 zaqar_ui-18.0.0/zaqar_ui/content/queues/0000775000175000017500000000000000000000000020232 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/content/queues/__init__.py0000664000175000017500000000126100000000000022343 0ustar00zuulzuul00000000000000# Copyright 2016 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Register the REST API URLs so they can be called from the JavaScript files import zaqar_ui.api.rest # noqa: F401 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/content/queues/panel.py0000664000175000017500000000131600000000000021704 0ustar00zuulzuul00000000000000# Copyright 2015 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import gettext_lazy as _ import horizon class Queues(horizon.Panel): name = _("Queues") slug = "queues" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/content/queues/urls.py0000664000175000017500000000144600000000000021576 0ustar00zuulzuul00000000000000# Copyright 2015 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from django.urls import re_path from horizon.browsers import views from zaqar_ui.content.queues import panel title = panel.Queues.name urlpatterns = [ re_path(r'^$', views.AngularIndexView.as_view(title=title), name='index'), ] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5731473 zaqar_ui-18.0.0/zaqar_ui/enabled/0000775000175000017500000000000000000000000016643 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/enabled/_1510_project_messaging_group.py0000664000175000017500000000162400000000000024744 0ustar00zuulzuul00000000000000# Copyright 2015 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import gettext_lazy as _ # The slug of the panel group to be added to HORIZON_CONFIG. Required. PANEL_GROUP = 'messaging' # The display name of the PANEL_GROUP. Required. PANEL_GROUP_NAME = _('Messaging') # The slug of the dashboard the PANEL_GROUP associated with. Required. PANEL_GROUP_DASHBOARD = 'project' ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/enabled/_1520_project_queues.py0000664000175000017500000000156400000000000023066 0ustar00zuulzuul00000000000000# Copyright 2015 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. PANEL = 'queues' PANEL_GROUP = 'messaging' PANEL_DASHBOARD = 'project' ADD_PANEL = ('zaqar_ui.content.queues.panel.Queues') ADD_INSTALLED_APPS = ['zaqar_ui'] ADD_ANGULAR_MODULES = ['horizon.dashboard.project.queues'] ADD_SCSS_FILES = ['dashboard/project/queues/queues.scss'] AUTO_DISCOVER_STATIC_FILES = True ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/enabled/_2510_admin_messaging_group.py0000664000175000017500000000162200000000000024365 0ustar00zuulzuul00000000000000# Copyright 2015 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import gettext_lazy as _ # The slug of the panel group to be added to HORIZON_CONFIG. Required. PANEL_GROUP = 'messaging' # The display name of the PANEL_GROUP. Required. PANEL_GROUP_NAME = _('Messaging') # The slug of the dashboard the PANEL_GROUP associated with. Required. PANEL_GROUP_DASHBOARD = 'admin' ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/enabled/_2520_admin_pools.py0000664000175000017500000000142000000000000022325 0ustar00zuulzuul00000000000000# Copyright 2015 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. PANEL = 'pools' PANEL_GROUP = 'messaging' PANEL_DASHBOARD = 'admin' ADD_PANEL = ('zaqar_ui.content.pools.panel.Pools') ADD_ANGULAR_MODULES = ['horizon.dashboard.admin.pools'] AUTO_DISCOVER_STATIC_FILES = True ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/enabled/_2530_admin_pool_flavors.py0000664000175000017500000000155700000000000023712 0ustar00zuulzuul00000000000000# Copyright 2015 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. PANEL = 'pool_flavors' PANEL_GROUP = 'messaging' PANEL_DASHBOARD = 'admin' ADD_PANEL = ('zaqar_ui.content.pool_flavors.panel.PoolFlavors') ADD_ANGULAR_MODULES = ['horizon.dashboard.admin.pool-flavors'] ADD_SCSS_FILES = ['dashboard/admin/pool-flavors/pool-flavors.scss'] AUTO_DISCOVER_STATIC_FILES = True ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/enabled/__init__.py0000664000175000017500000000000000000000000020742 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/karma.conf.js0000664000175000017500000001241700000000000017633 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); 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: ['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: 10, // target 100 branches: 0, // target 100 functions: 10, // target 100 lines: 10 // target 100 } }); }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5491455 zaqar_ui-18.0.0/zaqar_ui/locale/0000775000175000017500000000000000000000000016510 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5491455 zaqar_ui-18.0.0/zaqar_ui/locale/de/0000775000175000017500000000000000000000000017100 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5731473 zaqar_ui-18.0.0/zaqar_ui/locale/de/LC_MESSAGES/0000775000175000017500000000000000000000000020665 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/locale/de/LC_MESSAGES/django.po0000664000175000017500000000162400000000000022472 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata # Andreas Jaeger , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui 2.0.0.0b3.dev12\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2017-01-27 21:41+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-01-29 06:56+0000\n" "Last-Translator: Andreas Jaeger \n" "Language-Team: German\n" "Language: de\n" "X-Generator: Zanata 3.7.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "Messaging" msgstr "Nachrichten" msgid "Pool Flavors" msgstr "Pool Varianten" msgid "Pools" msgstr "Pools" msgid "Queues" msgstr "Warteschlangen" #, python-format msgid "The specified input is not a valid YAML format: %s" msgstr "Die angegebene Eingabe ist kein gültiges YAML-Format: %s" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/locale/de/LC_MESSAGES/djangojs.po0000664000175000017500000003246700000000000023040 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata # Monika Wolf , 2016. #zanata # Andreas Jaeger , 2017. #zanata # Frank Kloeker , 2017. #zanata # Robert Simai , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui 3.0.1.dev10\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2017-09-05 05:46+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-21 10:46+0000\n" "Last-Translator: Frank Kloeker \n" "Language-Team: German\n" "Language: de\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "A queue name between 1-256 characters is required." msgstr "Ein Warteschlangenname zwischen 1 und 256 Zeichen ist erforderlich." msgid "Actions" msgstr "Aktionen" msgid "Age" msgstr "Alter" msgid "" "An optional request component related to storage-specific options in YAML " "format." msgstr "" "Eine optionale Anfragekomponente für Storage-spezifische Optionen im YAML-" "Format." msgid "Body" msgstr "Nachrichtentext" msgid "Capabilities" msgstr "Fähigkeiten" msgid "Choose resource to purge" msgstr "Ressource zum Bereinigen wählen" msgid "Claimed Messages" msgstr "Beanspruchte Nachrichten" msgid "Claims" msgstr "Claims" msgid "Confirm Delete Pool" msgid_plural "Confirm Delete Pools" msgstr[0] "Pool löschen bestätigen" msgstr[1] "Pools löschen bestätigen" msgid "Confirm Delete Pool Flavor" msgid_plural "Confirm Delete Pool Flavors" msgstr[0] "Pool-Variante löschen bestätigen" msgstr[1] "Pool-Varianten löschen bestätigen" msgid "Confirm Delete Queue" msgid_plural "Confirm Delete queues" msgstr[0] "Bestätige Löschung Warteschlange" msgstr[1] "Bestätige Löschung Warteschlangen" msgid "Confirmed" msgstr "Bestätigt" msgid "Create" msgstr "Erstellen" msgid "Create Pool" msgstr "Pool erstellen" msgid "Create Pool Flavor" msgstr "Pool-Variante erstellen" msgid "Create Queue" msgstr "Erstelle Warteschlange" msgid "Create Queues" msgstr "Erstelle Warteschlange" msgid "Create Subscription" msgstr "Erstelle Abonnement" msgid "Creating Signed URL" msgstr "Erstelle signierte URL" msgid "DELETE" msgstr "LÖSCHEN" msgid "Delete" msgstr "Löschen" msgid "Delete Pool" msgid_plural "Delete Pools" msgstr[0] "Pool löschen" msgstr[1] "Pools löschen" msgid "Delete Pool Flavor" msgid_plural "Delete Pool Flavors" msgstr[0] "Pool-Variante löschen" msgstr[1] "Pool-Varianten löschen" msgid "Delete Pool Flavors" msgstr "Pool-Varianten löschen" msgid "Delete Pools" msgstr "Pool löschen" msgid "Delete Queue" msgid_plural "Delete Queues" msgstr[0] "Lösche Warteschlange" msgstr[1] "Lösche Warteschlangen" msgid "Delete Queues" msgstr "Lösche Warteschlange" #, python-format msgid "Deleted Pool Flavor: %s." msgid_plural "Deleted Pool Flavors: %s." msgstr[0] "Gelöschte Pool-Variante: %s" msgstr[1] "Gelöschte Pool-Varianten: %s" #, python-format msgid "Deleted Pool: %s." msgid_plural "Deleted Pools: %s." msgstr[0] "Gelöschter Pool: %s" msgstr[1] "Gelöschte Pools: %s" #, python-format msgid "Deleted Queue: %s." msgid_plural "Deleted Queues: %s." msgstr[0] "Gelösche Warteschlange: %s." msgstr[1] "Gelöschte Warteschlangen: %s." msgid "Describes flavor-specific capabilities in YAML format." msgstr "Beschreibt Varianten-spezifische Eigenschaften im YAML-Format." msgid "Enter a queue name" msgstr "Warteschlangenname eingeben" msgid "Enter a subscriber" msgstr "Abonent eingeben" msgid "Free Messages" msgstr "Freie Nachrichten" msgid "GET" msgstr "GET" msgid "Group" msgstr "Gruppe" msgid "Group of the pool." msgstr "Gruppe des Pools." msgid "HEAD" msgstr "HEAD" msgid "ID" msgstr "ID" msgid "List Messages" msgstr "Nachrichten anzeigen" msgid "Messages" msgstr "Nachrichten" #, python-format msgid "Messages has been posted to queue %s successfully." msgstr "Nachricht wurde erfolgreich in die Warteschlange %s gestellt." msgid "Methods" msgstr "Methoden" msgid "Name" msgstr "Name" msgid "Name of the flavor." msgstr "Name der Variante." msgid "Name of the pool." msgstr "Name des Pools." msgid "" "Note that you can create a queue without defining metadata.\n" " The metadata step is optional but recommended." msgstr "" "Beachten Sie, dass Sie eine Warteschlange ohne definierte Metadaten " "erstellen können.\n" " Erstellung Metadaten ist optional aber empfohlen." msgid "Note that you can create a subscription without defining options." msgstr "Beachten Sie, dass Sie ein Abonnement ohne Optionen erstellen können." msgid "OPTIONS" msgstr "OPTIONEN" msgid "Options" msgstr "Optionen" msgid "POST" msgstr "POST" msgid "PUT" msgstr "PUT" msgid "Paths" msgstr "Pfade" msgid "Pool" msgstr "Pool" #, python-format msgid "Pool %s was successfully created." msgstr "Pool %s wurde erfolgreich erstellt." #, python-format msgid "Pool %s was successfully updated." msgstr "Pool %s wurde erfolgreich aktualisiert." msgid "Pool Flavor" msgstr "Pool Variante" msgid "Pool Flavors" msgstr "Pool Varianten" msgid "Pool Group" msgstr "Pool Gruppe" #, python-format msgid "Pool flavor %s was successfully created." msgstr "Pool-Variante %s wurde erfolgreich erstellt." #, python-format msgid "Pool flavor %s was successfully updated." msgstr "Pool-Variante %s wurde erfolgreich aktualisiert." msgid "Pool group for flavor." msgstr "Pool-Gruppe der Variante." msgid "Pools" msgstr "Pools" msgid "Post" msgstr "Abschicken" msgid "Post Messages" msgstr "Nachrichten senden" msgid "Purge" msgstr "Bereinigen" msgid "Purge Queue" msgstr "Warteschlange bereinigen" #, python-format msgid "Queue %s has been purged successfully." msgstr "Warteschlange %s wurde erfolgreich bereinigt." #, python-format msgid "Queue %s was successfully created." msgstr "Warteschlange %s erfolgreich erstellt." #, python-format msgid "Queue %s was successfully updated." msgstr "Warteschlange %s erfolgreich aktualisiert." msgid "Queue Details" msgstr "Warteschlangendetails" msgid "Queue Metadata" msgstr "Warteschlangen Metadaten" msgid "Queue Name" msgstr "Warteschlangenname" msgid "Queues" msgstr "Warteschlangen" #, python-format msgid "Removed %(subscriber)s subscriber from the %(queue)s queue." msgstr "%(subscriber)s Abonnementen von der %(queue)s Warteschlange gelöscht." msgid "See a sample as below:" msgstr "In Folgenden finden Sie ein Beispiel:" msgid "Signed URL" msgstr "Signierte URL" #, python-format msgid "Signed URL for %s" msgstr "Signierte URL für %s" #, python-format msgid "" "Signed URL was successfully created for the queue %s with expires %s and " "signature %s." msgstr "" "Eine signierte URL für die Queue %s mit Ablaufdatum %s und Signatur %s wurde " "erstellt." msgid "Subscriber" msgstr "Abonnent" msgid "Subscribers must be in the form of mailto, HTTP, or HTTPS." msgstr "Abonnement muss in der Form mailto, HTTP, oder HTTPS sein." msgid "Subscription" msgstr "Abonnement" #, python-format msgid "Subscription %s was successfully created." msgstr "Abonnement %s wurde erfolgreich erstellt." msgid "Subscriptions" msgstr " Abonnements" msgid "TTL Seconds" msgstr "TTL Sekunden" msgid "The TTL for a subscription must be at least 60 seconds long." msgstr "Die TTL für ein Abonnement muss wenigstens 60 Sekunden lang sein." msgid "" "The client specifies only the body and TTL for the message. The server\n" " inserts metadata, such as ID and age." msgstr "" "Der Client gibt nur den Körper und die TTL der Nachricht an. Der Server\n" " fügt Metadaten wie ID und Alter hinzu." msgid "Time To Live" msgstr "Lebenszeit" msgid "Time to Live" msgstr "Lebenszeit" msgid "Total Messages" msgstr "Alle Nachrichten" msgid "URI" msgstr "URI" msgid "URI for storage engine of this pool." msgstr "URI für die Storage Engine dieses Pools." msgid "Unable to add subscription." msgstr "Konnte Abonnement nicht hinzufügen." msgid "Unable to create signed URL." msgstr "Signierte URL kann nicht erstellt werden." msgid "Unable to create the flavor." msgstr "Die Variante kann nicht erstellt werden." msgid "Unable to create the pool." msgstr "Der Pool kann nicht erzeugt werden." msgid "Unable to create the queue." msgstr "Konnte Warteschlange nicht erstellen." #, python-format msgid "Unable to delete Pool Flavor: %s." msgid_plural "Unable to delete Pool Flavors: %s." msgstr[0] "Pool-Variante kann nicht gelöscht werden: %s" msgstr[1] "Pool-Varianten können nicht gelöscht werden: %s" #, python-format msgid "Unable to delete Pool: %s." msgid_plural "Unable to delete Pools: %s." msgstr[0] "Pool kann nicht gelöscht werden: %s" msgstr[1] "Pools können nicht gelöscht werden: %s" #, python-format msgid "Unable to delete Queue: %s." msgid_plural "Unable to delete Queues: %s." msgstr[0] "Konnte Warteschlange %s nicht löschen." msgstr[1] "Konnte Warteschlangen %s nicht löschen." msgid "Unable to delete subscription." msgstr "Konnte Abonnement nicht löschen." msgid "Unable to get messages." msgstr "Nachrichten können nicht abgerufen werden." msgid "Unable to post messages." msgstr "Nachrichten können nicht abgeschickt werden." msgid "Unable to purge the queue." msgstr "Warteschlange konnte nicht bereinigt werden." msgid "Unable to retrieve the Queue." msgstr "Warteschlange konnte nicht abgerufen werden." msgid "Unable to retrieve the Queues." msgstr "Konnte die Warteschlangen nicht abrufen." msgid "Unable to retrieve the flavor." msgstr "Die Variante kann nicht abgerufen werden." msgid "Unable to retrieve the flavors." msgstr "Die Varianten können nicht abgerufen werden." msgid "Unable to retrieve the pool." msgstr "Der Pool kann nicht abgerufen werden." msgid "Unable to retrieve the pools." msgstr "Die Pools können nicht abgerufen werden." msgid "Unable to update the flavor." msgstr "Die Variante kann nicht aktualisiert werden." msgid "Unable to update the pool." msgstr "Der Pool kann nicht aktualisiert werden." msgid "Unable to update the queue." msgstr "Konnte Warteschlange nicht aktualisieren." msgid "Update" msgstr "Aktualisieren" msgid "Update Pool" msgstr "Pool aktualiseren" msgid "Update Pool Flavor" msgstr "Pool-Varianten aktualisieren" msgid "Update Queue" msgstr "Aktualisiere Warteschlange" msgid "View Messages" msgstr "Nachrichten ansehen" msgid "Weight" msgstr "Gewicht" msgid "Weight of the pool." msgstr "Gewichtung des Pools." #, python-format msgid "You are not allowed to delete pool flavors: %s" msgstr "Sie haben keine Berechtigung zum löschen von Pool-Varianten: %s" #, python-format msgid "You are not allowed to delete pools: %s" msgstr "Sie haben keine Berechtigung zum löschen von Pools: %s" #, python-format msgid "You are not allowed to delete queues: %s" msgstr "SIe sind nicht berechtig, die Warteschlangen zu löschen: %s" msgid "" "You can submit up to 10 messages in a single request, but you must always\n" " encapsulate the messages in a collection container (an array in JSON, " "even\n" " for a single message - without the JSON array, you receive the " "\"Invalid\n" " request body\" message). The resulting value of the Location header or\n" " response body might be used to retrieve the created messages for " "further\n" " processing." msgstr "" "SIe können bis zu 10 Nachrichten in einer einzigen Anfrage einreichen, aber " "Sie müssen immer\n" " die Nachrichten in einer Container-Sammlung zusammenfassen (ein Array in " "JSON, auch\n" " für eine einfache Nachricht - ohne dem JSON Array bekommen Sie eine " "Fehlernmeldung\n" " \"Invalid request body\"). Der Rückgabewert des Location-Header oder\n" " Rückgaberumpf enthält möglicherweise weitere Informationen für die " "Verarbeitung." #, python-format msgid "You have selected \"%s\". Deleted Pool Flavor is not recoverable." msgid_plural "" "You have selected \"%s\". Deleted Pool Flavors are not recoverable." msgstr[0] "" "Sie haben %s gewählt. Eine gelöschte Pool-Variante kann nicht wieder " "hergestellt werden." msgstr[1] "" "Sie haben %s gewählt. Gelöschte Pool-Varianten können nicht wieder " "hergestellt werden." #, python-format msgid "You have selected \"%s\". Deleted Pool is not recoverable." msgid_plural "You have selected \"%s\". Deleted Pools are not recoverable." msgstr[0] "" "Sie haben %s ausgewählt. Ein gelöschter Pool kann nicht wieder hergestellt " "werden." msgstr[1] "" "Sie haben %s ausgewählt. Gelöschte Pools können nicht wieder hergestellt " "werden." #, python-format msgid "You have selected \"%s\". Deleted queue is not recoverable." msgid_plural "You have selected \"%s\". Deleted queues are not recoverable." msgstr[0] "" "Sie haben ausgewählt \"%s\". Gelöschte Warteschlange kann nicht " "wiederhergestellt werden." msgstr[1] "" "Sie haben ausgewählt \"%s\". Gelöschte Warteschlangen können nicht " "wiederhergestellt werden." msgid "" "You must specify one of the pool groups that is configured in storage pools." msgstr "" "Sie müssen eine der in Storage Pools konfigurierten Pool-Gruppe angeben." msgid "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgstr "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgid "e.g. mongodb://127.0.0.1:27017" msgstr "z.B. mongodb://127.0.0.1:27017" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5491455 zaqar_ui-18.0.0/zaqar_ui/locale/en_GB/0000775000175000017500000000000000000000000017462 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5731473 zaqar_ui-18.0.0/zaqar_ui/locale/en_GB/LC_MESSAGES/0000775000175000017500000000000000000000000021247 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/locale/en_GB/LC_MESSAGES/django.po0000664000175000017500000000151600000000000023054 0ustar00zuulzuul00000000000000# Andi Chandler , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-02-19 00:40+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-07-11 05:10+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 "Messaging" msgstr "Messaging" msgid "Pool Flavors" msgstr "Pool Flavours" msgid "Pools" msgstr "Pools" msgid "Queues" msgstr "Queues" #, python-format msgid "The specified input is not a valid YAML format: %s" msgstr "The specified input is not a valid YAML format: %s" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/locale/en_GB/LC_MESSAGES/djangojs.po0000664000175000017500000003037000000000000023411 0ustar00zuulzuul00000000000000# OpenStack Infra , 2015. #zanata # Andi Chandler , 2016. #zanata # Andreas Jaeger , 2016. #zanata # Andi Chandler , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-02-19 00:40+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-10-05 12:52+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 "A queue name between 1-256 characters is required." msgstr "A queue name between 1-256 characters is required." msgid "Actions" msgstr "Actions" msgid "Age" msgstr "Age" msgid "" "An optional request component related to storage-specific options in YAML " "format." msgstr "" "An optional request component related to storage-specific options in YAML " "format." msgid "Body" msgstr "Body" msgid "Capabilities" msgstr "Capabilities" msgid "Choose resource to purge" msgstr "Choose resource to purge" msgid "Claimed Messages" msgstr "Claimed Messages" msgid "Claims" msgstr "Claims" msgid "Confirm Delete Pool" msgid_plural "Confirm Delete Pools" msgstr[0] "Confirm Delete Pool" msgstr[1] "Confirm Delete Pools" msgid "Confirm Delete Pool Flavor" msgid_plural "Confirm Delete Pool Flavors" msgstr[0] "Confirm Delete Pool Flavour" msgstr[1] "Confirm Delete Pool Flavours" msgid "Confirm Delete Queue" msgid_plural "Confirm Delete queues" msgstr[0] "Confirm Delete Queue" msgstr[1] "Confirm Delete queues" msgid "Confirmed" msgstr "Confirmed" msgid "Create" msgstr "Create" msgid "Create Pool" msgstr "Create Pool" msgid "Create Pool Flavor" msgstr "Create Pool Flavour" msgid "Create Queue" msgstr "Create Queue" msgid "Create Queues" msgstr "Create Queues" msgid "Create Subscription" msgstr "Create Subscription" msgid "Creating Signed URL" msgstr "Creating Signed URL" msgid "DELETE" msgstr "DELETE" msgid "Delete" msgstr "Delete" msgid "Delete Pool" msgid_plural "Delete Pools" msgstr[0] "Delete Pool" msgstr[1] "Delete Pools" msgid "Delete Pool Flavor" msgid_plural "Delete Pool Flavors" msgstr[0] "Delete Pool Flavour" msgstr[1] "Delete Pool Flavours" msgid "Delete Pool Flavors" msgstr "Delete Pool Flavours" msgid "Delete Pools" msgstr "Delete Pools" msgid "Delete Queue" msgid_plural "Delete Queues" msgstr[0] "Delete Queue" msgstr[1] "Delete Queues" msgid "Delete Queues" msgstr "Delete Queues" #, python-format msgid "Deleted Pool Flavor: %s." msgid_plural "Deleted Pool Flavors: %s." msgstr[0] "Deleted Pool Flavour: %s." msgstr[1] "Deleted Pool Flavours: %s." #, python-format msgid "Deleted Pool: %s." msgid_plural "Deleted Pools: %s." msgstr[0] "Deleted Pool: %s." msgstr[1] "Deleted Pools: %s." #, python-format msgid "Deleted Queue: %s." msgid_plural "Deleted Queues: %s." msgstr[0] "Deleted Queue: %s." msgstr[1] "Deleted Queues: %s." msgid "Describes flavor-specific capabilities in YAML format." msgstr "Describes flavour-specific capabilities in YAML format." msgid "Enter a queue name" msgstr "Enter a queue name" msgid "Enter a subscriber" msgstr "Enter a subscriber" msgid "Free Messages" msgstr "Free Messages" msgid "GET" msgstr "GET" msgid "Group" msgstr "Group" msgid "Group of the pool." msgstr "Group of the pool." msgid "HEAD" msgstr "HEAD" msgid "ID" msgstr "ID" msgid "List Messages" msgstr "List Messages" msgid "Messages" msgstr "Messages" #, python-format msgid "Messages has been posted to queue %s successfully." msgstr "Messages has been posted to queue %s successfully." msgid "Methods" msgstr "Methods" msgid "Name" msgstr "Name" msgid "Name of the flavor." msgstr "Name of the flavour." msgid "Name of the pool." msgstr "Name of the pool." msgid "" "Note that you can create a queue without defining metadata.\n" " The metadata step is optional but recommended." msgstr "" "Note that you can create a queue without defining metadata.\n" " The metadata step is optional but recommended." msgid "Note that you can create a subscription without defining options." msgstr "Note that you can create a subscription without defining options." msgid "OPTIONS" msgstr "OPTIONS" msgid "Options" msgstr "Options" msgid "POST" msgstr "POST" msgid "PUT" msgstr "PUT" msgid "Paths" msgstr "Paths" msgid "Pool" msgstr "Pool" #, python-format msgid "Pool %s was successfully created." msgstr "Pool %s was successfully created." #, python-format msgid "Pool %s was successfully updated." msgstr "Pool %s was successfully updated." msgid "Pool Flavor" msgstr "Pool Flavour" msgid "Pool Flavors" msgstr "Pool Flavours" msgid "Pool Group" msgstr "Pool Group" #, python-format msgid "Pool flavor %s was successfully created." msgstr "Pool flavour %s was successfully created." #, python-format msgid "Pool flavor %s was successfully updated." msgstr "Pool flavour %s was successfully updated." msgid "Pool group for flavor." msgstr "Pool group for flavour." msgid "Pools" msgstr "Pools" msgid "Post" msgstr "Post" msgid "Post Messages" msgstr "Post Messages" msgid "Purge" msgstr "Purge" msgid "Purge Queue" msgstr "Purge Queue" #, python-format msgid "Queue %s has been purged successfully." msgstr "Queue %s has been purged successfully." #, python-format msgid "Queue %s was successfully created." msgstr "Queue %s was successfully created." #, python-format msgid "Queue %s was successfully updated." msgstr "Queue %s was successfully updated." msgid "Queue Details" msgstr "Queue Details" msgid "Queue Metadata" msgstr "Queue Metadata" msgid "Queue Name" msgstr "Queue Name" msgid "Queues" msgstr "Queues" #, python-format msgid "Removed %(subscriber)s subscriber from the %(queue)s queue." msgstr "Removed %(subscriber)s subscriber from the %(queue)s queue." msgid "See a sample as below:" msgstr "See a sample as below:" msgid "Signed URL" msgstr "Signed URL" #, python-format msgid "Signed URL for %s" msgstr "Signed URL for %s" #, python-format msgid "" "Signed URL was successfully created for the queue %s with expires %s and " "signature %s." msgstr "" "Signed URL was successfully created for the queue %s with expires %s and " "signature %s." msgid "Subscriber" msgstr "Subscriber" msgid "Subscribers must be in the form of mailto, HTTP, or HTTPS." msgstr "Subscribers must be in the form of mailto, HTTP, or HTTPS." msgid "Subscription" msgstr "Subscription" #, python-format msgid "Subscription %s was successfully created." msgstr "Subscription %s was successfully created." msgid "Subscriptions" msgstr "Subscriptions" msgid "TTL Seconds" msgstr "TTL Seconds" msgid "The TTL for a subscription must be at least 60 seconds long." msgstr "The TTL for a subscription must be at least 60 seconds long." msgid "" "The client specifies only the body and TTL for the message. The server\n" " inserts metadata, such as ID and age." msgstr "" "The client specifies only the body and TTL for the message. The server\n" " inserts metadata, such as ID and age." msgid "Time To Live" msgstr "Time To Live" msgid "Time to Live" msgstr "Time to Live" msgid "Total Messages" msgstr "Total Messages" msgid "URI" msgstr "URI" msgid "URI for storage engine of this pool." msgstr "URI for storage engine of this pool." msgid "Unable to add subscription." msgstr "Unable to add subscription." msgid "Unable to create signed URL." msgstr "Unable to create signed URL." msgid "Unable to create the flavor." msgstr "Unable to create the flavour." msgid "Unable to create the pool." msgstr "Unable to create the pool." msgid "Unable to create the queue." msgstr "Unable to create the queue." #, python-format msgid "Unable to delete Pool Flavor: %s." msgid_plural "Unable to delete Pool Flavors: %s." msgstr[0] "Unable to delete Pool Flavour: %s." msgstr[1] "Unable to delete Pool Flavours: %s." #, python-format msgid "Unable to delete Pool: %s." msgid_plural "Unable to delete Pools: %s." msgstr[0] "Unable to delete Pool: %s." msgstr[1] "Unable to delete Pools: %s." #, python-format msgid "Unable to delete Queue: %s." msgid_plural "Unable to delete Queues: %s." msgstr[0] "Unable to delete Queue: %s." msgstr[1] "Unable to delete Queues: %s." msgid "Unable to delete subscription." msgstr "Unable to delete subscription." msgid "Unable to get messages." msgstr "Unable to get messages." msgid "Unable to post messages." msgstr "Unable to post messages." msgid "Unable to purge the queue." msgstr "Unable to purge the queue." msgid "Unable to retrieve the Queue." msgstr "Unable to retrieve the Queue." msgid "Unable to retrieve the Queues." msgstr "Unable to retrieve the Queues." msgid "Unable to retrieve the flavor." msgstr "Unable to retrieve the flavour." msgid "Unable to retrieve the flavors." msgstr "Unable to retrieve the flavours." msgid "Unable to retrieve the pool." msgstr "Unable to retrieve the pool." msgid "Unable to retrieve the pools." msgstr "Unable to retrieve the pools." msgid "Unable to update the flavor." msgstr "Unable to update the flavour." msgid "Unable to update the pool." msgstr "Unable to update the pool." msgid "Unable to update the queue." msgstr "Unable to update the queue." msgid "Update" msgstr "Update" msgid "Update Pool" msgstr "Update Pool" msgid "Update Pool Flavor" msgstr "Update Pool Flavour" msgid "Update Queue" msgstr "Update Queue" msgid "View Messages" msgstr "View Messages" msgid "Weight" msgstr "Weight" msgid "Weight of the pool." msgstr "Weight of the pool." #, python-format msgid "You are not allowed to delete pool flavors: %s" msgstr "You are not allowed to delete pool flavours: %s" #, python-format msgid "You are not allowed to delete pools: %s" msgstr "You are not allowed to delete pools: %s" #, python-format msgid "You are not allowed to delete queues: %s" msgstr "You are not allowed to delete queues: %s" msgid "" "You can submit up to 10 messages in a single request, but you must always\n" " encapsulate the messages in a collection container (an array in JSON, " "even\n" " for a single message - without the JSON array, you receive the " "\"Invalid\n" " request body\" message). The resulting value of the Location header or\n" " response body might be used to retrieve the created messages for " "further\n" " processing." msgstr "" "You can submit up to 10 messages in a single request, but you must always\n" " encapsulate the messages in a collection container (an array in JSON, " "even\n" " for a single message - without the JSON array, you receive the " "\"Invalid\n" " request body\" message). The resulting value of the Location header or\n" " response body might be used to retrieve the created messages for " "further\n" " processing." #, python-format msgid "You have selected \"%s\". Deleted Pool Flavor is not recoverable." msgid_plural "" "You have selected \"%s\". Deleted Pool Flavors are not recoverable." msgstr[0] "You have selected \"%s\". Deleted Pool Flavour is not recoverable." msgstr[1] "" "You have selected \"%s\". Deleted Pool Flavours are not recoverable." #, python-format msgid "You have selected \"%s\". Deleted Pool is not recoverable." msgid_plural "You have selected \"%s\". Deleted Pools are not recoverable." msgstr[0] "You have selected \"%s\". Deleted Pool is not recoverable." msgstr[1] "You have selected \"%s\". Deleted Pools are not recoverable." #, python-format msgid "You have selected \"%s\". Deleted queue is not recoverable." msgid_plural "You have selected \"%s\". Deleted queues are not recoverable." msgstr[0] "You have selected \"%s\". Deleted queue is not recoverable." msgstr[1] "You have selected \"%s\". Deleted queues are not recoverable." msgid "" "You must specify one of the pool groups that is configured in storage pools." msgstr "" "You must specify one of the pool groups that is configured in storage pools." msgid "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgstr "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgid "e.g. mongodb://127.0.0.1:27017" msgstr "e.g. mongodb://127.0.0.1:27017" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5491455 zaqar_ui-18.0.0/zaqar_ui/locale/fr/0000775000175000017500000000000000000000000017117 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5731473 zaqar_ui-18.0.0/zaqar_ui/locale/fr/LC_MESSAGES/0000775000175000017500000000000000000000000020704 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/locale/fr/LC_MESSAGES/django.po0000664000175000017500000000154600000000000022514 0ustar00zuulzuul00000000000000# Gérald LONLAS , 2016. #zanata # Loic Nicolle , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui 3.0.1.dev16\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2017-10-06 01:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-10-09 07:30+0000\n" "Last-Translator: Loic Nicolle \n" "Language-Team: French\n" "Language: fr\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" msgid "Messaging" msgstr "Messagerie" msgid "Pools" msgstr "Pools" msgid "Queues" msgstr "Files d'attente" #, python-format msgid "The specified input is not a valid YAML format: %s" msgstr "L'entrée spécifiée n'est pas dans un format YAML valide: %s" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5491455 zaqar_ui-18.0.0/zaqar_ui/locale/id/0000775000175000017500000000000000000000000017104 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5731473 zaqar_ui-18.0.0/zaqar_ui/locale/id/LC_MESSAGES/0000775000175000017500000000000000000000000020671 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/locale/id/LC_MESSAGES/django.po0000664000175000017500000000164700000000000022503 0ustar00zuulzuul00000000000000# suhartono , 2016. #zanata # suhartono , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui 2.0.0.0b4.dev2\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2017-01-31 09:28+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-01-31 03:31+0000\n" "Last-Translator: suhartono \n" "Language-Team: Indonesian\n" "Language: id\n" "X-Generator: Zanata 3.7.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "Messaging" msgstr "Messaging (pesan)" msgid "Pool Flavors" msgstr "Pool Flavors (flavor kolam)" msgid "Pools" msgstr "Pools (kolam)" msgid "Queues" msgstr "Queues (antrian)" #, python-format msgid "The specified input is not a valid YAML format: %s" msgstr "Input yang ditetapkan tidak format YAML yang valid: %s" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/locale/id/LC_MESSAGES/djangojs.po0000664000175000017500000003011100000000000023024 0ustar00zuulzuul00000000000000# OpenStack Infra , 2015. #zanata # Andreas Jaeger , 2016. #zanata # suhartono , 2016. #zanata # suhartono , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui 3.0.0.0b4.dev6\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2017-08-08 05:16+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-08-09 02:33+0000\n" "Last-Translator: suhartono \n" "Language-Team: Indonesian\n" "Language: id\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "A queue name between 1-256 characters is required." msgstr "Sebuah nama antrian antara 1-256 karakter diperlukan." msgid "Actions" msgstr "Aksi" msgid "Age" msgstr "Age" msgid "" "An optional request component related to storage-specific options in YAML " "format." msgstr "" "Opsional permintaan komponen yang terkait dengan opsi storage-specific dalam " "format YAML." msgid "Body" msgstr "Body" msgid "Capabilities" msgstr "Capabilities (kemampuan)" msgid "Choose resource to purge" msgstr "Choose resource to purge" msgid "Claimed Messages" msgstr "Claimed Messages (pesan diklaim)" msgid "Claims" msgstr "Claims" msgid "Confirm Delete Pool" msgid_plural "Confirm Delete Pools" msgstr[0] "Confirm Delete Pool" msgid "Confirm Delete Pool Flavor" msgid_plural "Confirm Delete Pool Flavors" msgstr[0] "Confirm Delete Pool Flavor" msgid "Confirm Delete Queue" msgid_plural "Confirm Delete queues" msgstr[0] "Confirm Delete Queue (konfirmasi penghapusan antrian)" msgid "Confirmed" msgstr "Confirmed" msgid "Create" msgstr "Membuat" msgid "Create Pool" msgstr "Buat pool" msgid "Create Pool Flavor" msgstr "Create Pool Flavor (buat pool flavor)" msgid "Create Queue" msgstr "Buat Queue (antrian)" msgid "Create Queues" msgstr "Buat Queues (antrian)" msgid "Create Subscription" msgstr "Buat Langganan" msgid "Creating Signed URL" msgstr "Pembuatan Signed URL" msgid "DELETE" msgstr "DELETE" msgid "Delete" msgstr "Hapus" msgid "Delete Pool" msgid_plural "Delete Pools" msgstr[0] "Delete Pool" msgid "Delete Pool Flavor" msgid_plural "Delete Pool Flavors" msgstr[0] "Delete Pool Flavor" msgid "Delete Pool Flavors" msgstr "Delete Pool Flavors (hapus pool flavor)" msgid "Delete Pools" msgstr "Hapus pool" msgid "Delete Queue" msgid_plural "Delete Queues" msgstr[0] "Delete Queue (hapus antrian)" msgid "Delete Queues" msgstr "Hapus Queues (antrian)" #, python-format msgid "Deleted Pool Flavor: %s." msgid_plural "Deleted Pool Flavors: %s." msgstr[0] "Deleted Pool Flavor: %s." #, python-format msgid "Deleted Pool: %s." msgid_plural "Deleted Pools: %s." msgstr[0] "Deleted Pool: %s." #, python-format msgid "Deleted Queue: %s." msgid_plural "Deleted Queues: %s." msgstr[0] "Antrian terhapus: %s." msgid "Describes flavor-specific capabilities in YAML format." msgstr "Menjelaskan kemampuan flavor-specific dalam format YAML." msgid "Enter a queue name" msgstr "Masukkan nama antrian" msgid "Enter a subscriber" msgstr "Masukkan pelanggan" msgid "Free Messages" msgstr "Free Messages (pesan bebas)" msgid "GET" msgstr "GET" msgid "Group" msgstr "Group (grup))" msgid "Group of the pool." msgstr "Grup pool." msgid "HEAD" msgstr "HEAD" msgid "ID" msgstr "ID" msgid "List Messages" msgstr "List Messages" msgid "Messages" msgstr "Messages" #, python-format msgid "Messages has been posted to queue %s successfully." msgstr "Messages telah dikirim ke antrian %s dengan sukses." msgid "Methods" msgstr "Methods" msgid "Name" msgstr "Nama" msgid "Name of the flavor." msgstr "Nama flavor." msgid "Name of the pool." msgstr "Nama pool." msgid "" "Note that you can create a queue without defining metadata.\n" " The metadata step is optional but recommended." msgstr "" "Perhatikan bahwa Anda dapat membuat antrian tanpa mendefinisikan metadata.\n" "       Langkah metadata adalah opsional, tetapi dianjurkan." msgid "Note that you can create a subscription without defining options." msgstr "" "Perhatikan bahwa Anda dapat membuat berlangganan tanpa opsi yang menentukan." msgid "OPTIONS" msgstr "OPTIONS" msgid "Options" msgstr "Options (opsi)" msgid "POST" msgstr "POST" msgid "PUT" msgstr "PUT" msgid "Paths" msgstr "Paths" msgid "Pool" msgstr "Pool (kolam)" #, python-format msgid "Pool %s was successfully created." msgstr "Pool %s berhasil dibuat." #, python-format msgid "Pool %s was successfully updated." msgstr "Pool %s telah berhasil diperbarui." msgid "Pool Flavor" msgstr "Pool Flavor (flavor kolam)" msgid "Pool Flavors" msgstr "Pool Flavors (flavor kolam)" msgid "Pool Group" msgstr "Pool Group (group kolam)" #, python-format msgid "Pool flavor %s was successfully created." msgstr "Pool flavor %s berhasil dibuat." #, python-format msgid "Pool flavor %s was successfully updated." msgstr "Pool flavor %s telah berhasil diperbarui." msgid "Pool group for flavor." msgstr "Grup pool flavor." msgid "Pools" msgstr "Pools (kolam)" msgid "Post" msgstr "Post" msgid "Post Messages" msgstr "Post Messages" msgid "Purge" msgstr "Purge" msgid "Purge Queue" msgstr "Purge Queue" #, python-format msgid "Queue %s has been purged successfully." msgstr "Queue %s has been purged successfully." #, python-format msgid "Queue %s was successfully created." msgstr "Antian %s berhasil dibuat." #, python-format msgid "Queue %s was successfully updated." msgstr "Queue %s telah berhasil diperbarui." msgid "Queue Details" msgstr "Rincian Queue (antrian)" msgid "Queue Metadata" msgstr "Metadata Queue (antrian)" msgid "Queue Name" msgstr "Queue Name (nama antrian)" msgid "Queues" msgstr "Queues (antrian)" #, python-format msgid "Removed %(subscriber)s subscriber from the %(queue)s queue." msgstr "Dihapus %(subscriber)s pelanggan dari %(queue)s antre." msgid "See a sample as below:" msgstr "Lihat contoh seperti di bawah ini:" msgid "Signed URL" msgstr "Signed URL" #, python-format msgid "Signed URL for %s" msgstr "Signed URL untuk %s" #, python-format msgid "" "Signed URL was successfully created for the queue %s with expires %s and " "signature %s." msgstr "" "Signed URL berhasil dibuat untuk antrian %s dengan kadaluarsa %s dan tanda " "tangan %s." msgid "Subscriber" msgstr "Subscriber (langganan)" msgid "Subscribers must be in the form of mailto, HTTP, or HTTPS." msgstr "Pelanggan harus dalam bentuk mailto, HTTP, atau HTTPS." msgid "Subscription" msgstr "Abonemen" #, python-format msgid "Subscription %s was successfully created." msgstr "Abonemen %s berhasil dibuat." msgid "Subscriptions" msgstr "Subscriptions" msgid "TTL Seconds" msgstr "TTL Seconds" msgid "The TTL for a subscription must be at least 60 seconds long." msgstr "TTL untuk berlangganan harus minimal 60 detik." msgid "" "The client specifies only the body and TTL for the message. The server\n" " inserts metadata, such as ID and age." msgstr "" "Klien hanya menentukan tubuh dan TTL untuk pesannya. Server\n" "     memasukkan metadata, seperti ID dan usia." msgid "Time To Live" msgstr "Time To Live (waktu untuk hidup)" msgid "Time to Live" msgstr "Time to Live (waktu untuk hidup)" msgid "Total Messages" msgstr "Total Messages (total pesan)" msgid "URI" msgstr "URI" msgid "URI for storage engine of this pool." msgstr "URI untuk mesin penyimpanan pool ini." msgid "Unable to add subscription." msgstr "Tidak dapat menambahkan langganan." msgid "Unable to create signed URL." msgstr "Tidak dapat membuat URL yang ditandatangan (signed URL)." msgid "Unable to create the flavor." msgstr "Tidak dapat membuat flavor." msgid "Unable to create the pool." msgstr "Tidak dapat membuat kolam." msgid "Unable to create the queue." msgstr "Tidak dapat membuat antrian." #, python-format msgid "Unable to delete Pool Flavor: %s." msgid_plural "Unable to delete Pool Flavors: %s." msgstr[0] "Unable to delete Pool Flavor: %s." #, python-format msgid "Unable to delete Pool: %s." msgid_plural "Unable to delete Pools: %s." msgstr[0] "Unable to delete Pool: %s." #, python-format msgid "Unable to delete Queue: %s." msgid_plural "Unable to delete Queues: %s." msgstr[0] "Tidak dapat menghapus antrian: %s." msgid "Unable to delete subscription." msgstr "Tidak dapat menghapus langganan." msgid "Unable to get messages." msgstr "Tidak dapat menerima pesan." msgid "Unable to post messages." msgstr "Tidak dapat mengeposkan pesan" msgid "Unable to purge the queue." msgstr "Unable to purge the queue." msgid "Unable to retrieve the Queue." msgstr "Unable to retrieve the Queue." msgid "Unable to retrieve the Queues." msgstr "Tidak dapat mengambil Queues (antrian)" msgid "Unable to retrieve the flavor." msgstr "Tidak dapat mengambil flavor." msgid "Unable to retrieve the flavors." msgstr "Tidak dapat mengambil flavor." msgid "Unable to retrieve the pool." msgstr "Tidak dapat mengambil kolam (pool)." msgid "Unable to retrieve the pools." msgstr "Tidak dapat mengambil kolam (pool)." msgid "Unable to update the flavor." msgstr "Tidak dapat memperbarui flavor." msgid "Unable to update the pool." msgstr "Tidak dapat memperbarui kolam." msgid "Unable to update the queue." msgstr "Tidak dapat memperbarui antrian." msgid "Update" msgstr "Perbaharui" msgid "Update Pool" msgstr "Perbaharui pool" msgid "Update Pool Flavor" msgstr "Update Pool Flavor (perbaharui pool flavor)" msgid "Update Queue" msgstr "Perbaharui Queue" msgid "View Messages" msgstr "View Messages" msgid "Weight" msgstr "Weight (berat)" msgid "Weight of the pool." msgstr "Berat pool." #, python-format msgid "You are not allowed to delete pool flavors: %s" msgstr "Anda tidak diizinkan untuk menghapus pool flavors: %s" #, python-format msgid "You are not allowed to delete pools: %s" msgstr "Anda tidak diizinkan untuk menghapus pool: %s" #, python-format msgid "You are not allowed to delete queues: %s" msgstr "Anda tidak diizinkan untuk menghapus queues: %s" msgid "" "You can submit up to 10 messages in a single request, but you must always\n" " encapsulate the messages in a collection container (an array in JSON, " "even\n" " for a single message - without the JSON array, you receive the " "\"Invalid\n" " request body\" message). The resulting value of the Location header or\n" " response body might be used to retrieve the created messages for " "further\n" " processing." msgstr "" "Anda bisa mengirimkan hingga 10 message dalam satu permintaan, tapi Anda " "harus selalu\n" "     Encapsulate pesan dalam wadah koleksi (sebuah array di JSON, genap\n" "     Untuk satu pesan - tanpa array JSON, Anda akan menerima \"Invalid\n" "     Permintaan tubuh \"). Nilai yang dihasilkan dari header Lokasi atau\n" "     Tubuh respons mungkin digunakan untuk mengambil pesan yang dibuat untuk " "lebih jauh\n" "     pengolahan." #, python-format msgid "You have selected \"%s\". Deleted Pool Flavor is not recoverable." msgid_plural "" "You have selected \"%s\". Deleted Pool Flavors are not recoverable." msgstr[0] "You have selected \"%s\". Deleted Pool Flavor is not recoverable." #, python-format msgid "You have selected \"%s\". Deleted Pool is not recoverable." msgid_plural "You have selected \"%s\". Deleted Pools are not recoverable." msgstr[0] "You have selected \"%s\". Deleted Pool is not recoverable." #, python-format msgid "You have selected \"%s\". Deleted queue is not recoverable." msgid_plural "You have selected \"%s\". Deleted queues are not recoverable." msgstr[0] "Anda telah memilih \"%s\". Antrian dihapus tidak dapat dipulihkan." msgid "" "You must specify one of the pool groups that is configured in storage pools." msgstr "" "Anda harus menentukan salah satu kelompok pool yang dikonfigurasi dalam pool " "penyimpanan." msgid "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgstr "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgid "e.g. mongodb://127.0.0.1:27017" msgstr "e.g. mongodb://127.0.0.1:27017" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5491455 zaqar_ui-18.0.0/zaqar_ui/locale/ja/0000775000175000017500000000000000000000000017102 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5731473 zaqar_ui-18.0.0/zaqar_ui/locale/ja/LC_MESSAGES/0000775000175000017500000000000000000000000020667 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/locale/ja/LC_MESSAGES/django.po0000664000175000017500000000164500000000000022477 0ustar00zuulzuul00000000000000# Shu Muto , 2016. #zanata # Shu Muto , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui 2.0.0.0b4.dev2\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2017-01-31 09:28+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-01 04:17+0000\n" "Last-Translator: Shu Muto \n" "Language-Team: Japanese\n" "Language: ja\n" "X-Generator: Zanata 3.7.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "Messaging" msgstr "メッセージング" msgid "Pool Flavors" msgstr "プールフレーバー" msgid "Pools" msgstr "プール" msgid "Queues" msgstr "キュー" #, python-format msgid "The specified input is not a valid YAML format: %s" msgstr "指定された入力は有効な YAML 形式ではありません: %s" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/locale/ja/LC_MESSAGES/djangojs.po0000664000175000017500000003232100000000000023027 0ustar00zuulzuul00000000000000# Shu Muto , 2016. #zanata # Shu Muto , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui 3.0.0.0b3.dev32\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2017-07-27 01:43+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-07-27 02:57+0000\n" "Last-Translator: Shu Muto \n" "Language-Team: Japanese\n" "Language: ja\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "A queue name between 1-256 characters is required." msgstr "1-256 文字のキュー名が必要です。" msgid "Actions" msgstr "アクション" msgid "Age" msgstr "保存期間" msgid "" "An optional request component related to storage-specific options in YAML " "format." msgstr "" "ストレージ固有のオプションに関連付ける追加の要素を YAML 形式で入力してくださ" "い。" msgid "Body" msgstr "本文" msgid "Capabilities" msgstr "機能" msgid "Choose resource to purge" msgstr "削除するリソースを選択してください。" msgid "Claimed Messages" msgstr "要求メッセージ数" msgid "Claims" msgstr "請求" msgid "Confirm Delete Pool" msgid_plural "Confirm Delete Pools" msgstr[0] "プールの削除の確認" msgid "Confirm Delete Pool Flavor" msgid_plural "Confirm Delete Pool Flavors" msgstr[0] "プールフレーバーの削除の確認" msgid "Confirm Delete Queue" msgid_plural "Confirm Delete queues" msgstr[0] "キューの削除の確認" msgid "Confirmed" msgstr "確認状態" msgid "Create" msgstr "作成" msgid "Create Pool" msgstr "プールの作成" msgid "Create Pool Flavor" msgstr "プールフレーバーの作成" msgid "Create Queue" msgstr "キューの作成" msgid "Create Queues" msgstr "キューの作成" msgid "Create Subscription" msgstr "サブスクリプションの作成" msgid "Creating Signed URL" msgstr "署名済み URL の作成中" msgid "DELETE" msgstr "DELETE" msgid "Delete" msgstr "削除" msgid "Delete Pool" msgid_plural "Delete Pools" msgstr[0] "プールの削除" msgid "Delete Pool Flavor" msgid_plural "Delete Pool Flavors" msgstr[0] "プールフレーバーの削除" msgid "Delete Pool Flavors" msgstr "プールフレーバーの削除" msgid "Delete Pools" msgstr "プールの削除" msgid "Delete Queue" msgid_plural "Delete Queues" msgstr[0] "キューの削除" msgid "Delete Queues" msgstr "キューの削除" #, python-format msgid "Deleted Pool Flavor: %s." msgid_plural "Deleted Pool Flavors: %s." msgstr[0] "プールフレーバー %s を削除しました。" #, python-format msgid "Deleted Pool: %s." msgid_plural "Deleted Pools: %s." msgstr[0] "プール %s を削除しました。" #, python-format msgid "Deleted Queue: %s." msgid_plural "Deleted Queues: %s." msgstr[0] "キュー %s を削除しました。" msgid "Describes flavor-specific capabilities in YAML format." msgstr "フレーバー固有の機能を YAML 形式で記述してください。" msgid "Enter a queue name" msgstr "キューの名前を入力してください。" msgid "Enter a subscriber" msgstr "サブスクライバーを入力してください" msgid "Free Messages" msgstr "空きメッセージ数" msgid "GET" msgstr "GET" msgid "Group" msgstr "グループ" msgid "Group of the pool." msgstr "プールのグループ" msgid "HEAD" msgstr "HEAD" msgid "ID" msgstr "ID" msgid "List Messages" msgstr "メッセージ一覧" msgid "Messages" msgstr "メッセージ" #, python-format msgid "Messages has been posted to queue %s successfully." msgstr "キュー %s にメッセージが正常に送信されました。" msgid "Methods" msgstr "メソッド" msgid "Name" msgstr "名前" msgid "Name of the flavor." msgstr "フレーバーの名前。" msgid "Name of the pool." msgstr "プールの名前。" msgid "" "Note that you can create a queue without defining metadata.\n" " The metadata step is optional but recommended." msgstr "" "メタデータを定義しないでキューを作成できることに留意してください。\n" " メタデータのステップはオプションですが、推奨されています。" msgid "Note that you can create a subscription without defining options." msgstr "" "オプションを定義しないでサブスクリプションを作成できることに留意してくださ" "い。" msgid "OPTIONS" msgstr "OPTIONS" msgid "Options" msgstr "オプション" msgid "POST" msgstr "POST" msgid "PUT" msgstr "PUT" msgid "Paths" msgstr "パス" msgid "Pool" msgstr "プール" #, python-format msgid "Pool %s was successfully created." msgstr "プール %s が正常に作成されました。" #, python-format msgid "Pool %s was successfully updated." msgstr "プール %s が正常に更新されました。" msgid "Pool Flavor" msgstr "プールフレーバー" msgid "Pool Flavors" msgstr "プールフレーバー" msgid "Pool Group" msgstr "プールグループ" #, python-format msgid "Pool flavor %s was successfully created." msgstr "プールフレーバー %s が正常に作成されました。" #, python-format msgid "Pool flavor %s was successfully updated." msgstr "プールフレーバー %s が正常に更新されました。" msgid "Pool group for flavor." msgstr "フレーバーのプールグループ" msgid "Pools" msgstr "プール" msgid "Post" msgstr "送信" msgid "Post Messages" msgstr "メッセージの送信" msgid "Purge" msgstr "空にする" msgid "Purge Queue" msgstr "キューを空にする" #, python-format msgid "Queue %s has been purged successfully." msgstr "キュー %s が正常に空にされました。" #, python-format msgid "Queue %s was successfully created." msgstr "キュー %s が正常に作成されました。" #, python-format msgid "Queue %s was successfully updated." msgstr "キュー %s が正常に更新されました。" msgid "Queue Details" msgstr "キューの詳細" msgid "Queue Metadata" msgstr "キューのメタデータ" msgid "Queue Name" msgstr "キュー名" msgid "Queues" msgstr "キュー" #, python-format msgid "Removed %(subscriber)s subscriber from the %(queue)s queue." msgstr "" "キュー %(queue)s から、サブスクライバー %(subscriber)s が削除されました。" msgid "See a sample as below:" msgstr "以下の例を参照してください:" msgid "Signed URL" msgstr "署名済み URL" #, python-format msgid "Signed URL for %s" msgstr "%s の署名済み URL" #, python-format msgid "" "Signed URL was successfully created for the queue %s with expires %s and " "signature %s." msgstr "" "キュー %s の署名済み URL が期限 %s および署名 %s で正常に作成されました。" msgid "Subscriber" msgstr "サブスクライバー" msgid "Subscribers must be in the form of mailto, HTTP, or HTTPS." msgstr "" "サブスクライバーは、 mailto 、HTTP 、あるいは HTTPSの形式である必要がありま" "す。" msgid "Subscription" msgstr "サブスクリプション" #, python-format msgid "Subscription %s was successfully created." msgstr "サブスクリプション %s が正常に作成されました。" msgid "Subscriptions" msgstr "サブスクリプション" msgid "TTL Seconds" msgstr "TTL 秒数" msgid "The TTL for a subscription must be at least 60 seconds long." msgstr "サブスクリプションの有効期間は、少なくとも 60 秒でなければなりません。" msgid "" "The client specifies only the body and TTL for the message. The server\n" " inserts metadata, such as ID and age." msgstr "" "クライアントは、メッセージの本文と TTL のみ指定可能です。サーバーは、ID や " "age などのメタデータを挿入します。" msgid "Time To Live" msgstr "有効期間" msgid "Time to Live" msgstr "有効期間" msgid "Total Messages" msgstr "合計メッセージ数" msgid "URI" msgstr "URI" msgid "URI for storage engine of this pool." msgstr "このプールのストレージプールの URI" msgid "Unable to add subscription." msgstr "サブスクリプションを追加できません。" msgid "Unable to create signed URL." msgstr "署名済み URL を作成できません。" msgid "Unable to create the flavor." msgstr "フレーバーを作成できません。" msgid "Unable to create the pool." msgstr "プールを作成できません。" msgid "Unable to create the queue." msgstr "キューを作成できません。" #, python-format msgid "Unable to delete Pool Flavor: %s." msgid_plural "Unable to delete Pool Flavors: %s." msgstr[0] "プールフレーバーを削除できません: %s" #, python-format msgid "Unable to delete Pool: %s." msgid_plural "Unable to delete Pools: %s." msgstr[0] "プールを削除できません: %s" #, python-format msgid "Unable to delete Queue: %s." msgid_plural "Unable to delete Queues: %s." msgstr[0] "キューを削除できません: %s" msgid "Unable to delete subscription." msgstr "サブスクリプションを削除できません。" msgid "Unable to get messages." msgstr "メッセージを取得できません。" msgid "Unable to post messages." msgstr "メッセージを送信できません。" msgid "Unable to purge the queue." msgstr "キューを空にできません。" msgid "Unable to retrieve the Queue." msgstr "キューを取得できません。" msgid "Unable to retrieve the Queues." msgstr "キューの一覧を取得できません。" msgid "Unable to retrieve the flavor." msgstr "フレーバーを取得できません。" msgid "Unable to retrieve the flavors." msgstr "フレーバーの一覧を取得できません。" msgid "Unable to retrieve the pool." msgstr "プールを取得できません。" msgid "Unable to retrieve the pools." msgstr "プール一覧を取得できません。" msgid "Unable to update the flavor." msgstr "フレーバーを更新できません。" msgid "Unable to update the pool." msgstr "プールを更新できません。" msgid "Unable to update the queue." msgstr "キューを更新できません。" msgid "Update" msgstr "更新" msgid "Update Pool" msgstr "プールの更新" msgid "Update Pool Flavor" msgstr "プールフレーバーの更新" msgid "Update Queue" msgstr "キューの更新" msgid "View Messages" msgstr "メッセージ一覧の閲覧" msgid "Weight" msgstr "重み" msgid "Weight of the pool." msgstr "プールの重み。" #, python-format msgid "You are not allowed to delete pool flavors: %s" msgstr "プールフレーバーの削除は許可されていません: %s" #, python-format msgid "You are not allowed to delete pools: %s" msgstr "プールの削除は許可されていません: %s" #, python-format msgid "You are not allowed to delete queues: %s" msgstr "キューの削除は許可されていません: %s" msgid "" "You can submit up to 10 messages in a single request, but you must always\n" " encapsulate the messages in a collection container (an array in JSON, " "even\n" " for a single message - without the JSON array, you receive the " "\"Invalid\n" " request body\" message). The resulting value of the Location header or\n" " response body might be used to retrieve the created messages for " "further\n" " processing." msgstr "" "1つのリクエストでメッセージを 10 個まで送信できますが、メッセージを1つのコ" "レクションコンテナー(1つのメッセージでも JSON の中の1つの配列)に格納する" "必要があります。そうでなければ、「無効なリクエスト本文です。」というメッセー" "ジを受け取ります。Location ヘッダーやレスポンス本文の結果の値は、作成された" "メッセージの更なる処理のために取得するときに利用できます。" #, python-format msgid "You have selected \"%s\". Deleted Pool Flavor is not recoverable." msgid_plural "" "You have selected \"%s\". Deleted Pool Flavors are not recoverable." msgstr[0] "\"%s\" を選択しました。削除されたプールフレーバーは元に戻せません。" #, python-format msgid "You have selected \"%s\". Deleted Pool is not recoverable." msgid_plural "You have selected \"%s\". Deleted Pools are not recoverable." msgstr[0] "\"%s\" を選択しました。削除されたプールは元に戻せません。" #, python-format msgid "You have selected \"%s\". Deleted queue is not recoverable." msgid_plural "You have selected \"%s\". Deleted queues are not recoverable." msgstr[0] "\"%s\" を選択しました。削除されたキューは元に戻せません。" msgid "" "You must specify one of the pool groups that is configured in storage pools." msgstr "" "ストレージプールで設定されているプールグループの1つを指定する必要があります。" msgid "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgstr "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgid "e.g. mongodb://127.0.0.1:27017" msgstr "例: mongodb://127.0.0.1:27017" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5491455 zaqar_ui-18.0.0/zaqar_ui/locale/ko_KR/0000775000175000017500000000000000000000000017515 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5731473 zaqar_ui-18.0.0/zaqar_ui/locale/ko_KR/LC_MESSAGES/0000775000175000017500000000000000000000000021302 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591551.0 zaqar_ui-18.0.0/zaqar_ui/locale/ko_KR/LC_MESSAGES/django.po0000664000175000017500000000157300000000000023112 0ustar00zuulzuul00000000000000# Ian Y. Choi , 2016. #zanata # Eunseop Shin , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-02-19 00:40+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-11 03:30+0000\n" "Last-Translator: Eunseop Shin \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 "Messaging" msgstr "메시징" msgid "Pool Flavors" msgstr "Pool Flavors" msgid "Pools" msgstr "풀" msgid "Queues" msgstr "큐" #, python-format msgid "The specified input is not a valid YAML format: %s" msgstr "입력한 값이 YAML 포멧에 맞지 않습니다: %s" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/locale/ko_KR/LC_MESSAGES/djangojs.po0000664000175000017500000002570300000000000023450 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata # Ian Y. Choi , 2016. #zanata # Sungjin Kang , 2016. #zanata # Eunseop Shin , 2017. #zanata # minwook-shin , 2017. #zanata # ByungYeol Woo , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-25 01:55+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-05-01 10:52+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 "A queue name between 1-256 characters is required." msgstr "큐 이름은 1-256 문자로 되어야 합니다." msgid "Actions" msgstr "작업" msgid "Age" msgstr "연령" msgid "" "An optional request component related to storage-specific options in YAML " "format." msgstr "YAML 형식의 스토리지-특정 옵션과 관련된 선택적 요청 구성 요소." msgid "Body" msgstr "내용" msgid "Capabilities" msgstr "기능들" msgid "Choose resource to purge" msgstr "삭제할 리소스 선택" msgid "Claimed Messages" msgstr "요청 메시지" msgid "Claims" msgstr "청구" msgid "Confirm Delete Pool" msgid_plural "Confirm Delete Pools" msgstr[0] "Pool 삭제 확인" msgid "Confirm Delete Pool Flavor" msgid_plural "Confirm Delete Pool Flavors" msgstr[0] "Pool Flavor 삭제 확인" msgid "Confirm Delete Queue" msgid_plural "Confirm Delete queues" msgstr[0] "큐 삭제 확인" msgid "Confirmed" msgstr "Confirmed" msgid "Create" msgstr "생성" msgid "Create Pool" msgstr "Pool 생성" msgid "Create Pool Flavor" msgstr "Pool Flavor 생성" msgid "Create Queue" msgstr "큐 생성" msgid "Create Queues" msgstr "큐 생성" msgid "Create Subscription" msgstr "구독 생성" msgid "Creating Signed URL" msgstr "서명된 URL 만들기" msgid "DELETE" msgstr "삭제" msgid "Delete" msgstr "삭제" msgid "Delete Pool" msgid_plural "Delete Pools" msgstr[0] "풀 삭제" msgid "Delete Pool Flavor" msgid_plural "Delete Pool Flavors" msgstr[0] "Pool Flavor 삭제" msgid "Delete Pool Flavors" msgstr "Pool Flavors 삭제" msgid "Delete Pools" msgstr "Pool 삭제" msgid "Delete Queue" msgid_plural "Delete Queues" msgstr[0] "큐 삭제" msgid "Delete Queues" msgstr "큐 삭제" #, python-format msgid "Deleted Pool Flavor: %s." msgid_plural "Deleted Pool Flavors: %s." msgstr[0] "삭제된 Pool Flavor: %s." #, python-format msgid "Deleted Pool: %s." msgid_plural "Deleted Pools: %s." msgstr[0] "삭제된 풀: %s." #, python-format msgid "Deleted Queue: %s." msgid_plural "Deleted Queues: %s." msgstr[0] "큐 삭제됨: %s." msgid "Describes flavor-specific capabilities in YAML format." msgstr "YAML 형식의 flavor-specific 관련 기능을 설명합니다." msgid "Enter a queue name" msgstr "큐 이름을 입력합니다" msgid "Enter a subscriber" msgstr "구독자를 입력합니다" msgid "Free Messages" msgstr "프리 메시지" msgid "GET" msgstr "GET" msgid "Group" msgstr "Group" msgid "Group of the pool." msgstr "풀 그룹입니다." msgid "HEAD" msgstr "헤드" msgid "ID" msgstr "ID" msgid "List Messages" msgstr "메시지 목록" msgid "Messages" msgstr "Messages" #, python-format msgid "Messages has been posted to queue %s successfully." msgstr "메시지가 큐 %s에 성공적으로 게시되었습니다." msgid "Methods" msgstr "방법" msgid "Name" msgstr "이름" msgid "Name of the flavor." msgstr "Flavor의 이름." msgid "Name of the pool." msgstr "풀 이름입니다." msgid "" "Note that you can create a queue without defining metadata.\n" " The metadata step is optional but recommended." msgstr "" "참고로 메타데이터 정의 없이 큐 생성이 가능합니다.\n" " 메타데이터 단계는 옵션이지만 권장합니다." msgid "Note that you can create a subscription without defining options." msgstr "참고로 옵션 정의 없이 구독 생성이 가능합니다." msgid "OPTIONS" msgstr "옵션" msgid "Options" msgstr "옵션" msgid "POST" msgstr "게시" msgid "PUT" msgstr "PUT" msgid "Paths" msgstr "경로" msgid "Pool" msgstr "Pool" #, python-format msgid "Pool %s was successfully created." msgstr "Pool %s가 성공적으로 생성되었습니다." #, python-format msgid "Pool %s was successfully updated." msgstr "풀 %s가 성공적으로 업데이트되었습니다." msgid "Pool Flavor" msgstr "Pool Flavor" msgid "Pool Flavors" msgstr "Pool Flavors" msgid "Pool Group" msgstr "풀 그룹" #, python-format msgid "Pool flavor %s was successfully created." msgstr "Pool flavor %s가 성공적으로 생성되었습니다." #, python-format msgid "Pool flavor %s was successfully updated." msgstr "Pool flavor %s가 성공적으로 업데이트 되었습니다." msgid "Pool group for flavor." msgstr "Flavor를 위한 Pool Group." msgid "Pools" msgstr "Pools" msgid "Post" msgstr "보내기" msgid "Post Messages" msgstr "포스트 메시지" msgid "Purge" msgstr "영구 제거" msgid "Purge Queue" msgstr "큐 제거" #, python-format msgid "Queue %s has been purged successfully." msgstr "큐 %s가 성공적으로 제거되었습니다." #, python-format msgid "Queue %s was successfully created." msgstr "큐 %s 를 성공적으로 생성하였습니다." #, python-format msgid "Queue %s was successfully updated." msgstr "큐 %s를 성공적으로 삭제하였습니다." msgid "Queue Details" msgstr "큐 세부사항" msgid "Queue Metadata" msgstr "큐 메타데이터" msgid "Queue Name" msgstr "큐 이름" msgid "Queues" msgstr "큐" #, python-format msgid "Removed %(subscriber)s subscriber from the %(queue)s queue." msgstr "%(subscriber)s 구독자를 %(queue)s 큐에서 제거하였습니다." msgid "See a sample as below:" msgstr "아래 샘플을 보십시오:" msgid "Signed URL" msgstr "서명된 URL" #, python-format msgid "Signed URL for %s" msgstr "%s에서의 서명된 URL" msgid "Subscriber" msgstr "구독자" msgid "Subscribers must be in the form of mailto, HTTP, or HTTPS." msgstr "구독자는 mailto, HTTP, 또는 HTTPS 형태로 되어야 합니다." msgid "Subscription" msgstr "구독" #, python-format msgid "Subscription %s was successfully created." msgstr "큐 %s 를 성공적으로 생성하였습니다." msgid "Subscriptions" msgstr "구독" msgid "TTL Seconds" msgstr "TTL 초" msgid "The TTL for a subscription must be at least 60 seconds long." msgstr "구독자에 대한 TTL은 적어도 60초 길이여야 합니다." msgid "Time To Live" msgstr "지속 시간" msgid "Time to Live" msgstr "Time to Live" msgid "Total Messages" msgstr "총 메시지" msgid "URI" msgstr "URI" msgid "URI for storage engine of this pool." msgstr "이 풀의 스토리지 엔진에 대한 URI입니다." msgid "Unable to add subscription." msgstr "구독을 추가할 수 없습니다." msgid "Unable to create signed URL." msgstr "서명된 URL을 만들 수 없습니다." msgid "Unable to create the flavor." msgstr "Flavor 생성을 할 수 없습니다." msgid "Unable to create the pool." msgstr "풀을 생성 할 수 없습니다." msgid "Unable to create the queue." msgstr "큐를 생성할 수 없습니다." #, python-format msgid "Unable to delete Pool Flavor: %s." msgid_plural "Unable to delete Pool Flavors: %s." msgstr[0] "Pool Flavor를 삭제 할 수 없습니다.: %s." #, python-format msgid "Unable to delete Pool: %s." msgid_plural "Unable to delete Pools: %s." msgstr[0] "Pool을 삭제할 수 없습니다: %s." #, python-format msgid "Unable to delete Queue: %s." msgid_plural "Unable to delete Queues: %s." msgstr[0] "큐를 삭제할 수 없습니다: %s." msgid "Unable to delete subscription." msgstr "구독을 삭제할 수 없습니다." msgid "Unable to get messages." msgstr "메시지를 가져올 수 없습니다." msgid "Unable to post messages." msgstr "메시지를 게시할 수 없습니다." msgid "Unable to purge the queue." msgstr "큐를 제거 할 수 없습니다." msgid "Unable to retrieve the Queue." msgstr "큐를 검색 할 수 없습니다." msgid "Unable to retrieve the Queues." msgstr "큐를 가져올 수 없습니다." msgid "Unable to retrieve the flavor." msgstr "Flavor를 가져올 수 없습니다." msgid "Unable to retrieve the flavors." msgstr "Flavor를 가져올 수 없습니다." msgid "Unable to retrieve the pool." msgstr "풀을 찾을 수 없습니다." msgid "Unable to retrieve the pools." msgstr "풀을 찾을 수 없습니다." msgid "Unable to update the flavor." msgstr "Flavor 업데이트를 할 수 없습니다." msgid "Unable to update the pool." msgstr "풀을 업데이트 할 수 없습니다." msgid "Unable to update the queue." msgstr "큐를 업데이트할 수 없습니다." msgid "Update" msgstr "업데이트" msgid "Update Pool" msgstr "풀 업데이트" msgid "Update Pool Flavor" msgstr "Pool Flavor 업데이트" msgid "Update Queue" msgstr "큐 업데이트" msgid "View Messages" msgstr "메시지 보기" msgid "Weight" msgstr "Weight" msgid "Weight of the pool." msgstr "풀에서 풀 멤버 가중치입니다." #, python-format msgid "You are not allowed to delete pool flavors: %s" msgstr "pool flavors 삭제가 허용되지 않았습니다 : %s" #, python-format msgid "You are not allowed to delete pools: %s" msgstr "Pool 삭제가 허용되어 있지 않습니다: %s" #, python-format msgid "You are not allowed to delete queues: %s" msgstr "큐 삭제가 허용되어 있지 않습니다: %s" #, python-format msgid "You have selected \"%s\". Deleted Pool Flavor is not recoverable." msgid_plural "" "You have selected \"%s\". Deleted Pool Flavors are not recoverable." msgstr[0] "\"%s\"를 선택했습니다. 삭제된 Pool Flavor는 복구 할 수 없습니다." #, python-format msgid "You have selected \"%s\". Deleted Pool is not recoverable." msgid_plural "You have selected \"%s\". Deleted Pools are not recoverable." msgstr[0] "\"%s\"를 선택했습니다. 삭제된 Pool은 복구 할 수 없습니다." #, python-format msgid "You have selected \"%s\". Deleted queue is not recoverable." msgid_plural "You have selected \"%s\". Deleted queues are not recoverable." msgstr[0] "\"%s\"를 선택했습니다. 삭제된 큐는 복구 할 수 없습니다." msgid "" "You must specify one of the pool groups that is configured in storage pools." msgstr "저장 영역 풀에 구성된 풀 그룹 중 하나를 지정해야합니다." msgid "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgstr "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgid "e.g. mongodb://127.0.0.1:27017" msgstr "e.g. mongodb://127.0.0.1:27017" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5491455 zaqar_ui-18.0.0/zaqar_ui/locale/pt_BR/0000775000175000017500000000000000000000000017516 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5731473 zaqar_ui-18.0.0/zaqar_ui/locale/pt_BR/LC_MESSAGES/0000775000175000017500000000000000000000000021303 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/locale/pt_BR/LC_MESSAGES/django.po0000664000175000017500000000154400000000000023111 0ustar00zuulzuul00000000000000# Rodrigo Loures , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-02-19 00:40+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-01-24 09:13+0000\n" "Last-Translator: Rodrigo Loures \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 "Messaging" msgstr "Mensagens" msgid "Pool Flavors" msgstr "Pool de sabores" msgid "Pools" msgstr "Pools" msgid "Queues" msgstr "Filas" #, python-format msgid "The specified input is not a valid YAML format: %s" msgstr "A entrada especificada não é um fomato válido de YAML: %s" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/locale/pt_BR/LC_MESSAGES/djangojs.po0000664000175000017500000003056600000000000023454 0ustar00zuulzuul00000000000000# Rodrigo Loures , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-02-19 00:40+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-01-30 09:26+0000\n" "Last-Translator: Rodrigo Loures \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 "A queue name between 1-256 characters is required." msgstr "É requerido um nome de fila entre 1-256 caracteres." msgid "Actions" msgstr "Ações" msgid "Age" msgstr "Idade" msgid "" "An optional request component related to storage-specific options in YAML " "format." msgstr "" "Um componente de requisição opcional relacionado a opções específicas de " "armazenamento no formato YAML." msgid "Body" msgstr "Corpo" msgid "Capabilities" msgstr "Capacidades" msgid "Claimed Messages" msgstr "Mensagens reivindicadas" msgid "Claims" msgstr "Reivindicações" msgid "Confirm Delete Pool" msgid_plural "Confirm Delete Pools" msgstr[0] "Confirma exclusão de Pool" msgstr[1] "Confirma exclusão de Pools" msgid "Confirm Delete Pool Flavor" msgid_plural "Confirm Delete Pool Flavors" msgstr[0] "Confirma a exclusão do Pool de Sabor" msgstr[1] "Confirma a exclusão do Pool de Sabores" msgid "Confirm Delete Queue" msgid_plural "Confirm Delete queues" msgstr[0] "Confirma excluir a fila" msgstr[1] "Confirma excluir as filas" msgid "Confirmed" msgstr "Confirmado" msgid "Create" msgstr "Criar" msgid "Create Pool" msgstr "Criar Pool" msgid "Create Pool Flavor" msgstr "Criar Pool de Sabor" msgid "Create Queue" msgstr "Criar fila" msgid "Create Queues" msgstr "Criar filas" msgid "Create Subscription" msgstr "Criar Subscrição" msgid "Creating Signed URL" msgstr "Criando URL assinada" msgid "DELETE" msgstr "DELETE" msgid "Delete" msgstr "Excluir" msgid "Delete Pool" msgid_plural "Delete Pools" msgstr[0] "Excluir Pool" msgstr[1] "Excluir Pools" msgid "Delete Pool Flavor" msgid_plural "Delete Pool Flavors" msgstr[0] "Excluir Pool de Sabor" msgstr[1] "Excluir Pool de Sabores" msgid "Delete Pool Flavors" msgstr "Excluir Pool de Sabores" msgid "Delete Pools" msgstr "Excluir Pools" msgid "Delete Queue" msgid_plural "Delete Queues" msgstr[0] "Excluir fila" msgstr[1] "Excluir filas" msgid "Delete Queues" msgstr "Excluir filas" #, python-format msgid "Deleted Pool Flavor: %s." msgid_plural "Deleted Pool Flavors: %s." msgstr[0] "Pool de sabor excluído: %s." msgstr[1] "Pool de sabores excluídos: %s." #, python-format msgid "Deleted Pool: %s." msgid_plural "Deleted Pools: %s." msgstr[0] "Pool excluído: %s." msgstr[1] "Pools excluídos: %s." #, python-format msgid "Deleted Queue: %s." msgid_plural "Deleted Queues: %s." msgstr[0] "Excluir fila: %s." msgstr[1] "Excluir filas: %s." msgid "Describes flavor-specific capabilities in YAML format." msgstr "Descreva as capacidades específicas do sabor no formato YAML." msgid "Enter a queue name" msgstr "Informe o nome da fila" msgid "Enter a subscriber" msgstr "Informe o subscritor" msgid "Free Messages" msgstr "Mensagens isentas" msgid "GET" msgstr "GET" msgid "Group" msgstr "Grupo" msgid "Group of the pool." msgstr "Grupo do pool." msgid "HEAD" msgstr "HEAD" msgid "ID" msgstr "ID" msgid "List Messages" msgstr "Lista de mensagens" msgid "Messages" msgstr "Mensagens" #, python-format msgid "Messages has been posted to queue %s successfully." msgstr "Mensagens foram publicadas na fila %s com sucesso." msgid "Methods" msgstr "Métodos" msgid "Name" msgstr "Nome" msgid "Name of the flavor." msgstr "Nome do sabor." msgid "Name of the pool." msgstr "Nome do pool." msgid "" "Note that you can create a queue without defining metadata.\n" " The metadata step is optional but recommended." msgstr "" "Note que você pode criar uma fila sem definir metadado. O passo de metadado " "é opcional mas recomendado." msgid "Note that you can create a subscription without defining options." msgstr "Note que você pode criar uma subscrição sem definir as opções." msgid "OPTIONS" msgstr "OPÇÕES" msgid "Options" msgstr "Opções" msgid "POST" msgstr "POST" msgid "PUT" msgstr "PUT" msgid "Paths" msgstr "Caminhos" msgid "Pool" msgstr "Pool" #, python-format msgid "Pool %s was successfully created." msgstr "O Pool %s foi criado com sucesso." #, python-format msgid "Pool %s was successfully updated." msgstr "O Pool %s foi atualizado com sucesso." msgid "Pool Flavor" msgstr "Pool de Sabor" msgid "Pool Flavors" msgstr "Pool de Sabores" msgid "Pool Group" msgstr "Grupo de Pool" #, python-format msgid "Pool flavor %s was successfully created." msgstr "O Pool de sabor %s foi criado com sucesso." #, python-format msgid "Pool flavor %s was successfully updated." msgstr "Pool de sabor %s foi atualizado com sucesso." msgid "Pool group for flavor." msgstr "Grupo de pool para o sabor." msgid "Pools" msgstr "Pools" msgid "Post" msgstr "Publicar" msgid "Post Messages" msgstr "Publicar mensagens." #, python-format msgid "Queue %s was successfully created." msgstr "A fila %s foi criada com sucesso." #, python-format msgid "Queue %s was successfully updated." msgstr "A fila %s foi atualizada com sucesso." msgid "Queue Details" msgstr "Detalhes da fila" msgid "Queue Metadata" msgstr "Metadados da fila" msgid "Queue Name" msgstr "Nome da fila" msgid "Queues" msgstr "Filas" #, python-format msgid "Removed %(subscriber)s subscriber from the %(queue)s queue." msgstr "Removido o %(subscriber)s subscritor da %(queue)s fila." msgid "See a sample as below:" msgstr "Veja um exemplo como abaixo:" msgid "Signed URL" msgstr "URL assinada" #, python-format msgid "Signed URL for %s" msgstr "URL assinada para %s" #, python-format msgid "" "Signed URL was successfully created for the queue %s with expires %s and " "signature %s." msgstr "" "A URL assinada foi criada com sucesso na fila %s com expiração %s e " "assinatura %s." msgid "Subscriber" msgstr "Subscritor" msgid "Subscribers must be in the form of mailto, HTTP, or HTTPS." msgstr "Subscritores devem estar no formulário de mailto, HTTP ou HTTPS." msgid "Subscription" msgstr "Subscrição " #, python-format msgid "Subscription %s was successfully created." msgstr "A Subscrição %s foi criada com sucesso." msgid "Subscriptions" msgstr "Subscrições" msgid "TTL Seconds" msgstr "Segundos TTL" msgid "The TTL for a subscription must be at least 60 seconds long." msgstr "" "O TTL para uma subscrição deve estar com ao menos 60 segundos de duração." msgid "" "The client specifies only the body and TTL for the message. The server\n" " inserts metadata, such as ID and age." msgstr "" "O cliente especifica somente o corpo e TTL para a mensagem. O servidor " "insere metadados, tal como ID e idade." msgid "Time To Live" msgstr "Tempo de vida" msgid "Time to Live" msgstr "Tempo de vida" msgid "Total Messages" msgstr "Total de mensagens" msgid "URI" msgstr "URI" msgid "URI for storage engine of this pool." msgstr "URI para motor de armazenamento desse pool." msgid "Unable to add subscription." msgstr "Não foi possível adicionar a subscrição." msgid "Unable to create signed URL." msgstr "Não foi possível criar URL assinada." msgid "Unable to create the flavor." msgstr "Não foi possível criar o sabor." msgid "Unable to create the pool." msgstr "Não foi possível criar o pool." msgid "Unable to create the queue." msgstr "Não foi possível criar a fila." #, python-format msgid "Unable to delete Pool Flavor: %s." msgid_plural "Unable to delete Pool Flavors: %s." msgstr[0] "Não foi possível excluir o Pool de Sabor: %s." msgstr[1] "Não foi possível excluir o Pool de Sabores: %s." #, python-format msgid "Unable to delete Pool: %s." msgid_plural "Unable to delete Pools: %s." msgstr[0] "Não é possível excluir o Pool: %s." msgstr[1] "Não é possível excluir os Pools: %s." #, python-format msgid "Unable to delete Queue: %s." msgid_plural "Unable to delete Queues: %s." msgstr[0] "Não foi possível excluir a fila: %s." msgstr[1] "Não foi possível excluir as filas: %s." msgid "Unable to delete subscription." msgstr "Não foi possível excluir a subscrição. " msgid "Unable to get messages." msgstr "Não foi possível obter mensagens." msgid "Unable to post messages." msgstr "Não foi possível postar mensagens." msgid "Unable to purge the queue." msgstr "Não foi possível limpar a fila." msgid "Unable to retrieve the Queue." msgstr "Não foi possível recuperar a fila." msgid "Unable to retrieve the Queues." msgstr "Não foi possível recuperar as filas." msgid "Unable to retrieve the flavor." msgstr "Não foi possível recuperar o sabor." msgid "Unable to retrieve the flavors." msgstr "Não foi possível recuperar os sabores." msgid "Unable to retrieve the pool." msgstr "Não foi possível recuperar o pool." msgid "Unable to retrieve the pools." msgstr "Não foi possível recuperar os pools." msgid "Unable to update the flavor." msgstr "Não foi possível atualizar o sabor." msgid "Unable to update the pool." msgstr "Não foi possível atualizar o pool." msgid "Unable to update the queue." msgstr "Não foi possível atualizar a fila." msgid "Update" msgstr "Atualizar" msgid "Update Pool" msgstr "Atualizar Pool" msgid "Update Pool Flavor" msgstr "Atualizar Pool de Sabor" msgid "Update Queue" msgstr "Atualizar fila" msgid "View Messages" msgstr "Visualizar mensagens" msgid "Weight" msgstr "Peso" msgid "Weight of the pool." msgstr "Peso do pool." #, python-format msgid "You are not allowed to delete pool flavors: %s" msgstr "Você não está autorizado a excluir o pool de sabores: %s" #, python-format msgid "You are not allowed to delete pools: %s" msgstr "Você não está permitido para excluir pools: %s" #, python-format msgid "You are not allowed to delete queues: %s" msgstr "Você não está autorizado a excluir filas: %s" msgid "" "You can submit up to 10 messages in a single request, but you must always\n" " encapsulate the messages in a collection container (an array in JSON, " "even\n" " for a single message - without the JSON array, you receive the " "\"Invalid\n" " request body\" message). The resulting value of the Location header or\n" " response body might be used to retrieve the created messages for " "further\n" " processing." msgstr "" "Você pode submeter até 10 mensagens em uma requisição única, mas você deve " "sempre encapsular as mensagens em uma coleção de container (um vetor em " "JSON, até para uma única mensagem - sem o vetor JSON, você recebe a " "mensagem \"Corpo da requisição inválida\"). O valor resultante do cabeçalho " "de localização ou o corpo de resposta deve ser usado para recuperar a " "mensagem criada para mais processamento." #, python-format msgid "You have selected \"%s\". Deleted Pool Flavor is not recoverable." msgid_plural "" "You have selected \"%s\". Deleted Pool Flavors are not recoverable." msgstr[0] "Você selecionou \"%s\". Pool de Sabor excluído não é recuperável." msgstr[1] "" "Você selecionou \"%s\". Pool de Sabores excluídos não são recuperáveis." #, python-format msgid "You have selected \"%s\". Deleted Pool is not recoverable." msgid_plural "You have selected \"%s\". Deleted Pools are not recoverable." msgstr[0] "Você selecionou \"%s\". Pool excluído não é recuperável." msgstr[1] "Você selecionou \"%s\". Pools excluídos não são recuperáveis." #, python-format msgid "You have selected \"%s\". Deleted queue is not recoverable." msgid_plural "You have selected \"%s\". Deleted queues are not recoverable." msgstr[0] "Você selecionou \"%s\". A fila excluída não é recuperável." msgstr[1] "Você selecionou \"%s\". As filas excluídas não são recuperáveis." msgid "" "You must specify one of the pool groups that is configured in storage pools." msgstr "" "Você deve especificar um dos grupos de pools que é configurado no " "armazenamento de pools." msgid "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgstr "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgid "e.g. mongodb://127.0.0.1:27017" msgstr "e.g. mongodb://127.0.0.1:27017" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5491455 zaqar_ui-18.0.0/zaqar_ui/locale/ru/0000775000175000017500000000000000000000000017136 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5731473 zaqar_ui-18.0.0/zaqar_ui/locale/ru/LC_MESSAGES/0000775000175000017500000000000000000000000020723 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/locale/ru/LC_MESSAGES/django.po0000664000175000017500000000203300000000000022523 0ustar00zuulzuul00000000000000# Artem , 2016. #zanata # Artem , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui 2.0.1.dev18\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2017-03-08 02:34+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-06 02:32+0000\n" "Last-Translator: Artem \n" "Language-Team: Russian\n" "Language: ru\n" "X-Generator: Zanata 3.9.6\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 "Messaging" msgstr "Обмен сообщениями" msgid "Pool Flavors" msgstr "Типы инстансов пула" msgid "Pools" msgstr "Пулы" msgid "Queues" msgstr "Очереди" #, python-format msgid "The specified input is not a valid YAML format: %s" msgstr "Введенная информация не соответствует формату YAML: %s" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/locale/ru/LC_MESSAGES/djangojs.po0000664000175000017500000002146100000000000023066 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata # Artem , 2016. #zanata # Valentin Chikunov , 2016. #zanata # Artem , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui 2.0.1.dev18\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2017-03-08 02:34+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-06 02:57+0000\n" "Last-Translator: Artem \n" "Language-Team: Russian\n" "Language: ru\n" "X-Generator: Zanata 3.9.6\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 "A queue name between 1-256 characters is required." msgstr "Имя очереди должно состоять из 1-256 символов." msgid "Actions" msgstr "Действия" msgid "Capabilities" msgstr "Возможности" msgid "Claimed Messages" msgstr "Помеченные сообщения" msgid "Confirm Delete Pool" msgid_plural "Confirm Delete Pools" msgstr[0] "Подтвердите удаление пула" msgstr[1] "Подтвердите удаление пулов" msgstr[2] "Подтвердите удаление пулов" msgid "Confirm Delete Queue" msgid_plural "Confirm Delete queues" msgstr[0] "Подтвердите удаление Очереди" msgstr[1] "Подтвердите удаление очередей" msgstr[2] "Подтвердите удаление очередей" msgid "Create" msgstr "Создать" msgid "Create Pool" msgstr "Создать пул" msgid "Create Queue" msgstr "Создать Очередь" msgid "Create Queues" msgstr "Создать Очереди" msgid "Create Subscription" msgstr "Создать Подписку" msgid "Delete" msgstr "Удалить" msgid "Delete Pool" msgid_plural "Delete Pools" msgstr[0] "Удалить пул" msgstr[1] "Удалить пулы" msgstr[2] "Удалить пулы" msgid "Delete Pools" msgstr "Удалить пулы" msgid "Delete Queue" msgid_plural "Delete Queues" msgstr[0] "Удалить Очередь" msgstr[1] "Удалить Очереди" msgstr[2] "Удалить Очереди" msgid "Delete Queues" msgstr "Удалить Очереди" #, python-format msgid "Deleted Pool: %s." msgid_plural "Deleted Pools: %s." msgstr[0] "Пул удален: %s." msgstr[1] "Пулы удалены: %s." msgstr[2] "Пулы удалены: %s." #, python-format msgid "Deleted Queue: %s." msgid_plural "Deleted Queues: %s." msgstr[0] "Удалена Очередь: %s." msgstr[1] "Удалены Очереди: %s." msgstr[2] "Удалены Очереди: %s." msgid "Enter a queue name" msgstr "Введите имя очереди" msgid "Enter a subscriber" msgstr "Введите подписчика" msgid "Free Messages" msgstr "Свободные сообщения" msgid "Group" msgstr "Группа" msgid "Group of the pool." msgstr "Группа пула." msgid "Name" msgstr "Имя" msgid "Name of the flavor." msgstr "Название типа инстансов:" msgid "Name of the pool." msgstr "Имя пула." msgid "" "Note that you can create a queue without defining metadata.\n" " The metadata step is optional but recommended." msgstr "" "Обратите внимание, что можно создать очередь не определяя метаданные..\n" " Этап метаданных не обязателен, но рекомендуется." msgid "Note that you can create a subscription without defining options." msgstr "Обратите внимание, что можно создать подписку не определяя параметры." msgid "Options" msgstr "Параметры" msgid "Pool" msgstr "Пул" #, python-format msgid "Pool %s was successfully created." msgstr "Пул %s успешно создан." #, python-format msgid "Pool %s was successfully updated." msgstr "Пул %s успешно обновлен." msgid "Pools" msgstr "Пулы" #, python-format msgid "Queue %s was successfully created." msgstr "Очередь %s создана успешно." #, python-format msgid "Queue %s was successfully updated." msgstr "Очередь %s успешно обновлена." msgid "Queue Details" msgstr "Информация об Очереди" msgid "Queue Metadata" msgstr "Метаданные Очереди" msgid "Queue Name" msgstr "Имя Очереди." msgid "Queues" msgstr "Очереди" #, python-format msgid "Removed %(subscriber)s subscriber from the %(queue)s queue." msgstr "Подписчик %(subscriber)s удален из очереди %(queue)s." msgid "Subscriber" msgstr "Подписчик" msgid "Subscribers must be in the form of mailto, HTTP, or HTTPS." msgstr "Подписчики должны быть формата mailto, HTTP или HTTPS." msgid "Subscription" msgstr "Подписка" #, python-format msgid "Subscription %s was successfully created." msgstr "Подписка %s создана успешно." msgid "The TTL for a subscription must be at least 60 seconds long." msgstr "TTL подписки должно быть по крайней мере 60 секунд." msgid "Time To Live" msgstr "Время жизни" msgid "Time to Live" msgstr "Время жизни" msgid "Total Messages" msgstr "Всего Сообщений" msgid "URI" msgstr "URI" msgid "Unable to add subscription." msgstr "Не удалось добавить подписку." msgid "Unable to create the flavor." msgstr "Не удалось создать тип инстанса." msgid "Unable to create the pool." msgstr "Не удалось создать пул." msgid "Unable to create the queue." msgstr "Не удалось создать очередь." #, python-format msgid "Unable to delete Pool: %s." msgid_plural "Unable to delete Pools: %s." msgstr[0] "Не удалось удалить пул: %s." msgstr[1] "Не удалось удалить пулы: %s." msgstr[2] "Не удалось удалить пулы: %s." #, python-format msgid "Unable to delete Queue: %s." msgid_plural "Unable to delete Queues: %s." msgstr[0] "Не удалось удалить Очередь: %s." msgstr[1] "Не удалось удалить Очереди: %s." msgstr[2] "Не удалось удалить Очереди: %s." msgid "Unable to delete subscription." msgstr "Не удалось удалить подписку." msgid "Unable to retrieve the Queues." msgstr "Не удалось получить очереди." msgid "Unable to retrieve the flavor." msgstr "Не удалось получить тип инстанса." msgid "Unable to retrieve the pool." msgstr "Не удалось получить пул." msgid "Unable to retrieve the pools." msgstr "Не удалось получить пулы." msgid "Unable to update the flavor." msgstr "Не удалось обновить тип инстанса." msgid "Unable to update the pool." msgstr "Не удалось обновить пул." msgid "Unable to update the queue." msgstr "Не удалось обновить очередь." msgid "Update" msgstr "Обновить" msgid "Update Pool" msgstr "Обновить пул" msgid "Update Queue" msgstr "Обновить Очередь" msgid "Weight" msgstr "Вес" msgid "Weight of the pool." msgstr "Вес пула." #, python-format msgid "You are not allowed to delete pools: %s" msgstr "Вам не разрешено удалять пулы: %s" #, python-format msgid "You are not allowed to delete queues: %s" msgstr "Вам не разрешено удалять образы: %s" #, python-format msgid "You have selected \"%s\". Deleted Pool is not recoverable." msgid_plural "You have selected \"%s\". Deleted Pools are not recoverable." msgstr[0] "Вы выбрали \"%s\". Восстановить удаленный пул невозможно." msgstr[1] "Вы выбрали \"%s\". Восстановить удаленные пулы невозможно." msgstr[2] "Вы выбрали \"%s\". Восстановить удаленные пулы невозможно." #, python-format msgid "You have selected \"%s\". Deleted queue is not recoverable." msgid_plural "You have selected \"%s\". Deleted queues are not recoverable." msgstr[0] "Вы выбрали \"%s\". Восстановить удаленную очередь невозможно." msgstr[1] "Вы выбрали \"%s\". Восстановить удаленные очереди невозможно." msgstr[2] "Вы выбрали \"%s\". Восстановить удаленные очереди невозможно." msgid "e.g. mongodb://127.0.0.1:27017" msgstr "т.е. mongodb://127.0.0.1:27017" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5491455 zaqar_ui-18.0.0/zaqar_ui/locale/tr_TR/0000775000175000017500000000000000000000000017542 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5731473 zaqar_ui-18.0.0/zaqar_ui/locale/tr_TR/LC_MESSAGES/0000775000175000017500000000000000000000000021327 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/locale/tr_TR/LC_MESSAGES/django.po0000664000175000017500000000161400000000000023133 0ustar00zuulzuul00000000000000# işbaran akçayır , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-02-19 00:40+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-25 11:52+0000\n" "Last-Translator: Copied by Zanata \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: 1495711591.000000\n" msgid "Messaging" msgstr "İletiler" msgid "Pool Flavors" msgstr "Havuz Nitelikleri" msgid "Pools" msgstr "Havuzlar" msgid "Queues" msgstr "Kuyruklar" #, python-format msgid "The specified input is not a valid YAML format: %s" msgstr "Belirtilen girdi geçerli YAML biçiminde değil: %s" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/locale/tr_TR/LC_MESSAGES/djangojs.po0000664000175000017500000003051500000000000023472 0ustar00zuulzuul00000000000000# Mücahit Büyükyılmaz , 2015. #zanata # OpenStack Infra , 2015. #zanata # Andreas Jaeger , 2016. #zanata # işbaran akçayır , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-02-19 00:40+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-24 12:54+0000\n" "Last-Translator: Copied by Zanata \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: 1495713078.000000\n" msgid "A queue name between 1-256 characters is required." msgstr "1-256 karakter uzunluğunda kuyruk ismi gerekiyor." msgid "Actions" msgstr "İşlemler" msgid "Age" msgstr "Yaş" msgid "" "An optional request component related to storage-specific options in YAML " "format." msgstr "" "İsteğe bağlı, depolamaya-özel seçeneklerle ilgili YAML biçiminde istek " "bileşeni." msgid "Body" msgstr "Gövde" msgid "Capabilities" msgstr "Yetenekler" msgid "Choose resource to purge" msgstr "Temizlenecek kaynağı seçin" msgid "Claimed Messages" msgstr "İstenen İletiler" msgid "Claims" msgstr "Alacaklılar" msgid "Confirm Delete Pool" msgid_plural "Confirm Delete Pools" msgstr[0] "Havuz Silmeyi Onayla" msgstr[1] "Havuzları Silmeyi Onayla" msgid "Confirm Delete Pool Flavor" msgid_plural "Confirm Delete Pool Flavors" msgstr[0] "Havuz Niteliği Silmeyi Onayla" msgstr[1] "Havuz Niteliklerini Silmeyi Onayla" msgid "Confirm Delete Queue" msgid_plural "Confirm Delete queues" msgstr[0] "Kuyruk Silmeyi Onayla" msgstr[1] "Kuyrukları Silmeyi Onayla" msgid "Confirmed" msgstr "Onaylandı" msgid "Create" msgstr "Oluştur" msgid "Create Pool" msgstr "Havuz Oluştur" msgid "Create Pool Flavor" msgstr "Havuz Niteliği Oluştur" msgid "Create Queue" msgstr "Kuyruk Oluştur" msgid "Create Queues" msgstr "Kuyruklar Oluştur" msgid "Create Subscription" msgstr "Abonelik Oluştur" msgid "Creating Signed URL" msgstr "İmzalı URL Oluşturma" msgid "DELETE" msgstr "DELETE" msgid "Delete" msgstr "Sil" msgid "Delete Pool" msgid_plural "Delete Pools" msgstr[0] "Havuzu Sil" msgstr[1] "Havuzları Sil" msgid "Delete Pool Flavor" msgid_plural "Delete Pool Flavors" msgstr[0] "Havuz Niteliğini Sil" msgstr[1] "Havuz Niteliklerini Sil" msgid "Delete Pool Flavors" msgstr "Havuz Niteliklerini Sil" msgid "Delete Pools" msgstr "Havuzları Sil" msgid "Delete Queue" msgid_plural "Delete Queues" msgstr[0] "Kuyruğu Sil" msgstr[1] "Kuyrukları Sil" msgid "Delete Queues" msgstr "Kuyrukları Sil" #, python-format msgid "Deleted Pool Flavor: %s." msgid_plural "Deleted Pool Flavors: %s." msgstr[0] "Havuz Niteliği Silindi: %s." msgstr[1] "Havuz Nitelikleri Silindi: %s." #, python-format msgid "Deleted Pool: %s." msgid_plural "Deleted Pools: %s." msgstr[0] "Havuz Silindi: %s." msgstr[1] "Havuzlar Silindi: %s." #, python-format msgid "Deleted Queue: %s." msgid_plural "Deleted Queues: %s." msgstr[0] "Kuyruk Silindi: %s." msgstr[1] "Kuyruklar Silindi: %s." msgid "Describes flavor-specific capabilities in YAML format." msgstr "Niteliğe-özel yetenekleri YAML biçiminde tanımlar." msgid "Enter a queue name" msgstr "Bir kuyruk ismi girin" msgid "Enter a subscriber" msgstr "Bir abone girin" msgid "Free Messages" msgstr "Bağımsız İletiler" msgid "GET" msgstr "GET" msgid "Group" msgstr "Grup" msgid "Group of the pool." msgstr "Havuzun grubu." msgid "HEAD" msgstr "HEAD" msgid "ID" msgstr "Kimlik" msgid "List Messages" msgstr "İletileri Listele" msgid "Messages" msgstr "İletiler" #, python-format msgid "Messages has been posted to queue %s successfully." msgstr "İleti %s kuyruğuna başarıyla gönderildi." msgid "Methods" msgstr "Yöntemler" msgid "Name" msgstr "İsim" msgid "Name of the flavor." msgstr "Nitelik adı." msgid "Name of the pool." msgstr "Havuz ismi." msgid "" "Note that you can create a queue without defining metadata.\n" " The metadata step is optional but recommended." msgstr "" "Metaveri tanımlamadan kuyruk oluşturabileceğinizi unutmayın.\n" "Metaveri adımı tavsiye edilir ama isteğe bağlıdır." msgid "Note that you can create a subscription without defining options." msgstr "Seçenekleri belirtmeden abonelik oluşturabileceğinizi unutmayın." msgid "OPTIONS" msgstr "OPTIONS" msgid "Options" msgstr "Seçenekler" msgid "POST" msgstr "POST" msgid "PUT" msgstr "PUT" msgid "Paths" msgstr "Yollar" msgid "Pool" msgstr "Havuz" #, python-format msgid "Pool %s was successfully created." msgstr "Havuz %s başarıyla oluşturuldu." #, python-format msgid "Pool %s was successfully updated." msgstr "Havuz %s başarıyla güncellendi." msgid "Pool Flavor" msgstr "Havuz Niteliği" msgid "Pool Flavors" msgstr "Havuz Nitelikleri" msgid "Pool Group" msgstr "Havuz Grubu" #, python-format msgid "Pool flavor %s was successfully created." msgstr "Havuz niteliği %s başarıyla oluşturuldu." #, python-format msgid "Pool flavor %s was successfully updated." msgstr "Havuz niteliği %s başarıyla güncellendi." msgid "Pool group for flavor." msgstr "Nitelik için havuz grubu." msgid "Pools" msgstr "Havuzlar" msgid "Post" msgstr "Gönderi" msgid "Post Messages" msgstr "İletileri Gönder" msgid "Purge" msgstr "Temizle" msgid "Purge Queue" msgstr "Kuyruğu Temizle" #, python-format msgid "Queue %s has been purged successfully." msgstr "Kuyruk %s başarıyla temizlendi." #, python-format msgid "Queue %s was successfully created." msgstr "Kuyruk %s başarıyla oluşturuldu." #, python-format msgid "Queue %s was successfully updated." msgstr "Kuyruk %s başarıyla güncellendi." msgid "Queue Details" msgstr "Kuyruk Ayrıntıları" msgid "Queue Metadata" msgstr "Kuyruk Metaverisi" msgid "Queue Name" msgstr "Kuyruk İsmi" msgid "Queues" msgstr "Kuyruklar" #, python-format msgid "Removed %(subscriber)s subscriber from the %(queue)s queue." msgstr "%(subscriber)s abonesi %(queue)s kuyruğundan çıkarıldı." msgid "See a sample as below:" msgstr "Aşağıdaki gibi bir örneğe göz atın:" msgid "Signed URL" msgstr "İmzalı URL" #, python-format msgid "Signed URL for %s" msgstr "%s için imzalı URL" #, python-format msgid "" "Signed URL was successfully created for the queue %s with expires %s and " "signature %s." msgstr "" "İmzalı URL %s kuyruğu için %s zaman aşımı ve %s imzasıyla başarıyla " "oluşturuldu." msgid "Subscriber" msgstr "Abone" msgid "Subscribers must be in the form of mailto, HTTP, or HTTPS." msgstr "Aboneler mailto, HTTP, veya HTTPS biçiminde olmalı." msgid "Subscription" msgstr "Abonelik" #, python-format msgid "Subscription %s was successfully created." msgstr "%s aboneliği başarıyla oluşturuldu." msgid "Subscriptions" msgstr "Abonelikler" msgid "TTL Seconds" msgstr "TTL Saniye" msgid "The TTL for a subscription must be at least 60 seconds long." msgstr "Bir abonelik için TTL en az 60 sn uzunluğunda olmalı." msgid "" "The client specifies only the body and TTL for the message. The server\n" " inserts metadata, such as ID and age." msgstr "" "İstemci yalnızca ileti gövdesini ve TTL değerini belirtiyor. Sunucu\n" " kimlik ve yaş gibi metaveri ekler." msgid "Time To Live" msgstr "Yaşam Süresi" msgid "Time to Live" msgstr "Yaşama Süresi" msgid "Total Messages" msgstr "Toplam İleti" msgid "URI" msgstr "URI" msgid "URI for storage engine of this pool." msgstr "Bu havuzun depolama motoru için URI." msgid "Unable to add subscription." msgstr "Abonelik eklenemedi." msgid "Unable to create signed URL." msgstr "İmzalı URL oluşturulamıyor." msgid "Unable to create the flavor." msgstr "Nitelik oluşturulamadı." msgid "Unable to create the pool." msgstr "Havuz oluşturulamadı." msgid "Unable to create the queue." msgstr "Kuyruk oluşturulamadı." #, python-format msgid "Unable to delete Pool Flavor: %s." msgid_plural "Unable to delete Pool Flavors: %s." msgstr[0] "Havuz Niteliği silinemiyor: %s." msgstr[1] "Havuz Nitelikleri silinemiyor: %s." #, python-format msgid "Unable to delete Pool: %s." msgid_plural "Unable to delete Pools: %s." msgstr[0] "Havuz silinemedi: %s." msgstr[1] "Havuzlar silinemedi: %s." #, python-format msgid "Unable to delete Queue: %s." msgid_plural "Unable to delete Queues: %s." msgstr[0] "Kuyruk silinemiyor: %s." msgstr[1] "Kuyruklar silinemiyor: %s." msgid "Unable to delete subscription." msgstr "Abonelik silinemedi." msgid "Unable to get messages." msgstr "İletiler alınamadı." msgid "Unable to post messages." msgstr "İletiler gönderilemedi." msgid "Unable to purge the queue." msgstr "Kuyruk temizlenemedi." msgid "Unable to retrieve the Queue." msgstr "Kuyruk alınamadı." msgid "Unable to retrieve the Queues." msgstr "Kuyruklar alınamadı." msgid "Unable to retrieve the flavor." msgstr "Nitelik alınamadı." msgid "Unable to retrieve the flavors." msgstr "Nitelikler alınamadı." msgid "Unable to retrieve the pool." msgstr "Havuz alınamadı." msgid "Unable to retrieve the pools." msgstr "Havuzlar alınamadı." msgid "Unable to update the flavor." msgstr "Nitelik güncellenemedi." msgid "Unable to update the pool." msgstr "Havuz güncellenemedi." msgid "Unable to update the queue." msgstr "Kuyruk güncellenemedi." msgid "Update" msgstr "Güncelle" msgid "Update Pool" msgstr "Havuzu Güncelle" msgid "Update Pool Flavor" msgstr "Havuz Niteliğini Güncelle" msgid "Update Queue" msgstr "Kuyruğu Güncelle" msgid "View Messages" msgstr "İletileri Görüntüle" msgid "Weight" msgstr "Ağırlık" msgid "Weight of the pool." msgstr "Havuz ağırlığı." #, python-format msgid "You are not allowed to delete pool flavors: %s" msgstr "Havuz niteliklerini silme yetkiniz yok: %s" #, python-format msgid "You are not allowed to delete pools: %s" msgstr "Havuzları silme yetkiniz yok: %s" #, python-format msgid "You are not allowed to delete queues: %s" msgstr "Kuyruk silme yetkiniz yok: %s" msgid "" "You can submit up to 10 messages in a single request, but you must always\n" " encapsulate the messages in a collection container (an array in JSON, " "even\n" " for a single message - without the JSON array, you receive the " "\"Invalid\n" " request body\" message). The resulting value of the Location header or\n" " response body might be used to retrieve the created messages for " "further\n" " processing." msgstr "" "Tek bir istekte 10 iletiye kadar gönderi yapabilirsiniz, ama her zaman " "iletileri\n" " bir toplama kapsayıcısına (JSON dizisi, tek bir ileti için bile - JSON " "dizisi olmadan\n" " \"Geçersiz istek gövdesi\" iletisi alırsınız) sarmalamalısınız. İleri " "işleme için Konum\n" " başlığının sonuç değeri veya yanıt gövdesi kullanılarak oluşturulan " "iletiler\n" " alınabilir." #, python-format msgid "You have selected \"%s\". Deleted Pool Flavor is not recoverable." msgid_plural "" "You have selected \"%s\". Deleted Pool Flavors are not recoverable." msgstr[0] "\"%s\" seçtiniz. Silinen Havuz Niteliği geri getirilemez." msgstr[1] "\"%s\" seçtiniz. Silinen Havuz Nitelikleri geri getirilemez." #, python-format msgid "You have selected \"%s\". Deleted Pool is not recoverable." msgid_plural "You have selected \"%s\". Deleted Pools are not recoverable." msgstr[0] "\"%s\" seçtiniz. Silinen Havuz geri alınamaz." msgstr[1] "\"%s\" seçtiniz. Silinen Havuzlar geri alınamaz." #, python-format msgid "You have selected \"%s\". Deleted queue is not recoverable." msgid_plural "You have selected \"%s\". Deleted queues are not recoverable." msgstr[0] "\"%s\" seçtiniz. Silinen kuyruk geri getirilemez." msgstr[1] "\"%s\" seçtiniz. Silinen kuyruklar geri getirilemez." msgid "" "You must specify one of the pool groups that is configured in storage pools." msgstr "" "Depolama havuzlarında yapılandırılmış havuz gruplarından birini " "belirtmelisiniz." msgid "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgstr "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgid "e.g. mongodb://127.0.0.1:27017" msgstr "örn. mongodb://127.0.0.1:27017" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5491455 zaqar_ui-18.0.0/zaqar_ui/locale/zh_Hans/0000775000175000017500000000000000000000000020102 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5771475 zaqar_ui-18.0.0/zaqar_ui/locale/zh_Hans/LC_MESSAGES/0000775000175000017500000000000000000000000021667 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/locale/zh_Hans/LC_MESSAGES/django.po0000664000175000017500000000146400000000000023476 0ustar00zuulzuul00000000000000# liujunpeng , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2021-02-16 08:30+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-10 03:39+0000\n" "Last-Translator: liujunpeng \n" "Language-Team: Chinese (China)\n" "Language: zh_CN\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "Messaging" msgstr "消息" msgid "Pool Flavors" msgstr "池类型" msgid "Pools" msgstr "池" msgid "Queues" msgstr "队列" #, python-format msgid "The specified input is not a valid YAML format: %s" msgstr "给的的输入不是有效的YAML格式:%s" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/locale/zh_Hans/LC_MESSAGES/djangojs.po0000664000175000017500000002600600000000000024032 0ustar00zuulzuul00000000000000# Linda , 2016. #zanata # hanchao , 2016. #zanata # zenglulu , 2016. #zanata # Bin , 2017. #zanata # liujunpeng , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: zaqar-ui VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2021-02-16 08:30+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-07-30 02:07+0000\n" "Last-Translator: Bin \n" "Language-Team: Chinese (China)\n" "Language: zh_CN\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "A queue name between 1-256 characters is required." msgstr "队列名称必须为1~256字符之间。 " msgid "Actions" msgstr "行为。" msgid "Age" msgstr "实效" msgid "" "An optional request component related to storage-specific options in YAML " "format." msgstr "在YAML格式中,一个可选请求组件与指定存储选项有关。" msgid "Body" msgstr "正文" msgid "Capabilities" msgstr "容量" msgid "Choose resource to purge" msgstr "选择清理资源" msgid "Claimed Messages" msgstr "声明消息" msgid "Claims" msgstr "声明" msgid "Confirm Delete Pool" msgid_plural "Confirm Delete Pools" msgstr[0] "确认删除池" msgid "Confirm Delete Pool Flavor" msgid_plural "Confirm Delete Pool Flavors" msgstr[0] "确认删除类型" msgid "Confirm Delete Queue" msgid_plural "Confirm Delete queues" msgstr[0] "确认删除队列。" msgid "Confirmed" msgstr "已确认" msgid "Create" msgstr "已创建" msgid "Create Pool" msgstr "创建池" msgid "Create Pool Flavor" msgstr "创建类型池" msgid "Create Queue" msgstr "创建队列。" msgid "Create Queues" msgstr "创建队列。" msgid "Create Subscription" msgstr "新建订阅" msgid "Creating Signed URL" msgstr "创建签名URL" msgid "DELETE" msgstr "DELETE" msgid "Delete" msgstr "删除" msgid "Delete Pool" msgid_plural "Delete Pools" msgstr[0] "删除池" msgid "Delete Pool Flavor" msgid_plural "Delete Pool Flavors" msgstr[0] "类型池" msgid "Delete Pool Flavors" msgstr "删除类型池" msgid "Delete Pools" msgstr "删除池" msgid "Delete Queue" msgid_plural "Delete Queues" msgstr[0] "删除队列。" msgid "Delete Queues" msgstr "删除队列。" #, python-format msgid "Deleted Pool Flavor: %s." msgid_plural "Deleted Pool Flavors: %s." msgstr[0] "删除类型: %s." #, python-format msgid "Deleted Pool: %s." msgid_plural "Deleted Pools: %s." msgstr[0] "删除池:%s。" #, python-format msgid "Deleted Queue: %s." msgid_plural "Deleted Queues: %s." msgstr[0] "删除队列: %s。" msgid "Describes flavor-specific capabilities in YAML format." msgstr "以YAML格式描述指定类型的容量。" msgid "Enter a queue name" msgstr "输入队列名称。" msgid "Enter a subscriber" msgstr "输入一个订阅者" msgid "Free Messages" msgstr "免费消息" msgid "GET" msgstr "GET" msgid "Group" msgstr "组" msgid "Group of the pool." msgstr "池组。" msgid "HEAD" msgstr "HEAD" msgid "ID" msgstr "ID" msgid "List Messages" msgstr "消息列表" msgid "Messages" msgstr "消息" #, python-format msgid "Messages has been posted to queue %s successfully." msgstr "消息已经成功发布到队列%s。" msgid "Methods" msgstr "方法" msgid "Name" msgstr "名字" msgid "Name of the flavor." msgstr "类型名" msgid "Name of the pool." msgstr "池的名称。" msgid "" "Note that you can create a queue without defining metadata.\n" " The metadata step is optional but recommended." msgstr "" "请注意您已完成创建队列操作,该队列未定义元数据。\n" " 定义元数据为可选操作,但推荐为您创建的队列应以元数据。" msgid "Note that you can create a subscription without defining options." msgstr "请注意,您可以创建一个不带任何选项的订阅。" msgid "OPTIONS" msgstr "选项" msgid "Options" msgstr "选项" msgid "POST" msgstr "POST" msgid "PUT" msgstr "PUT" msgid "Paths" msgstr "路径" msgid "Pool" msgstr "池" #, python-format msgid "Pool %s was successfully created." msgstr "更新池%s 成功。" #, python-format msgid "Pool %s was successfully updated." msgstr "已成功更新池 %s。" msgid "Pool Flavor" msgstr "类型池" msgid "Pool Flavors" msgstr "类型池" msgid "Pool Group" msgstr "池组" #, python-format msgid "Pool flavor %s was successfully created." msgstr "创建类型池 %s 成功。" #, python-format msgid "Pool flavor %s was successfully updated." msgstr "类型%s 更新成功。" msgid "Pool group for flavor." msgstr "型的池组。" msgid "Pools" msgstr "池" msgid "Post" msgstr "发布" msgid "Post Messages" msgstr "发布消息" msgid "Purge" msgstr "清理" msgid "Purge Queue" msgstr "清理队列" #, python-format msgid "Queue %s has been purged successfully." msgstr "队列%s已经被清理成功。" #, python-format msgid "Queue %s was successfully created." msgstr "创建队列 %s成功。" #, python-format msgid "Queue %s was successfully updated." msgstr "修改队列%s成功。" msgid "Queue Details" msgstr "队列详情。" msgid "Queue Metadata" msgstr "队列元数据。" msgid "Queue Name" msgstr "队列名称。" msgid "Queues" msgstr "队列" #, python-format msgid "Removed %(subscriber)s subscriber from the %(queue)s queue." msgstr "将订阅者 %(subscriber)s从队列 %(queue)s中移除。 " msgid "See a sample as below:" msgstr "查看下面的例子:" msgid "Signed URL" msgstr "签名URL" #, python-format msgid "Signed URL for %s" msgstr "%s的签名URL" #, python-format msgid "" "Signed URL was successfully created for the queue %s with expires %s and " "signature %s." msgstr "带过期%s和签名%s队列%s的签名URL已经成功创建。" msgid "Subscriber" msgstr "订阅者" msgid "Subscribers must be in the form of mailto, HTTP, or HTTPS." msgstr "订阅者必须为mailto、HTTP或HTTPS的格式。" msgid "Subscription" msgstr "订阅" #, python-format msgid "Subscription %s was successfully created." msgstr "新建订阅%s 成功。" msgid "Subscriptions" msgstr "订阅" msgid "TTL Seconds" msgstr "TTL秒数" msgid "The TTL for a subscription must be at least 60 seconds long." msgstr "一次订阅的生存时间必须至少为60s时长。" msgid "" "The client specifies only the body and TTL for the message. The server\n" " inserts metadata, such as ID and age." msgstr "客户端仅仅指明消息的正文和TTL。服务端插入元数据,例如ID和年龄。" msgid "Time To Live" msgstr "生存时间" msgid "Time to Live" msgstr "生存时间" msgid "Total Messages" msgstr "消息总计。" msgid "URI" msgstr "URI" msgid "URI for storage engine of this pool." msgstr "池存储引擎的URI" msgid "Unable to add subscription." msgstr "无法添加订阅。" msgid "Unable to create signed URL." msgstr "无法创建已签名URL。" msgid "Unable to create the flavor." msgstr "无法创建类型。" msgid "Unable to create the pool." msgstr "无法创建池。" msgid "Unable to create the queue." msgstr "无法创建队列。" #, python-format msgid "Unable to delete Pool Flavor: %s." msgid_plural "Unable to delete Pool Flavors: %s." msgstr[0] "不能删除类型:%s。" #, python-format msgid "Unable to delete Pool: %s." msgid_plural "Unable to delete Pools: %s." msgstr[0] "不能删除池:%s。" #, python-format msgid "Unable to delete Queue: %s." msgid_plural "Unable to delete Queues: %s." msgstr[0] "无法删除队列: %s。" msgid "Unable to delete subscription." msgstr "无法删除订阅。" msgid "Unable to get messages." msgstr "无法获取信息。" msgid "Unable to post messages." msgstr "无法发送消息。" msgid "Unable to purge the queue." msgstr "无法清理队列。" msgid "Unable to retrieve the Queue." msgstr "无法获取队列。" msgid "Unable to retrieve the Queues." msgstr "无法检索队列。" msgid "Unable to retrieve the flavor." msgstr "无法获取类型。" msgid "Unable to retrieve the flavors." msgstr "无法获取类型。" msgid "Unable to retrieve the pool." msgstr "无法获取池。" msgid "Unable to retrieve the pools." msgstr "无法获取池。" msgid "Unable to update the flavor." msgstr "无法更新类型。" msgid "Unable to update the pool." msgstr "无法更新池。" msgid "Unable to update the queue." msgstr "无法更新此队列。" msgid "Update" msgstr "更新" msgid "Update Pool" msgstr "更新池" msgid "Update Pool Flavor" msgstr "更新类型池" msgid "Update Queue" msgstr "修改队列。" msgid "View Messages" msgstr "查看消息" msgid "Weight" msgstr "权重" msgid "Weight of the pool." msgstr "池的权重。" #, python-format msgid "You are not allowed to delete pool flavors: %s" msgstr "你不被允许删除类型池:%s" #, python-format msgid "You are not allowed to delete pools: %s" msgstr "您不被允许删除池:%s" #, python-format msgid "You are not allowed to delete queues: %s" msgstr "您不被允许删除这些队列:%s" msgid "" "You can submit up to 10 messages in a single request, but you must always\n" " encapsulate the messages in a collection container (an array in JSON, " "even\n" " for a single message - without the JSON array, you receive the " "\"Invalid\n" " request body\" message). The resulting value of the Location header or\n" " response body might be used to retrieve the created messages for " "further\n" " processing." msgstr "" "您可以在一个请求中提交最多10条消息,但必须总是将消息封装在一个集合容器中(以" "JSON形式的数组,甚至数单个消息——没有JSON数组,你会收到“无效请求体”的消息)。" "定位头或响应体的最终值可能被用来寻回进一步处理刚创建的消息。" #, python-format msgid "You have selected \"%s\". Deleted Pool Flavor is not recoverable." msgid_plural "" "You have selected \"%s\". Deleted Pool Flavors are not recoverable." msgstr[0] "已选择 \"%s\"。删除类型不可恢复。" #, python-format msgid "You have selected \"%s\". Deleted Pool is not recoverable." msgid_plural "You have selected \"%s\". Deleted Pools are not recoverable." msgstr[0] "已选择 \"%s\"。删除池操作将不可恢复。" #, python-format msgid "You have selected \"%s\". Deleted queue is not recoverable." msgid_plural "You have selected \"%s\". Deleted queues are not recoverable." msgstr[0] "已选择 \"%s\"。删除队列操作将不可恢复。" msgid "" "You must specify one of the pool groups that is configured in storage pools." msgstr "你必须指定一个在存储池中配置的池组。" msgid "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgstr "" "[\n" " {\n" " \"body\": {\n" " \"event\": \"BackupProgress\",\n" " \"current_bytes\": \"2341134\",\n" " \"total_bytes\": \"99614720\"\n" " }\n" " }\n" "]" msgid "e.g. mongodb://127.0.0.1:27017" msgstr "比如 mongodb://127.0.0.1:27017" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5531456 zaqar_ui-18.0.0/zaqar_ui/static/0000775000175000017500000000000000000000000016540 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5491455 zaqar_ui-18.0.0/zaqar_ui/static/app/0000775000175000017500000000000000000000000017320 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5491455 zaqar_ui-18.0.0/zaqar_ui/static/app/core/0000775000175000017500000000000000000000000020250 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5771475 zaqar_ui-18.0.0/zaqar_ui/static/app/core/openstack-service-api/0000775000175000017500000000000000000000000024444 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/app/core/openstack-service-api/zaqar.service.js0000664000175000017500000001353200000000000027563 0ustar00zuulzuul00000000000000/** * Copyright 2015 Catalyst IT Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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.app.core.openstack-service-api') .factory('horizon.app.core.openstack-service-api.zaqar', ZaqarAPI); ZaqarAPI.$inject = [ 'horizon.framework.util.http.service', 'horizon.framework.widgets.toast.service' ]; function ZaqarAPI(apiService, toast) { var queuePath = '/api/zaqar/queues/'; var msgPath = '/api/zaqar/queues/%s/messages/'; var subPath = '/api/zaqar/queues/%s/subscriptions/'; var poolPath = '/api/zaqar/pools/'; var flavorPath = '/api/zaqar/flavors/'; var service = { getQueues: getQueues, getQueue: getQueue, createQueue: createQueue, deleteQueue: deleteQueue, updateQueue: updateQueue, purgeQueue: purgeQueue, postMessages: postMessages, getMessages: getMessages, signedUrl: signedUrl, getSubscriptions: getSubscriptions, addSubscription: addSubscription, deleteSubscription: deleteSubscription, getPools: getPools, getPool: getPool, createPool: createPool, deletePool: deletePool, updatePool: updatePool, getFlavors: getFlavors, getFlavor: getFlavor, createFlavor: createFlavor, deleteFlavor: deleteFlavor, updateFlavor: updateFlavor }; return service; ////////// function getQueues() { var msg = gettext('Unable to retrieve the Queues.'); return apiService.get(queuePath).error(error(msg)); } function getQueue(queueName) { var msg = gettext('Unable to retrieve the Queue.'); return apiService.get(queuePath + queueName).error(error(msg)); } function createQueue(newQueue) { var msg = gettext('Unable to create the queue.'); return apiService.put(queuePath, newQueue).error(error(msg)); } function deleteQueue(queueName) { return apiService.delete(queuePath, [queueName]); } function updateQueue(queue) { var msg = gettext('Unable to update the queue.'); var url = queuePath + queue.queue_name; var form = { metadata: queue.metadata }; return apiService.post(url, form).error(error(msg)); } function purgeQueue(queueName, resourceTypes) { var msg = gettext('Unable to purge the queue.'); var url = queuePath + queueName + '/purge'; var form = resourceTypes; return apiService.post(url, form).error(error(msg)); } function getMessages(queueName) { var msg = gettext('Unable to get messages.'); var url = interpolate(msgPath, [queueName]); return apiService.get(url).error(error(msg)); } function postMessages(queueName, msgs) { var msg = gettext('Unable to post messages.'); var url = interpolate(msgPath, [queueName]); return apiService.post(url, msgs).error(error(msg)); } function signedUrl(queueName, form) { var msg = gettext('Unable to create signed URL.'); var url = queuePath + queueName + '/share'; return apiService.post(url, form).error(error(msg)); } function getSubscriptions(queue) { var url = interpolate(subPath, [queue.name]); return apiService.get(url); } function addSubscription(sub) { var msg = gettext('Unable to add subscription.'); var url = interpolate(subPath, [sub.queueName]); return apiService.put(url, sub).error(error(msg)); } function deleteSubscription(queueName, subscription) { var msg = gettext('Unable to delete subscription.'); var url = interpolate(subPath, [queueName]); return apiService.delete(url, subscription).error(error(msg)); } function getPools() { var msg = gettext('Unable to retrieve the pools.'); return apiService.get(poolPath).error(error(msg)); } function getPool(poolName) { var msg = gettext('Unable to retrieve the pool.'); var url = poolPath + poolName; return apiService.get(url).error(error(msg)); } function createPool(newPool) { var msg = gettext('Unable to create the pool.'); return apiService.put(poolPath, newPool).error(error(msg)); } function deletePool(poolName) { return apiService.delete(poolPath, [poolName]); } function updatePool(pool) { var msg = gettext('Unable to update the pool.'); var url = poolPath + pool.name; return apiService.post(url, pool).error(error(msg)); } function getFlavors() { var msg = gettext('Unable to retrieve the flavors.'); return apiService.get(flavorPath).error(error(msg)); } function getFlavor(flavorName) { var msg = gettext('Unable to retrieve the flavor.'); var url = flavorPath + flavorName; return apiService.get(url).error(error(msg)); } function createFlavor(newFlavor) { var msg = gettext('Unable to create the flavor.'); return apiService.put(flavorPath, newFlavor).error(error(msg)); } function deleteFlavor(flavorName) { return apiService.delete(flavorPath, [flavorName]); } function updateFlavor(flavor) { var msg = gettext('Unable to update the flavor.'); var url = flavorPath + flavor.name; return apiService.post(url, flavor).error(error(msg)); } function error(message) { return function() { toast.add('error', message); }; } } }()); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5531456 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/0000775000175000017500000000000000000000000020467 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5531456 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/0000775000175000017500000000000000000000000021557 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5771475 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pool-flavors/0000775000175000017500000000000000000000000024202 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5771475 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pool-flavors/actions/0000775000175000017500000000000000000000000025642 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pool-flavors/actions/actions.module.js0000664000175000017500000000467000000000000031133 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.admin.pool-flavors.actions * * @description * Provides all of the actions for pool flavors. */ angular.module('horizon.dashboard.admin.pool-flavors.actions', [ 'horizon.framework.conf', 'horizon.dashboard.admin.pool-flavors' ]) .run(registerPoolFlavorActions); registerPoolFlavorActions.$inject = [ 'horizon.framework.conf.resource-type-registry.service', 'horizon.dashboard.admin.pool-flavors.actions.create.service', 'horizon.dashboard.admin.pool-flavors.actions.delete.service', 'horizon.dashboard.admin.pool-flavors.actions.update.service', 'horizon.dashboard.admin.pool-flavors.resourceType' ]; function registerPoolFlavorActions( registry, createPoolFlavorService, deletePoolFlavorService, updatePoolFlavorService, flavorResourceType ) { var resourceType = registry.getResourceType(flavorResourceType); resourceType.globalActions .append({ id: 'createPoolFlavorAction', service: createPoolFlavorService, template: { text: gettext('Create Pool Flavor'), type: 'create' } }); resourceType.batchActions .append({ id: 'batchDeletePoolFlavorAction', service: deletePoolFlavorService, template: { type: 'delete-selected', text: gettext('Delete Pool Flavors') } }); resourceType.itemActions .append({ id: 'updatePoolFlavorAction', service: updatePoolFlavorService, template: { text: gettext('Update Pool Flavor'), type: 'row' } }) .append({ id: 'deletePoolFlavorAction', service: deletePoolFlavorService, template: { text: gettext('Delete Pool Flavor'), type: 'delete' } }); } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pool-flavors/actions/create.service.js0000664000175000017500000000477200000000000031114 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 factory * @name horizon.dashboard.admin.pool-flavors.actions.create.service * @description * Service for the pool flavor create modal */ angular .module('horizon.dashboard.admin.pool-flavors.actions') .factory('horizon.dashboard.admin.pool-flavors.actions.create.service', createService); createService.$inject = [ 'horizon.app.core.openstack-service-api.policy', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.dashboard.admin.pool-flavors.actions.workflow', 'horizon.dashboard.admin.pool-flavors.resourceType', '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' ]; function createService( policy, zaqar, workflow, resourceType, actionResult, gettext, $qExtensions, modal, toast ) { var message = { success: gettext('Pool flavor %s was successfully created.') }; var service = { initAction: initAction, perform: perform, allowed: allowed }; return service; ////////////// function initAction() { } function perform() { var title, submitText; title = gettext('Create Pool Flavor'); submitText = gettext('Create'); var config = workflow.init('create', title, submitText); return modal.open(config).then(submit); } function allowed() { return policy.ifAllowed({ rules: [['pool_flavor', 'add_flavor']] }); } function submit(context) { return zaqar.createFlavor(context.model, true).then(success, true); } function success(response) { toast.add('success', interpolate(message.success, [response.data.id])); var result = actionResult.getActionResult().created(resourceType, response.data.name); return result.result; } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pool-flavors/actions/delete.service.js0000664000175000017500000001043100000000000031100 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'; /** * @ngdoc factory * @name horizon.dashboard.admin.pool-flavors.actions.delete.service * @Description * Brings up the delete pool flavors confirmation modal dialog. * On submit, delete given pool flavors. * On cancel, do nothing. */ angular .module('horizon.dashboard.admin.pool-flavors.actions') .factory('horizon.dashboard.admin.pool-flavors.actions.delete.service', deleteService); deleteService.$inject = [ '$q', 'horizon.app.core.openstack-service-api.policy', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.dashboard.admin.pool-flavors.resourceType', '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.toast.service' ]; function deleteService( $q, policy, zaqar, resourceType, actionResult, gettext, $qExtensions, deleteModal, toast ) { var scope, context; var notAllowedMessage = gettext("You are not allowed to delete pool flavors: %s"); var service = { initAction: initAction, allowed: allowed, perform: perform }; return service; ////////////// function initAction() { context = { }; } function perform(items, newScope) { scope = newScope; var flavors = angular.isArray(items) ? items : [items]; context.labels = labelize(flavors.length); context.deleteEntity = deleteFlavor; return $qExtensions.allSettled(flavors.map(checkPermission)).then(afterCheck); } function allowed() { return policy.ifAllowed({ rules: [['pool_flavor', 'delete_flavor']] }); } function checkPermission(flavor) { return {promise: allowed(), context: flavor}; } 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) { var result = actionResult.getActionResult(); deleteModalResult.pass.forEach(function markDeleted(item) { result.deleted(resourceType, getEntity(item).name); }); deleteModalResult.fail.forEach(function markFailed(item) { result.failed(resourceType, getEntity(item).name); }); return result.result; } function labelize(count) { return { title: ngettext( 'Confirm Delete Pool Flavor', 'Confirm Delete Pool Flavors', count), message: ngettext( 'You have selected "%s". Deleted Pool Flavor is not recoverable.', 'You have selected "%s". Deleted Pool Flavors are not recoverable.', count), submit: ngettext( 'Delete Pool Flavor', 'Delete Pool Flavors', count), success: ngettext( 'Deleted Pool Flavor: %s.', 'Deleted Pool Flavors: %s.', count), error: ngettext( 'Unable to delete Pool Flavor: %s.', 'Unable to delete Pool Flavors: %s.', count) }; } function deleteFlavor(flavor) { return zaqar.deleteFlavor(flavor, true); } function getMessage(message, entities) { return interpolate(message, [entities.map(getName).join(", ")]); } function getName(result) { return getEntity(result).name; } function getEntity(result) { return result.context; } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pool-flavors/actions/update.service.js0000664000175000017500000000545500000000000031132 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 factory * @name horizon.dashboard.admin.pool-flavors.actions.update.service * @description * Service for the pool flavor update modal */ angular .module('horizon.dashboard.admin.pool-flavors.actions') .factory('horizon.dashboard.admin.pool-flavors.actions.update.service', updateService); updateService.$inject = [ 'horizon.app.core.openstack-service-api.policy', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.dashboard.admin.pool-flavors.actions.workflow', 'horizon.dashboard.admin.pool-flavors.resourceType', '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' ]; function updateService( policy, zaqar, workflow, resourceType, actionResult, gettext, $qExtensions, modal, toast ) { var message = { success: gettext('Pool flavor %s was successfully updated.') }; var service = { initAction: initAction, perform: perform, allowed: allowed }; return service; ////////////// function initAction() { } function perform(selected) { var title, submitText; title = gettext('Update Pool Flavor'); submitText = gettext('Update'); var config = workflow.init('update', title, submitText); // load current data zaqar.getFlavor(selected.name).then(onLoad); function onLoad(response) { config.model.name = response.data.name; config.model.pool_group = response.data.pool_group; config.model.capabilities = response.data.capabilities; } return modal.open(config).then(submit); } function allowed() { return policy.ifAllowed({ rules: [['pool_flavor', 'update_flavor']] }); } function submit(context) { return zaqar.updateFlavor(context.model, true).then(success, true); } function success(response) { toast.add('success', interpolate(message.success, [response.data.name])); var result = actionResult.getActionResult().updated(resourceType, response.data.name); return result.result; } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pool-flavors/actions/workflow.service.js0000664000175000017500000000605600000000000031520 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 factory * @name horizon.dashboard.admin.pool-flavors.actions.workflow * @description * Workflow for creating/updating storage pool flavor */ angular .module('horizon.dashboard.admin.pool-flavors.actions') .factory('horizon.dashboard.admin.pool-flavors.actions.workflow', workflow); workflow.$inject = [ 'horizon.framework.util.i18n.gettext' ]; function workflow(gettext) { var workflow = { init: init }; function init(actionType, title, submitText) { var schema, form, model; var capabilitiesPlaceholder = gettext( 'Describes flavor-specific capabilities in YAML format.'); // schema schema = { type: 'object', properties: { name: { title: gettext('Name'), type: 'string' }, pool_group: { title: gettext('Pool Group'), type: 'string' }, capabilities: { title: gettext('Capabilities'), type: 'string' } } }; // form form = [ { type: 'section', htmlClass: 'row', items: [ { type: 'section', htmlClass: 'col-sm-6', items: [ { key: 'name', placeholder: gettext('Name of the flavor.'), required: true, "readonly": actionType === 'update' }, { key: 'pool_group', placeholder: gettext('Pool group for flavor.'), /* eslint-disable max-len */ description: gettext('You must specify one of the pool groups that is configured in storage pools.'), required: true } ] }, { type: 'section', htmlClass: 'col-sm-6', items: [ { key: 'capabilities', type: 'textarea', placeholder: capabilitiesPlaceholder } ] } ] } ]; // form model = { name: '', pool_group: '', capabilities: '' }; var config = { title: title, submitText: submitText, schema: schema, form: form, model: model }; return config; } return workflow; } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pool-flavors/drawer.html0000664000175000017500000000023000000000000026347 0ustar00zuulzuul00000000000000 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pool-flavors/panel.html0000664000175000017500000000027100000000000026167 0ustar00zuulzuul00000000000000 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pool-flavors/pool-flavors.module.js0000664000175000017500000000601100000000000030445 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.admin.pool-flavors * @description Flavors module for messaging pool. */ angular .module('horizon.dashboard.admin.pool-flavors', [ 'ngRoute', 'horizon.dashboard.admin.pool-flavors.actions' ]) .constant('horizon.dashboard.admin.pool-flavors.resourceType', 'OS::Zaqar::Flavors') .run(run) .config(config); run.$inject = [ 'horizon.app.core.openstack-service-api.zaqar', 'horizon.dashboard.admin.pool-flavors.basePath', 'horizon.dashboard.admin.pool-flavors.resourceType', 'horizon.dashboard.admin.pool-flavors.service', 'horizon.framework.conf.resource-type-registry.service' ]; function run(zaqar, basePath, resourceType, flavorsService, registry) { registry.getResourceType(resourceType) .setNames(gettext('Pool Flavor'), gettext('Pool Flavors')) .setSummaryTemplateUrl(basePath + 'drawer.html') .setProperties(flavorProperties()) .setListFunction(flavorsService.getFlavorsPromise) .tableColumns .append({ id: 'name', priority: 1, sortDefault: true }) .append({ id: 'pool_group', priority: 1 }); // for magic-search registry.getResourceType(resourceType).filterFacets .append({ label: gettext('Name'), name: 'name', singleton: true }) .append({ label: gettext('Pool Group'), name: 'pool_group', singleton: true }); } function flavorProperties() { return { name: { label: gettext('Name'), filters: [] }, pool_group: { label: gettext('Pool Group'), filters: ['noName'] }, capabilities: { label: gettext('Capabilities'), filters: ['noValue'] } }; } config.$inject = [ '$provide', '$windowProvider', '$routeProvider' ]; /** * @ndoc config * @name horizon.dashboard.admin.pool-flavors.basePath * @param {Object} $provide * @param {Object} $windowProvider * @param {Object} $routeProvider * @returns {undefined} Returns nothing * @description Base path for the pool-flavors panel */ function config($provide, $windowProvider, $routeProvider) { var path = $windowProvider.$get().STATIC_URL + 'dashboard/admin/pool-flavors/'; $provide.constant('horizon.dashboard.admin.pool-flavors.basePath', path); $routeProvider.when('/admin/pool_flavors', { templateUrl: path + 'panel.html' }); } }()); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pool-flavors/pool-flavors.scss0000664000175000017500000000005200000000000027517 0ustar00zuulzuul00000000000000 textarea#capabilities { height: 10em; }././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pool-flavors/pool-flavors.service.js0000664000175000017500000000347100000000000030627 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.admin.pool-flavors') .factory('horizon.dashboard.admin.pool-flavors.service', flavorsService); flavorsService.$inject = [ 'horizon.app.core.openstack-service-api.zaqar' ]; /* * @ngdoc factory * @name horizon.dashboard.admin.pool-flavors.service * * @description * This service provides functions that are used through * the Pool Flavors features. */ function flavorsService(zaqar) { return { getFlavorsPromise: getFlavorsPromise }; /* * @ngdoc function * @name getFlavorsPromise * @description * Given filter/query parameters, returns a promise for the matching * flavors. This is used in displaying lists of Pool Flavors. */ function getFlavorsPromise(params) { return zaqar.getFlavors(params).then(modifyResponse); } function modifyResponse(response) { return {data: {items: response.data.items.map(modifyItem)}}; function modifyItem(item) { // we should set 'trackBy' as follows ideally. // item.trackBy = item.id + item.updated_at; var timestamp = new Date(); item.trackBy = item.name.concat(timestamp.getTime()); return item; } } } })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5771475 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pools/0000775000175000017500000000000000000000000022713 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5771475 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pools/actions/0000775000175000017500000000000000000000000024353 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pools/actions/actions.module.js0000664000175000017500000000441400000000000027640 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.admin.pools.actions * * @description * Provides all of the actions for pools. */ angular.module('horizon.dashboard.admin.pools.actions', [ 'horizon.framework.conf', 'horizon.dashboard.admin.pools' ]) .run(registerPoolActions); registerPoolActions.$inject = [ 'horizon.framework.conf.resource-type-registry.service', 'horizon.dashboard.admin.pools.actions.create.service', 'horizon.dashboard.admin.pools.actions.delete.service', 'horizon.dashboard.admin.pools.actions.update.service', 'horizon.dashboard.admin.pools.resourceType' ]; function registerPoolActions( registry, createPoolService, deletePoolService, updatePoolService, poolResourceType ) { var resourceType = registry.getResourceType(poolResourceType); resourceType.globalActions .append({ id: 'createPoolAction', service: createPoolService, template: { text: gettext('Create Pool'), type: 'create' } }); resourceType.batchActions .append({ id: 'batchDeletePoolAction', service: deletePoolService, template: { type: 'delete-selected', text: gettext('Delete Pools') } }); resourceType.itemActions .append({ id: 'updatePoolAction', service: updatePoolService, template: { text: gettext('Update Pool'), type: 'row' } }) .append({ id: 'deletePoolAction', service: deletePoolService, template: { text: gettext('Delete Pool'), type: 'delete' } }); } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pools/actions/create.service.js0000664000175000017500000000471300000000000027620 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 factory * @name horizon.dashboard.admin.pools.actions.create.service * @description * Service for the storage pool create modal */ angular .module('horizon.dashboard.admin.pools.actions') .factory('horizon.dashboard.admin.pools.actions.create.service', createPoolService); createPoolService.$inject = [ 'horizon.app.core.openstack-service-api.policy', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.dashboard.admin.pools.actions.workflow', 'horizon.dashboard.admin.pools.resourceType', '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' ]; function createPoolService( policy, zaqar, workflow, resourceType, actionResult, gettext, $qExtensions, modal, toast ) { var message = { success: gettext('Pool %s was successfully created.') }; var service = { initAction: initAction, perform: perform, allowed: allowed }; return service; ////////////// function initAction() { } function perform() { var title, submitText; title = gettext('Create Pool'); submitText = gettext('Create'); var config = workflow.init('create', title, submitText); return modal.open(config).then(submit); } function allowed() { return policy.ifAllowed({ rules: [['pool', 'add_pool']] }); } function submit(context) { return zaqar.createPool(context.model, true).then(success, true); } function success(response) { toast.add('success', interpolate(message.success, [response.data.id])); var result = actionResult.getActionResult().created(resourceType, response.data.name); return result.result; } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pools/actions/delete.service.js0000664000175000017500000001020500000000000027610 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'; /** * @ngdoc factory * @name horizon.dashboard.admin.pools.actions.delete.service * @Description * Brings up the delete pools confirmation modal dialog. * On submit, delete given pools. * On cancel, do nothing. */ angular .module('horizon.dashboard.admin.pools.actions') .factory('horizon.dashboard.admin.pools.actions.delete.service', deleteService); deleteService.$inject = [ '$q', 'horizon.app.core.openstack-service-api.policy', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.dashboard.admin.pools.resourceType', '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.toast.service' ]; function deleteService( $q, policy, zaqar, resourceType, actionResult, gettext, $qExtensions, deleteModal, toast ) { var scope, context; var notAllowedMessage = gettext("You are not allowed to delete pools: %s"); var service = { initAction: initAction, allowed: allowed, perform: perform }; return service; ////////////// function initAction() { context = { }; } function perform(items, newScope) { scope = newScope; var pools = angular.isArray(items) ? items : [items]; context.labels = labelize(pools.length); context.deleteEntity = deletePool; return $qExtensions.allSettled(pools.map(checkPermission)).then(afterCheck); } function allowed() { return policy.ifAllowed({ rules: [['pool', 'delete_pool']] }); } function checkPermission(pool) { return {promise: allowed(), context: pool}; } 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) { var result = actionResult.getActionResult(); deleteModalResult.pass.forEach(function markDeleted(item) { result.deleted(resourceType, getEntity(item).name); }); deleteModalResult.fail.forEach(function markFailed(item) { result.failed(resourceType, getEntity(item).name); }); return result.result; } function labelize(count) { return { title: ngettext( 'Confirm Delete Pool', 'Confirm Delete Pools', count), message: ngettext( 'You have selected "%s". Deleted Pool is not recoverable.', 'You have selected "%s". Deleted Pools are not recoverable.', count), submit: ngettext( 'Delete Pool', 'Delete Pools', count), success: ngettext( 'Deleted Pool: %s.', 'Deleted Pools: %s.', count), error: ngettext( 'Unable to delete Pool: %s.', 'Unable to delete Pools: %s.', count) }; } function deletePool(pool) { return zaqar.deletePool(pool, true); } function getMessage(message, entities) { return interpolate(message, [entities.map(getName).join(", ")]); } function getName(result) { return getEntity(result).name; } function getEntity(result) { return result.context; } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pools/actions/update.service.js0000664000175000017500000000547600000000000027646 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 factory * @name horizon.dashboard.admin.pools.actions.update.service * @description * Service for the storage pool update modal */ angular .module('horizon.dashboard.admin.pools.actions') .factory('horizon.dashboard.admin.pools.actions.update.service', updateService); updateService.$inject = [ 'horizon.app.core.openstack-service-api.policy', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.dashboard.admin.pools.actions.workflow', 'horizon.dashboard.admin.pools.resourceType', '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' ]; function updateService( policy, zaqar, workflow, resourceType, actionResult, gettext, $qExtensions, modal, toast ) { var message = { success: gettext('Pool %s was successfully updated.') }; var service = { initAction: initAction, perform: perform, allowed: allowed }; return service; ////////////// function initAction() { } function perform(selected) { var title, submitText; title = gettext('Update Pool'); submitText = gettext('Update'); var config = workflow.init('update', title, submitText); // load current data zaqar.getPool(selected.name).then(onLoad); function onLoad(response) { config.model.name = response.data.name; config.model.group = response.data.group; config.model.weight = response.data.weight; config.model.uri = response.data.uri; config.model.options = response.data.options; } return modal.open(config).then(submit); } function allowed() { return policy.ifAllowed({ rules: [['pool', 'update_pool']] }); } function submit(context) { return zaqar.updatePool(context.model, true).then(success, true); } function success(response) { toast.add('success', interpolate(message.success, [response.data.name])); var result = actionResult.getActionResult().updated(resourceType, response.data.name); return result.result; } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pools/actions/workflow.service.js0000664000175000017500000000666200000000000030234 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 factory * @name horizon.dashboard.admin.pools.actions.workflow * @description * Workflow for creating/updating storage pool */ angular .module('horizon.dashboard.admin.pools.actions') .factory('horizon.dashboard.admin.pools.actions.workflow', workflow); workflow.$inject = [ 'horizon.framework.util.i18n.gettext' ]; function workflow(gettext) { var workflow = { init: init }; function init(actionType, title, submitText) { var schema, form, model; var optionsPlaceholder = gettext( 'An optional request component related to storage-specific options in YAML format.'); // schema schema = { type: 'object', properties: { name: { title: gettext('Name'), type: 'string' }, group: { title: gettext('Group'), type: 'string' }, weight: { title: gettext('Weight'), type: 'number' }, uri: { title: gettext('URI'), type: 'string' }, options: { title: gettext('Options'), type: 'string' } } }; // form form = [ { type: 'section', htmlClass: 'row', items: [ { type: 'section', htmlClass: 'col-sm-6', items: [ { key: 'name', placeholder: gettext('Name of the pool.'), required: true, "readonly": actionType === 'update' }, { key: 'weight', placeholder: gettext('Weight of the pool.'), required: true }, { key: 'uri', placeholder: gettext('URI for storage engine of this pool.'), description: gettext('e.g. mongodb://127.0.0.1:27017'), required: true } ] }, { type: 'section', htmlClass: 'col-sm-6', items: [ { key: 'group', placeholder: gettext('Group of the pool.') }, { key: 'options', type: 'textarea', placeholder: optionsPlaceholder } ] } ] } ]; // form model = { name: '', group: '', weight: 0, uri: '', options: '' }; var config = { title: title, submitText: submitText, schema: schema, form: form, model: model }; return config; } return workflow; } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pools/drawer.html0000664000175000017500000000023000000000000025060 0ustar00zuulzuul00000000000000 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pools/panel.html0000664000175000017500000000026500000000000024703 0ustar00zuulzuul00000000000000 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pools/pools.module.js0000664000175000017500000000650200000000000025674 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.admin.pools * @description Pools module for messaging. */ angular .module('horizon.dashboard.admin.pools', [ 'ngRoute', 'horizon.dashboard.admin.pools.actions' ]) .constant('horizon.dashboard.admin.pools.resourceType', 'OS::Zaqar::Pools') .run(run) .config(config); run.$inject = [ 'horizon.app.core.openstack-service-api.zaqar', 'horizon.dashboard.admin.pools.basePath', 'horizon.dashboard.admin.pools.resourceType', 'horizon.dashboard.admin.pools.service', 'horizon.framework.conf.resource-type-registry.service' ]; function run(zaqar, basePath, resourceType, poolsService, registry) { registry.getResourceType(resourceType) .setNames(gettext('Pool'), gettext('Pools')) .setSummaryTemplateUrl(basePath + 'drawer.html') .setProperties(poolProperties()) .setListFunction(poolsService.getPoolsPromise) .tableColumns .append({ id: 'name', priority: 1, sortDefault: true }) .append({ id: 'group', priority: 1 }) .append({ id: 'weight', priority: 1 }) .append({ id: 'uri', priority: 2 }); // for magic-search registry.getResourceType(resourceType).filterFacets .append({ label: gettext('Name'), name: 'name', singleton: true }) .append({ label: gettext('Group'), name: 'group', singleton: true }) .append({ label: gettext('Weight'), name: 'weight', singleton: true }) .append({ label: gettext('URI'), name: 'uri', singleton: true }); } function poolProperties() { return { name: { label: gettext('Name'), filters: [] }, group: { label: gettext('Group'), filters: ['noName'] }, weight: { label: gettext('Weight'), filters: ['noValue'] }, uri: { label: gettext('URI'), filters: ['noValue'] }, options: { label: gettext('Options'), filters: ['noValue'] } }; } config.$inject = [ '$provide', '$windowProvider', '$routeProvider' ]; /** * @ndoc config * @name horizon.dashboard.admin.pools.basePath * @param {Object} $provide * @param {Object} $windowProvider * @param {Object} $routeProvider * @returns {undefined} Returns nothing * @description Base path for the pools panel */ function config($provide, $windowProvider, $routeProvider) { var path = $windowProvider.$get().STATIC_URL + 'dashboard/admin/pools/'; $provide.constant('horizon.dashboard.admin.pools.basePath', path); $routeProvider.when('/admin/pools', { templateUrl: path + 'panel.html' }); } }()); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/admin/pools/pools.service.js0000664000175000017500000000340400000000000026045 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.admin.pools') .factory('horizon.dashboard.admin.pools.service', poolsService); poolsService.$inject = [ 'horizon.app.core.openstack-service-api.zaqar' ]; /* * @ngdoc factory * @name horizon.dashboard.admin.pools.service * * @description * This service provides functions that are used through * the Pools features. */ function poolsService(zaqar) { return { getPoolsPromise: getPoolsPromise }; /* * @ngdoc function * @name getPoolsPromise * @description * Given filter/query parameters, returns a promise for the matching * pools. This is used in displaying lists of Pools. */ function getPoolsPromise(params) { return zaqar.getPools(params).then(modifyResponse); } function modifyResponse(response) { return {data: {items: response.data.items.map(modifyItem)}}; function modifyItem(item) { // we should set 'trackBy' as follows ideally. // item.trackBy = item.id + item.updated_at; var timestamp = new Date(); item.trackBy = item.name.concat(timestamp.getTime()); return item; } } } })(); ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5531456 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/0000775000175000017500000000000000000000000022135 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.581148 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/0000775000175000017500000000000000000000000023444 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.581148 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/0000775000175000017500000000000000000000000025104 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/actions.module.js0000664000175000017500000000676200000000000030401 0ustar00zuulzuul00000000000000/** * Copyright 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; /** * @ngdoc overview * @ngname horizon.dashboard.project.queues.actions * @description Provides all of the actions for queues. */ angular.module('horizon.dashboard.project.queues.actions', [ 'horizon.framework.conf', 'horizon.app.core']) .run(registerActions); registerActions.$inject = [ 'horizon.framework.conf.resource-type-registry.service', 'horizon.dashboard.project.queues.actions.createQueueService', 'horizon.dashboard.project.queues.actions.deleteQueueService', 'horizon.dashboard.project.queues.actions.updateQueueService', 'horizon.dashboard.project.queues.actions.purgeQueueService', 'horizon.dashboard.project.queues.actions.postMessageService', 'horizon.dashboard.project.queues.actions.listMessageService', 'horizon.dashboard.project.queues.actions.signedUrlService', 'horizon.dashboard.project.queues.actions.createSubscriptionService', 'horizon.dashboard.project.queues.resourceType' ]; function registerActions( registry, createQueueService, deleteQueueService, updateQueueService, purgeQueueService, postMessageService, listMessageService, signedUrlService, createSubscriptionService, resourceType ) { var queueResourceType = registry.getResourceType(resourceType); queueResourceType.itemActions .append({ id: 'messagesPost', service: postMessageService, template: { text: gettext('Post Messages') } }) .append({ id: 'messagesList', service: listMessageService, template: { text: gettext('View Messages') } }) .append({ id: 'queuesSignedUrl', service: signedUrlService, template: { text: gettext('Signed URL') } }) .append({ id: 'queuesItemUpdate', service: updateQueueService, template: { text: gettext('Update') } }) .append({ id: 'queuesItemPurge', service: purgeQueueService, template: { text: gettext('Purge') } }) .append({ id: 'subscriptionsCreate', service: createSubscriptionService, template: { text: gettext('Create Subscription') } }) .append({ id: 'queuesItemDelete', service: deleteQueueService, template: { type: 'delete', text: gettext('Delete') } }); queueResourceType.batchActions .append({ id: 'queuesBatchCreate', service: createQueueService, template: { type: 'create', text: gettext('Create Queues') } }) .append({ id: 'queuesBatchDelete', service: deleteQueueService, template: { type: 'delete-selected', text: gettext('Delete Queues') } }); } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/create-queue.service.js0000664000175000017500000000525400000000000031474 0ustar00zuulzuul00000000000000/** * Copyright 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; angular .module('horizon.dashboard.project.queues') .factory('horizon.dashboard.project.queues.actions.createQueueService', createQueueService); createQueueService.$inject = [ 'horizon.app.core.metadata.service', 'horizon.app.core.openstack-service-api.policy', 'horizon.dashboard.project.queues.events', 'horizon.dashboard.project.queues.actions.createQueueWorkflow', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.framework.widgets.modal.wizard-modal.service', 'horizon.framework.widgets.toast.service' ]; /** * @ngDoc factory * @name horizon.dashboard.project.queues.actions.createQueueService * @param {Object} meta * @param {Object} policy * @param {Object} events * @param {Object} createQueueWorkflow * @param {Object} zaqar * @param {Object} wizard * @param {Object} toast * @returns {Object} service * @description A service to open the queues wizard. */ function createQueueService(meta, policy, events, createQueueWorkflow, zaqar, wizard, toast) { var message = { success: gettext('Queue %s was successfully created.') }; var scope; var model = { queue_name: null, metadata: {} }; var service = { initAction: initAction, perform: perform, allowed: allowed }; return service; ////////////// function initAction() { } function perform(selected, $scope) { scope = $scope; return wizard.modal({ workflow: createQueueWorkflow, submit: submit }).result; } function allowed() { return policy.ifAllowed({ rules: [['queue', 'add_queue']] }); } function submit(stepModels) { model = stepModels.queueDetailsForm; model.metadata = stepModels.queueMetadataForm; return zaqar.createQueue(model).then(success); } function success(response) { toast.add('success', interpolate(message.success, [response.data.name])); scope.$emit(events.CREATE_SUCCESS, response.data); } } // end of createQueueService })(); // end of IIFE ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/create-queue.workflow.js0000664000175000017500000000346200000000000031705 0ustar00zuulzuul00000000000000/** * Copyright 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; angular .module('horizon.dashboard.project.queues') .factory('horizon.dashboard.project.queues.actions.createQueueWorkflow', createQueueWorkflow); createQueueWorkflow.$inject = [ 'horizon.app.core.workflow.factory', 'horizon.dashboard.project.queues.basePath', 'horizon.framework.util.i18n.gettext' ]; /** * @ngdoc factory * @name horizon.dashboard.project.queues.actions.createQueueWorkflow * @param {Object} workflowService * @param {Object} basePath * @param {Object} gettext * @returns {Object} create queue workflow service * @description A workflow for the create queue action. */ function createQueueWorkflow(workflowService, basePath, gettext) { var workflow = workflowService({ title: gettext('Create Queue'), btnText: { finish: gettext('Create') }, steps: [{ title: gettext('Queue Details'), templateUrl: basePath + 'steps/queue-details/queue-details.html', formName: 'queueDetailsForm' }, { title: gettext('Queue Metadata'), templateUrl: basePath + 'steps/queue-metadata/queue-metadata.html', formName: 'queueMetadataForm' }] }); return workflow; } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/create-subscription.service.js0000664000175000017500000000617500000000000033077 0ustar00zuulzuul00000000000000/** * Copyright 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; angular .module('horizon.dashboard.project.queues') .factory('horizon.dashboard.project.queues.actions.createSubscriptionService', createSubscriptionService); createSubscriptionService.$inject = [ '$q', 'horizon.app.core.metadata.service', 'horizon.app.core.openstack-service-api.policy', 'horizon.dashboard.project.queues.events', 'horizon.dashboard.project.queues.actions.createSubscriptionWorkflow', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.framework.widgets.modal.wizard-modal.service', 'horizon.framework.widgets.toast.service' ]; /** * @ngDoc factory * @name horizon.dashboard.project.queues.actions.createSubscriptionService * @param {Object} $q * @param {Object} meta * @param {Object} policy * @param {Object} events * @param {Object} createSubWorkflow * @param {Object} zaqar * @param {Object} wizard * @param {Object} toast * @returns {Object} create subscription service * @description A service to open the subscriptions wizard. */ function createSubscriptionService( $q, meta, policy, events, createSubWorkflow, zaqar, wizard, toast) { var message = { success: gettext('Subscription %s was successfully created.') }; var scope; var model = null; var service = { initAction: initAction, perform: perform, allowed: allowed }; return service; ////////////// function initAction() { } function perform(queue, $scope) { scope = $scope; model = { subscriber: null, ttl: null, options: {} }; model.queueName = queue.name; wizard.modal({ workflow: createSubWorkflow, submit: submit }); } function allowed() { return policy.ifAllowed({ rules: [['queue', 'add_subscriptions']] }); } function submit(stepModels) { angular.extend(model, stepModels.subscriptionForm); return zaqar.addSubscription(model).then(success, error); } function success(response) { angular.extend(model, response.data); toast.add('success', interpolate(message.success, [model.subscriber])); scope.$emit(events.SUBSCRIPTION_CREATE_SUCCESS, model); } function error() { // TODO: Currently, when server throws an error // close the modal dialog and display the error message // In the future, display the error message inside the dialog // and allow user to continue with workflow return; } } // end of createSubscriptionService })(); // end of IIFE ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/create-subscription.workflow.js0000664000175000017500000000333600000000000033305 0ustar00zuulzuul00000000000000/** * Copyright 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; angular .module('horizon.dashboard.project.queues') .factory('horizon.dashboard.project.queues.actions.createSubscriptionWorkflow', createSubscriptionWorkflow); createSubscriptionWorkflow.$inject = [ 'horizon.app.core.workflow.factory', 'horizon.dashboard.project.queues.basePath', 'horizon.framework.util.i18n.gettext' ]; /** * @ngdoc factory * @name horizon.dashboard.project.queues.actions.createSubscriptionWorkflow * @param {Object} workflowService * @param {Object} basePath * @param {Object} gettext * @returns {Object} create subscription workflow service * @description A workflow for the create subscription action. */ function createSubscriptionWorkflow(workflowService, basePath, gettext) { var workflow = workflowService({ title: gettext('Create Subscription'), btnText: { finish: gettext('Create') }, steps: [ { title: gettext('Subscription'), templateUrl: basePath + 'steps/subscription/subscription.html', formName: 'subscriptionForm' } ] }); return workflow; } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/delete-queue.service.js0000664000175000017500000000742600000000000031476 0ustar00zuulzuul00000000000000/** * Copyright 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; angular .module('horizon.dashboard.project.queues') .factory('horizon.dashboard.project.queues.actions.deleteQueueService', deleteQueueService); deleteQueueService.$inject = [ '$q', 'horizon.app.core.openstack-service-api.policy', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.dashboard.project.queues.events', 'horizon.framework.util.i18n.gettext', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.modal.deleteModalService', 'horizon.framework.widgets.toast.service' ]; /** * @ngDoc factory * @name horizon.dashboard.project.queues.actions.deleteQueueService * @param {Object} $q * @param {Object} policy * @param {Object} zaqar * @param {Object} events * @param {Object} gettext * @param {Object} $qExtensions * @param {Object} deleteModal * @param {Object} toast * @returns {Object} delete queue service * @description Brings up the delete queues confirmation modal dialog. * On submit, delete given queues. * On cancel, do nothing. */ function deleteQueueService( $q, policy, zaqar, events, gettext, $qExtensions, deleteModal, toast) { var context; var service = { initAction: initAction, allowed: allowed, perform: perform }; return service; ////////////// function initAction() { context = { successEvent: events.DELETE_SUCCESS }; } function perform(items, $scope) { var queues = angular.isArray(items) ? items : [items]; context.labels = labelize(queues.length); context.deleteEntity = deleteQueue; $qExtensions.allSettled(queues.map(checkPermission)).then(afterCheck); function afterCheck(result) { if (result.fail.length > 0) { toast.add('error', getMessage(result.fail)); } if (result.pass.length > 0) { deleteModal.open($scope, result.pass.map(getEntity), context); } } } function allowed() { return policy.ifAllowed({ rules: [['zaqar', 'delete_queues']] }); } function deleteQueue(queue) { return zaqar.deleteQueue(queue); } function checkPermission(queue) { return { promise: allowed(queue), context: queue }; } function getMessage(entities) { var message = gettext("You are not allowed to delete queues: %s"); return interpolate(message, [entities.map(getName).join(", ")]); } function labelize(count) { return { title: ngettext( 'Confirm Delete Queue', 'Confirm Delete queues', count), message: ngettext( 'You have selected "%s". Deleted queue is not recoverable.', 'You have selected "%s". Deleted queues are not recoverable.', count), submit: ngettext( 'Delete Queue', 'Delete Queues', count), success: ngettext( 'Deleted Queue: %s.', 'Deleted Queues: %s.', count), error: ngettext( 'Unable to delete Queue: %s.', 'Unable to delete Queues: %s.', count) }; } function getName(item) { return getEntity(item).name; } function getEntity(item) { return item.context; } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/list-message.controller.js0000664000175000017500000000314500000000000032224 0ustar00zuulzuul00000000000000/** * Copyright 2017 Catalyst IT Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * 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 messageController * @ngController * * @description * Controller for the messages table */ angular .module('horizon.dashboard.project.queues') .controller('horizon.dashboard.project.queues.actions.messageController', messageController); messageController.$inject = [ '$scope', 'horizon.app.core.openstack-service-api.zaqar' ]; function messageController($scope, zaqar) { var ctrl = this; ctrl.queue = $scope.model.id; ctrl.messages = []; /* TODO: actions will be implemented later. ctrl.claimMessage = claimMessage; ctrl.deleteMessage = deleteMessage; */ zaqar.getMessages(ctrl.queue).then(function (response) { ctrl.messages = response.data; }); ////////// /* TODO: actions will be implemented later. function claimMessage(message) { console.info(message); } function deleteMessage(message) { console.info(message); } */ } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/list-message.controller.spec.js0000664000175000017500000000344500000000000033160 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.project.queues.actions.messageController', function() { var zaqar, ctrl, $scope, $q, deferred; beforeEach(module('horizon.framework')); beforeEach(module('horizon.app.core.openstack-service-api')); beforeEach(module('horizon.dashboard.project.queues')); beforeEach(inject(function ($injector, $controller, _$rootScope_, _$q_) { $q = _$q_; $scope = _$rootScope_.$new(); $scope.model = { id: '1' }; zaqar = $injector.get('horizon.app.core.openstack-service-api.zaqar'); deferred = $q.defer(); deferred.resolve({data: [{id: '1'}]}); spyOn(zaqar, 'getMessages').and.returnValue(deferred.promise); ctrl = $controller( 'horizon.dashboard.project.queues.actions.messageController', { '$scope': $scope, 'horizon.app.core.openstack-service-api.zaqar': zaqar } ); })); it('should queue_id is provided by scope variable', function() { expect(ctrl.queue).toBe('1'); }); it('should load messages for queue', function() { $scope.$apply(); expect(zaqar.getMessages).toHaveBeenCalled(); expect(ctrl.messages.length).toBe(1); }); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/list-message.html0000664000175000017500000000150000000000000030363 0ustar00zuulzuul00000000000000
ID Body Time to Live Age
No message to show.
{$ msg.id $} {$ msg.body $} {$ msg.ttl $} {$ msg.age $}
././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/list-message.service.js0000664000175000017500000000567600000000000031514 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.project.queues') .factory( 'horizon.dashboard.project.queues.actions.listMessageService', listMessageService); listMessageService.$inject = [ '$q', 'horizon.dashboard.project.queues.basePath', 'horizon.framework.util.i18n.gettext', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.form.ModalFormService' ]; /** * @ngdoc factory * @name horizon.dashboard.project.queues.actions.listMessageService * @param {Object} $q * @param {String} basePath * @param {Object} gettext * @param {Object} $qExtensions * @param {Object} modal * @returns {Object} list messages service * @description Brings up the polling messages modal dialog. * On submit, poll messages from given queues. * On cancel, do nothing. */ function listMessageService( $q, basePath, gettext, $qExtensions, modal ) { // schema var schema = { type: "object", properties: { listMessages: { title: gettext("List Messages"), type: "string" } } }; // form var form = [ { type: 'section', htmlClass: 'row', items: [ { type: 'section', htmlClass: 'col-sm-12', items: [ { type: 'template', templateUrl: basePath + 'actions/list-message.html' } ] } ] } ]; // model var model; var service = { initAction: initAction, perform: perform, allowed: allowed }; // modal config var config = { "title": gettext('List Messages'), "submitText": gettext('List Messages'), "schema": schema, "form": form, "model": model }; return service; ////////////// function initAction() { } function allowed() { return $qExtensions.booleanAsPromise(true); } function perform(selected) { config.model = { id: selected.id, name: selected.name }; return modal.open(config).then(submit); } function submit(context) { var id = context.model.id; var name = context.model.name; config.model = { id: id, name: name }; // display new dialog modal.open(config).then(submit); } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/post-message.help.html0000664000175000017500000000145200000000000031332 0ustar00zuulzuul00000000000000

You can submit up to 10 messages in a single request, but you must always encapsulate the messages in a collection container (an array in JSON, even for a single message - without the JSON array, you receive the "Invalid request body" message). The resulting value of the Location header or response body might be used to retrieve the created messages for further processing.

The client specifies only the body and TTL for the message. The server inserts metadata, such as ID and age.

See a sample as below:

[
  {
    "body": {
      "event": "BackupProgress",
      "current_bytes": "2341134",
      "total_bytes": "99614720"
    }
  }
]
././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/post-message.service.js0000664000175000017500000000720200000000000031511 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.project.queues') .factory( 'horizon.dashboard.project.queues.actions.postMessageService', postMessageService); postMessageService.$inject = [ '$q', 'horizon.dashboard.project.queues.basePath', 'horizon.app.core.openstack-service-api.policy', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.dashboard.project.queues.events', 'horizon.framework.util.i18n.gettext', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.form.ModalFormService', 'horizon.framework.widgets.toast.service' ]; /** * @ngdoc factory * @name horizon.dashboard.project.queues.actions.postMessageService * @param {Object} $q * @param {String} basePath * @param {Object} policy * @param {Object} zaqar * @param {Object} events * @param {Object} gettext * @param {Object} $qExtensions * @param {Object} modal * @param {Object} toast * @returns {Object} post messages service * @description Brings up the post messages modal dialog. * On submit, post messages to given queues. * On cancel, do nothing. */ function postMessageService( $q, basePath, policy, zaqar, events, gettext, $qExtensions, modal, toast ) { // schema var schema = { type: "object", properties: { postMessages: { title: gettext("Post Messages"), type: "string" } } }; // form var form = [ { type: 'section', htmlClass: 'row', items: [ { type: 'section', htmlClass: 'col-sm-6', items: [ { key: 'messages', type: 'textarea' } ] }, { type: 'template', templateUrl: basePath + 'actions/post-message.help.html' } ] } ]; // model var model = {}; var message = { success: gettext('Messages has been posted to queue %s successfully.') }; var service = { initAction: initAction, perform: perform, allowed: allowed }; var scope; return service; ////////////// function initAction() { } function allowed() { return $qExtensions.booleanAsPromise(true); } function perform(selected, $scope) { scope = $scope; model = { id: selected.id, name: selected.name }; // modal config var config = { "title": gettext('List Messages'), "submitText": gettext('Post'), "schema": schema, "form": form, "model": model }; return modal.open(config).then(submit); } function submit(context) { var id = context.model.id; var name = context.model.name; delete context.model.id; delete context.model.name; return zaqar.postMessages(id, context.model).then(function() { toast.add('success', interpolate(message.success, [name])); scope.$emit(events.POST_MESSAGE_SUCCESS, name); }); } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/purge-queue.service.js0000664000175000017500000000760200000000000031352 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.project.queues') .factory( 'horizon.dashboard.project.queues.actions.purgeQueueService', purgeQueueService); purgeQueueService.$inject = [ '$q', 'horizon.app.core.openstack-service-api.policy', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.dashboard.project.queues.events', 'horizon.framework.util.i18n.gettext', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.form.ModalFormService', 'horizon.framework.widgets.toast.service' ]; /** * @ngdoc factory * @name horizon.dashboard.project.queues.actions.purgeQueueService * @param {Object} $q * @param {Object} policy * @param {Object} zaqar * @param {Object} events * @param {Object} gettext * @param {Object} $qExtensions * @param {Object} modal * @param {Object} toast * @returns {Object} purge queue service * @description Brings up the purge queues choices modal dialog. * On submit, purge given queues. * On cancel, do nothing. */ function purgeQueueService( $q, policy, zaqar, events, gettext, $qExtensions, modal, toast ) { // schema var schema = { type: "object", properties: { resource_types: { title: gettext("Choose resource to purge"), type: "string", enum: ["messages", "subscriptions", "all"] } } }; // form var form = [ { type: 'section', htmlClass: 'row', items: [ { type: 'section', htmlClass: 'col-sm-12', items: [ { key: 'resource_types', type: 'radiobuttons', titleMap: [ {value: 'messages', name: gettext('Messages')}, {value: 'subscriptions', name: gettext('Subscriptions')}, {value: "all", name: "All"} ], required:true } ] } ] } ]; var scope, model; var message = { success: gettext('Queue %s has been purged successfully.') }; var service = { initAction: initAction, perform: perform, allowed: allowed }; return service; ////////////// function initAction() { } function allowed() { return $qExtensions.booleanAsPromise(true); } function perform(selected, $scope) { scope = $scope; model = { id: selected.id, name: selected.name, resource_types: [] }; // modal config var config = { "title": gettext('Purge Queue'), "submitText": gettext('Purge'), "schema": schema, "form": form, "model": model }; return modal.open(config).then(submit); } function submit(context) { var id = context.model.id; var name = context.model.name; delete context.model.id; delete context.model.name; context.model.resource_types = (context.model.resource_types === "all") ? [] : [context.model.resource_types]; return zaqar.purgeQueue(id, context.model).then(function() { toast.add('success', interpolate(message.success, [name])); scope.$emit(events.PURGE_SUCCESS, name); }); } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/signed-url.service.js0000664000175000017500000001354500000000000031162 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'; /** * @ngdoc factory * @name horizon.dashboard.project.queues.signed-url.service * @description * Service for the signed url for the queue */ angular .module('horizon.dashboard.project.queues') .factory( 'horizon.dashboard.project.queues.actions.signedUrlService', signedUrlService); signedUrlService.$inject = [ 'horizon.app.core.openstack-service-api.policy', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.dashboard.project.queues.basePath', 'horizon.dashboard.project.queues.events', 'horizon.dashboard.project.queues.resourceType', '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.modal-wait-spinner.service', 'horizon.framework.widgets.toast.service' ]; function signedUrlService( policy, zaqar, basePath, events, resourceType, actionResult, gettext, $qExtensions, modal, waitSpinner, toast ) { // schema var schema = { type: "object", properties: { name: { }, paths: { }, ttl_seconds: { type: "number", minimum: 1 }, methods: { } } }; // form var form = [ { type: 'section', htmlClass: 'row', items: [ { type: "section", htmlClass: "col-sm-12", items: [ { // for result message type: "help", helpvalue: "", condition: true }, { key: "paths", type: "checkboxes", title: gettext("Paths"), titleMap: [ {value: "messages", name: gettext("Messages")}, {value: "subscriptions", name: gettext("Subscriptions")}, {value: "claims", name: gettext("Claims")} ], htmlClass: "horizontal-checkboxes" }, { key: "ttl_seconds", title: gettext("TTL Seconds") }, { key: "methods", title: gettext("Methods"), type: "checkboxes", titleMap: [ {value: "GET", name: gettext("GET")}, {value: "HEAD", name: gettext("HEAD")}, {value: "OPTIONS", name: gettext("OPTIONS")}, {value: "POST", name: gettext("POST")}, {value: "PUT", name: gettext("PUT")}, {value: "DELETE", name: gettext("DELETE")} ], htmlClass: "horizontal-checkboxes" } ] } ] } ]; // model var model = { id: '', name: '', paths: '', ttl_seconds: '', methods: '' }; // modal config var config = { title: gettext("Signed URL for %s"), schema: schema, form: angular.copy(form), model: model }; var message = { success: gettext("Signed URL was successfully created for the queue %s with expires %s " + "and signature %s.") }; var service = { initAction: initAction, perform: perform, allowed: allowed }; return service; ////////////// function initAction() { } function allowed() { return policy.ifAllowed({ rules: [['queue', 'signed_url']] }); } function perform(selected) { config.model.id = selected.name; config.model.name = selected.name; config.model.paths = ''; config.form = angular.copy(form); config.title = interpolate(config.title, [selected.name]); modal.open(config).then(submit); } function submit(context) { var name = context.model.name; delete context.model.id; delete context.model.name; delete context.model.output; if (!context.model.ttl_seconds) { delete context.model.ttl_seconds; } waitSpinner.showModalSpinner(gettext('Creating Signed URL')); return zaqar.signedUrl(name, context.model).then(function(response) { config.model = { paths: context.model.paths, ttl_seconds: context.model.ttl_seconds, methods: context.model.methods }; config.form = angular.copy(form); // for result message config.form[0].items[0].items[0].helpvalue = "
" + interpolate(message.success, [name, response.data.expires, response.data.signature] ) + "
"; config.form[0].items[0].items[0].condition = false; // display new dialog waitSpinner.hideModalSpinner(); modal.open(config).then(submit); var result = actionResult.getActionResult().updated(resourceType, name); return result.results; }, function(response) { // close spinner and display toast waitSpinner.hideModalSpinner(); toast.add('error', response.data.split("(")[0].trim() + "."); var result = actionResult.getActionResult().failed(resourceType, name); return result.results; }); } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/update-queue.service.js0000664000175000017500000000540300000000000031507 0ustar00zuulzuul00000000000000/** * Copyright 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; angular .module('horizon.dashboard.project.queues') .factory('horizon.dashboard.project.queues.actions.updateQueueService', updateQueueService); updateQueueService.$inject = [ 'horizon.app.core.metadata.service', 'horizon.app.core.openstack-service-api.policy', 'horizon.dashboard.project.queues.events', 'horizon.dashboard.project.queues.actions.updateQueueWorkflow', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.framework.widgets.modal.wizard-modal.service', 'horizon.framework.widgets.toast.service' ]; /** * @ngDoc factory * @name horizon.dashboard.project.queues.actions.updateQueueService * @param {Object} meta * @param {Object} policy * @param {Object} events * @param {Object} updateQueueWorkflow * @param {Object} zaqar * @param {Object} wizard * @param {Object} toast * @returns {Object} update queue service * @description A service to open the queues wizard. */ function updateQueueService(meta, policy, events, updateQueueWorkflow, zaqar, wizard, toast) { var message = { success: gettext('Queue %s was successfully updated.') }; var scope; var model = { queue_name: null, metadata: {} }; var service = { initAction: initAction, perform: perform, allowed: allowed }; return service; ////////////// function initAction() { } function perform(queue, $scope) { scope = $scope; model = queue; model.queue_name = queue.name; wizard.modal({ data: {queue: model}, workflow: updateQueueWorkflow, submit: submit }); } function allowed() { return policy.ifAllowed({ rules: [['queue', 'update_queue']] }); } function submit(stepModels) { model = stepModels.queueDetailsForm; model.metadata = stepModels.queueMetadataForm; return zaqar.updateQueue(model).then(success); } function success(response) { toast.add('success', interpolate(message.success, [response.data.name])); scope.$emit(events.UPDATE_SUCCESS, response.data); } } // end of updateQueueService })(); // end of IIFE ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/actions/update-queue.workflow.js0000664000175000017500000000302600000000000031720 0ustar00zuulzuul00000000000000/** * Copyright 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; angular .module('horizon.dashboard.project.queues') .factory('horizon.dashboard.project.queues.actions.updateQueueWorkflow', updateQueueWorkflow); updateQueueWorkflow.$inject = [ 'horizon.dashboard.project.queues.actions.createQueueWorkflow', 'horizon.dashboard.project.queues.basePath', 'horizon.framework.util.i18n.gettext' ]; /** * @ngdoc factory * @name horizon.dashboard.project.queues.actions.updateQueueWorkflow * @param {Object} createQueueWorkflow * @param {Object} basePath * @param {Object} gettext * @returns {Object} update queue workflow service * @description A workflow for the update queue action. */ function updateQueueWorkflow(createQueueWorkflow, basePath, gettext) { var workflow = angular.copy(createQueueWorkflow); workflow.title = gettext('Update Queue'); workflow.btnText = { finish: gettext('Update') }; return workflow; } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/queues.module.js0000664000175000017500000000506700000000000026605 0ustar00zuulzuul00000000000000/** * Copyright 2015 Catalyst IT Ltd * Copyright 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; /** * @ngdoc overview * @name horizon.dashboard.project.queues * @description Dashboard module to host various queues panels. */ angular .module('horizon.dashboard.project.queues', [ 'horizon.dashboard.project.queues.actions']) .constant('horizon.dashboard.project.queues.events', events()) .constant('horizon.dashboard.project.queues.resourceType', 'OS::Zaqar::Queues') .config(config); config.$inject = [ '$provide', '$windowProvider', '$routeProvider' ]; /** * @ngdoc value * @name horizon.dashboard.project.queues.events * @returns {Object} The event object * @description a list of events for queues */ function events() { return { CREATE_SUCCESS: 'horizon.dashboard.project.queues.CREATE_SUCCESS', DETAILS_CHANGED: 'horizon.dashboard.project.queues.DETAILS_CHANGED', METADATA_CHANGED: 'horizon.dashboard.project.queues.METADATA_CHANGED', DELETE_SUCCESS: 'horizon.dashboard.project.queues.DELETE_SUCCESS', UPDATE_SUCCESS: 'horizon.dashboard.project.queues.UPDATE_SUCCESS', PURGE_SUCCESS: 'horizon.dashboard.project.queues.PURGE_SUCCESS', POST_MESSAGE_SUCCESS: 'horizon.dashboard.project.queues.POST_MESSAGE_SUCCESS', SUBSCRIPTION_CREATE_SUCCESS: 'horizon.dashboard.project.queues.SUBSCRIPTION_CREATE_SUCCESS' }; } /** * @ndoc config * @name horizon.dashboard.project.queues.basePath * @param {Object} $provide * @param {Object} $windowProvider * @param {Object} $routeProvider * @returns {undefined} Returns nothing * @description Base path for the queues panel */ function config($provide, $windowProvider, $routeProvider) { var path = $windowProvider.$get().STATIC_URL + 'dashboard/project/queues/'; $provide.constant('horizon.dashboard.project.queues.basePath', path); $routeProvider.when('/project/queues', { templateUrl: path + 'table/queue.html' }); } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/queues.module.spec.js0000664000175000017500000000147500000000000027535 0ustar00zuulzuul00000000000000/** * Copyright 2015 Catalyst IT Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * 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.project.queues', function() { it('should exist', function() { expect(angular.module('horizon.dashboard.project.queues')).toBeDefined(); }); }); })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/queues.scss0000664000175000017500000000022400000000000025646 0ustar00zuulzuul00000000000000 .subtitle { margin: 2em 0; } textarea#messages { height: 28em; } .horizontal-checkboxes div { display: table-cell; padding-right: 10px; }././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5531456 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/steps/0000775000175000017500000000000000000000000024602 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.581148 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/steps/queue-details/0000775000175000017500000000000000000000000027351 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021000000000000011446 xustar0000000000000000114 path=zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/steps/queue-details/queue-details.controller.js 22 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/steps/queue-details/queue-details.controlle0000664000175000017500000000240500000000000034044 0ustar00zuulzuul00000000000000/** * Copyright 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; angular .module('horizon.dashboard.project.queues') .controller('horizon.dashboard.project.queues.steps.QueueDetailsController', controller); controller.$inject = [ '$scope' ]; /** * @ngdoc controller * @name horizon.dashboard.project.queues.steps.QueueDetailsController * @param {Object} $scope * @returns {undefined} Returns nothing * @description This controller is use for creating a queue. */ function controller($scope) { var ctrl = this; ctrl.queue = $scope.queue ? $scope.queue : {}; ctrl.update = $scope.queue; $scope.stepModels.queueDetailsForm = ctrl.queue; } // end of controller })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/steps/queue-details/queue-details.html0000664000175000017500000000237000000000000033010 0ustar00zuulzuul00000000000000

Queue Details

Note that you can create a queue without defining metadata. The metadata step is optional but recommended.

A queue name between 1-256 characters is required.

././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.585148 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/steps/queue-metadata/0000775000175000017500000000000000000000000027504 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021200000000000011450 xustar0000000000000000116 path=zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/steps/queue-metadata/queue-metadata.controller.js 22 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/steps/queue-metadata/queue-metadata.control0000664000175000017500000000644600000000000034022 0ustar00zuulzuul00000000000000/** * Copyright 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; angular .module('horizon.dashboard.project.queues') .controller('horizon.dashboard.project.queues.steps.QueueMetadataController', controller); controller.$inject = [ '$q', '$scope', 'horizon.app.core.metadata.service', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.dashboard.project.queues.events', 'horizon.framework.widgets.metadata.tree.service' ]; /** * @ngdoc controller * @name horizon.dashboard.project.queues.steps.QueueDetailsController * @param {Object} $q * @param {Object} $scope * @param {Object} metadata * @param {Object} zaqar * @param {Object} events * @param {Object} metaTree * @returns {undefined} Returns nothing * @description This controller is use for creating a queue. */ function controller($q, $scope, metadata, zaqar, events, metaTree) { var ctrl = this; var queue = $scope.queue ? $scope.queue : {}; ctrl.tree = new metaTree.Tree([], []); /* eslint-enable angular/ng_controller_as */ $scope.$watchCollection(getTree, onMetadataChanged); /* eslint-enable angular/ng_controller_as */ init(); //////////////////////////////// function init() { $q.all({ available: standardDefinitions(queue), existing: getExistingMetdataPromise(queue) }) .then(onMetadataGet); } function onMetadataGet(response) { ctrl.tree = new metaTree.Tree( response.available.data.items, response.existing.data ); } function getTree() { return ctrl.tree.getExisting(); } function standardDefinitions(queue) { // TODO: currently, there is no standard metadefinitions // should add some reserved/fixed definition here // preferably it should come from zaqar and not hardcoded here // however available metadata is needed for showing to be updated, // so now we set existing metadata to available metadata. if (angular.isDefined(queue.id)) { return {data: queue.metadata}; } else { var deferred = $q.defer(); deferred.resolve({data: {}}); return deferred.promise; } } function getExistingMetdataPromise(queue) { if (angular.isDefined(queue.id)) { $scope.stepModels.queueMetadataForm = queue.metadata; return {data: queue.metadata}; } else { var deferred = $q.defer(); deferred.resolve({data: {}}); $scope.stepModels.queueMetadataForm = {}; return deferred.promise; } } function onMetadataChanged(newValue, oldValue) { if (newValue !== oldValue) { $scope.stepModels.queueMetadataForm = newValue; } } } // end of controller })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/steps/queue-metadata/queue-metadata.html0000664000175000017500000000045000000000000033273 0ustar00zuulzuul00000000000000

Queue Metadata

././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.585148 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/steps/subscription/0000775000175000017500000000000000000000000027326 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020600000000000011453 xustar0000000000000000112 path=zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/steps/subscription/subscription.controller.js 22 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/steps/subscription/subscription.controller.0000664000175000017500000000246500000000000034244 0ustar00zuulzuul00000000000000/** * Copyright 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; angular .module('horizon.dashboard.project.queues') .controller('horizon.dashboard.project.queues.steps.SubscriptionController', SubscriptionController); SubscriptionController.$inject = [ '$scope' ]; /** * @ngdoc controller * @name horizon.dashboard.project.queues.steps.SubscriptionController * @param {Object} $scope * @returns {undefined} Returns nothing * @description This controller is use for creating a subscription. */ function SubscriptionController($scope) { var ctrl = this; ctrl.subscription = { ttl: 3600 }; ctrl.update = false; $scope.stepModels.subscriptionForm = ctrl.subscription; } // end of SubscriptionController })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/steps/subscription/subscription.html0000664000175000017500000000457100000000000032747 0ustar00zuulzuul00000000000000

Subscription

Note that you can create a subscription without defining options.

Subscribers must be in the form of mailto, HTTP, or HTTPS.

The TTL for a subscription must be at least 60 seconds long.

././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.585148 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/table/0000775000175000017500000000000000000000000024533 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/table/queue.controller.js0000664000175000017500000001101100000000000030371 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 queueController * @ngController * * @description * Controller for the queues table */ angular .module('horizon.dashboard.project.queues') .controller('horizon.dashboard.project.queues.table.queueController', queueController); queueController.$inject = [ '$scope', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.dashboard.project.queues.basePath', 'horizon.dashboard.project.queues.events', 'horizon.dashboard.project.queues.resourceType', 'horizon.framework.conf.resource-type-registry.service' ]; function queueController($scope, zaqar, base, events, type, registry) { var ctrl = this; ctrl.queues = []; ctrl.queuesSrc = []; ctrl.resourceType = registry.getResourceType(type); ctrl.subsTemplate = base + 'table/subscription.html'; init(); initScope(); ////////// function initScope() { var createWatcher = $scope.$on(events.CREATE_SUCCESS, onCreateSuccess); var deleteWatcher = $scope.$on(events.DELETE_SUCCESS, onDeleteSuccess); var updateWatcher = $scope.$on(events.UPDATE_SUCCESS, onUpdateSuccess); var purgeWatcher = $scope.$on(events.PURGE_SUCCESS, onPurgeSuccess); var postMessageWatcher = $scope.$on(events.POST_MESSAGE_SUCCESS, onPostMessageSuccess); var subWatcher = $scope.$on(events.SUBSCRIPTION_CREATE_SUCCESS, broadcastEvents); $scope.$on('$destroy', function destroy() { createWatcher(); deleteWatcher(); updateWatcher(); purgeWatcher(); postMessageWatcher(); subWatcher(); }); } ////////// function init() { ctrl.resourceType.initActions($scope); zaqar.getQueues().then(showQueues); } function broadcastEvents(event, data) { if (event.targetScope !== $scope) { $scope.$broadcast(event.name, data); } } function showQueues(response) { // hz-table expects all items to have the id field // so we need to manually add name as id here ctrl.queuesSrc = response.data; ctrl.queuesSrc.map(function addIdentifier(queue) { queue.id = queue.name; }); } function refreshQueue(queueName) { zaqar.getQueue(queueName).then(function(response) { response.data.id = queueName; for (var i = 0; i < ctrl.queuesSrc.length; i++) { var queue = ctrl.queuesSrc[i]; if (queue.id === queueName) { ctrl.queuesSrc[i] = response.data; } } for (var i = 0; i < ctrl.queues.length; i++) { var queue = ctrl.queues[i]; if (queue.id === queueName) { ctrl.queues[i] = response.data; } } }); } function refreshSubscriptions(queueName) { var queue = new Object(); queue.name = queueName; zaqar.getSubscriptions(queue).then(function() { $scope.tCtrl.broadcastExpansion(queue); }); } function onCreateSuccess(e, newQueue) { e.stopPropagation(); newQueue.id = newQueue.name; ctrl.queuesSrc.push(newQueue); } function onDeleteSuccess(e, deletedNames) { // remove existing item from table e.stopPropagation(); for (var i = ctrl.queuesSrc.length - 1; i >= 0; i--) { var queue = ctrl.queuesSrc[i]; if (deletedNames.indexOf(queue.name) >= 0) { ctrl.queuesSrc.splice(i, 1); } } // clear selections upon deletion $scope.$emit('hzTable:clearSelected'); } function onUpdateSuccess(e, queue) { e.stopPropagation(); queue.id = queue.name; // update queue ctrl.queuesSrc[queue.id] = queue; } function onPurgeSuccess(e, queueName) { e.stopPropagation(); // purge queue refreshQueue(queueName); refreshSubscriptions(queueName); } function onPostMessageSuccess(e, queueName) { e.stopPropagation(); refreshQueue(queueName); } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/table/queue.html0000664000175000017500000000772500000000000026560 0ustar00zuulzuul00000000000000
Name Claimed Messages Free Messages Total Messages Actions
{$ q.name $} {$ q.claimed $} {$ q.free $} {$ q.total $}
Free Messages
{$ q.free $}
{$ key $}
{$ value $}
././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/table/subscription.controller.js0000664000175000017500000000540600000000000032004 0ustar00zuulzuul00000000000000/** * Copyright 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function() { 'use strict'; /** * @ngdoc overview * @name subscriptionController * @ngController * * @description * Controller for the subscriptions table */ angular .module('horizon.dashboard.project.queues') .controller('horizon.dashboard.project.queues.table.subscriptionController', subscriptionController); subscriptionController.$inject = [ '$scope', 'horizon.app.core.openstack-service-api.zaqar', 'horizon.dashboard.project.queues.events', 'horizon.framework.widgets.toast.service' ]; function subscriptionController($scope, zaqar, events, toast) { var ctrl = this; ctrl.queuesMap = {}; ctrl.deleteSubscription = deleteSubscription; init(); initScope(); ////////// function initScope() { var expandWatcher = $scope.$on('hzTable:rowExpanded', getSubscriptions); var createWatcher = $scope.$on(events.SUBSCRIPTION_CREATE_SUCCESS, addSubscription); $scope.$on('$destroy', function destroy() { expandWatcher(); createWatcher(); }); } function init() {} ////////// function checkAndInitMap(id) { if (!ctrl.queuesMap.hasOwnProperty(id)) { ctrl.queuesMap[id] = { subscriptions: [] }; } } function addSubscription(event, sub) { checkAndInitMap(sub.queueName); ctrl.queuesMap[sub.queueName].subscriptions.push(sub); } function deleteSubscription(queue, sub) { var msg = gettext('Removed %(subscriber)s subscriber from the %(queue)s queue.'); var context = { subscriber: sub.subscriber, queue: queue.name }; zaqar.deleteSubscription(queue.name, sub).success(deleteSuccess); function deleteSuccess() { toast.add('success', interpolate(msg, context, true)); var index = ctrl.queuesMap[queue.name].subscriptions.indexOf(sub); if (index >= 0) { ctrl.queuesMap[queue.name].subscriptions.splice(index, 1); } } } function getSubscriptions(event, queue) { zaqar.getSubscriptions(queue).success(function (response) { checkAndInitMap(queue.name); ctrl.queuesMap[queue.name].subscriptions = response; }); } } })(); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/dashboard/project/queues/table/subscription.html0000664000175000017500000000170200000000000030145 0ustar00zuulzuul00000000000000
Subscriber Time to Live Age Confirmed Options Actions
No subscribers to show.
{$ sub.subscriber $} {$ sub.ttl $} {$ sub.age $} {$ sub.confirmed $} {$ sub.options $}
././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5531456 zaqar_ui-18.0.0/zaqar_ui/static/framework/0000775000175000017500000000000000000000000020535 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1743591596.5531456 zaqar_ui-18.0.0/zaqar_ui/static/framework/util/0000775000175000017500000000000000000000000021512 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.585148 zaqar_ui-18.0.0/zaqar_ui/static/framework/util/validators/0000775000175000017500000000000000000000000023662 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/static/framework/util/validators/validateSubscriber.js0000664000175000017500000000320200000000000030032 0ustar00zuulzuul00000000000000/** * Copyright 2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ (function () { 'use strict'; /** * @ngdoc directive * @name validateSubscriber * @restrict A * * @description * A valid subscriber must be in the form of mailto, HTTP, or HTTPS. * This validator checks for the correct format. * * @example * ``` * * ``` */ angular .module('horizon.framework.util.validators') .directive('validateSubscriber', validateSubscriber); function validateSubscriber() { var regex = /^(http:\/\/\w+|https:\/\/\w+|mailto:\w+)/; var directive = { require: 'ngModel', restrict: 'A', link: link }; return directive; //////////////// function link(scope, element, attrs, ctrl) { if (!ctrl) { return; } ctrl.$parsers.push(subValidator); ctrl.$formatters.push(subValidator); function subValidator(value) { ctrl.$setValidity('validateSubscriber', regex.test(value)); return value; } } // end of link } // end of validateSubscriber })(); ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.585148 zaqar_ui-18.0.0/zaqar_ui/test/0000775000175000017500000000000000000000000016230 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/test/__init__.py0000664000175000017500000000000000000000000020327 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.585148 zaqar_ui-18.0.0/zaqar_ui/test/api_tests/0000775000175000017500000000000000000000000020223 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/test/api_tests/__init__.py0000664000175000017500000000000000000000000022322 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/test/api_tests/test_rest_api.py0000664000175000017500000000271100000000000023443 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 unittest import mock from openstack_dashboard.test import helpers as test from openstack_dashboard.test.test_data import utils from zaqar_ui.api.rest import zaqar from zaqar_ui.test import test_data TEST = utils.TestData(test_data.data) class ZaqarRestTestCase(test.TestCase): # Queues @mock.patch.object(zaqar, 'zaqar') def test_queue_get(self, client): # for check test env self.assertTrue(1 * 1 == 1) @mock.patch.object(zaqar, 'zaqar') def test_queue_create(self, client): # for check test env self.assertTrue(1 + 1 == 2) @mock.patch.object(zaqar, 'zaqar') def test_queue_delete(self, client): # for check test env self.assertTrue(1 - 1 == 0) def mock_resource(resource): """Utility function to make mocking more DRY""" mocked_data = \ [mock.Mock(**{'to_dict.return_value': item}) for item in resource] return mocked_data ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/test/helpers.py0000664000175000017500000000271300000000000020247 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 unittest import mock from openstack_dashboard.test import helpers from zaqarclient.queues.v2 import client as zaqar_client from zaqar_ui import api from zaqar_ui.test import test_data class APITestCase(helpers.APITestCase): """Extends the base Horizon APITestCase for zaqarclient""" def setUp(self): super(APITestCase, self).setUp() self._original_magnumclient = api.zaqar.zaqarclient api.zaqar.zaqarclient = lambda request: self.stub_zaqarclient() def _setup_test_data(self): super(APITestCase, self)._setup_test_data() test_data.data(self) def tearDown(self): super(APITestCase, self).tearDown() api.zaqar.zaqarclient = self._original_zaqarclient def stub_zaqarclient(self): if not hasattr(self, "zaqarclient"): zaqar_client.Client = mock.Mock() self.zaqarclient = zaqar_client.Client return self.zaqarclient ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.585148 zaqar_ui-18.0.0/zaqar_ui/test/integration_tests/0000775000175000017500000000000000000000000021775 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/test/integration_tests/__init__.py0000664000175000017500000000000000000000000024074 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/test/settings.py0000664000175000017500000000242700000000000020447 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. # Default to Horizons test settings to avoid any missing keys from horizon.test.settings import * # noqa from openstack_dashboard.test.settings import * # noqa # Update the dashboards with zaqar_ui import openstack_dashboard.enabled from openstack_dashboard.utils import settings import zaqar_ui.enabled # pop these keys to avoid log warnings about deprecation # update_dashboards will populate them anyway HORIZON_CONFIG.pop('dashboards', None) HORIZON_CONFIG.pop('default_dashboard', None) settings.update_dashboards( [ zaqar_ui.enabled, openstack_dashboard.enabled, ], HORIZON_CONFIG, INSTALLED_APPS ) # Ensure any duplicate apps are removed after the update_dashboards call INSTALLED_APPS = list(set(INSTALLED_APPS)) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/test/test_data.py0000664000175000017500000000145500000000000020557 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 openstack_dashboard.test.test_data import utils def data(TEST): # Test Data Container in Horizon TEST.queues = utils.TestDataContainer() # Queues queue_dict_1 = {"uuid": 1, "name": "test1"} TEST.queues.add(queue_dict_1) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591552.0 zaqar_ui-18.0.0/zaqar_ui/version.py0000664000175000017500000000116200000000000017310 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import pbr.version version_info = pbr.version.VersionInfo('zaqar-ui') ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1743591596.585148 zaqar_ui-18.0.0/zaqar_ui.egg-info/0000775000175000017500000000000000000000000016743 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591596.0 zaqar_ui-18.0.0/zaqar_ui.egg-info/PKG-INFO0000644000175000017500000000616500000000000020046 0ustar00zuulzuul00000000000000Metadata-Version: 2.1 Name: zaqar-ui Version: 18.0.0 Summary: Zaqar User Interface Home-page: https://docs.openstack.org/zaqar/latest/ Author: OpenStack Author-email: openstack-discuss@lists.openstack.org Classifier: Environment :: OpenStack Classifier: Framework :: Django 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.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Requires-Python: >=3.9 License-File: LICENSE Requires-Dist: pbr!=2.1.0,>=2.0.0 Requires-Dist: python-zaqarclient>=1.0.0 Requires-Dist: horizon>=17.1.0 ======================== Team and repository tags ======================== .. image:: https://governance.openstack.org/tc/badges/zaqar-ui.svg :target: https://governance.openstack.org/tc/reference/tags/index.html .. Change things from this point on ======== Zaqar UI ======== Horizon plugin for Zaqar * Free software: Apache license * Documentation: https://docs.openstack.org/zaqar-ui/latest/ * Release notes: https://docs.openstack.org/releasenotes/zaqar-ui/ * Source: https://opendev.org/openstack/zaqar-ui * Bugs: https://bugs.launchpad.net/zaqar-ui Enabling in DevStack -------------------- Add this repo as an external repository into your ``local.conf`` file:: [[local|localrc]] enable_plugin zaqar-ui https://github.com/openstack/zaqar-ui Manual Installation ------------------- Begin by cloning the Horizon and Zaqar UI repositories:: git clone https://github.com/openstack/horizon git clone https://github.com/openstack/zaqar-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 Zaqar UI with all dependencies in your virtual environment:: tools/with_venv.sh pip install -e ../zaqar-ui/ And enable it in Horizon:: cp ../zaqar-ui/zaqar_ui/enabled/_1510_project_messaging_group.py openstack_dashboard/local/enabled cp ../zaqar-ui/zaqar_ui/enabled/_1520_project_queues.py openstack_dashboard/local/enabled To run horizon with the newly enabled Zaqar 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=1743591596.0 zaqar_ui-18.0.0/zaqar_ui.egg-info/SOURCES.txt0000664000175000017500000001632600000000000020637 0ustar00zuulzuul00000000000000.eslintrc .zuul.yaml AUTHORS ChangeLog LICENSE MANIFEST.in README.rst babel-django.cfg babel-djangojs.cfg manage.py package.json requirements.txt setup.cfg setup.py test-requirements.txt test-shim.js tox.ini devstack/plugin.sh devstack/settings doc/requirements.txt doc/source/conf.py doc/source/index.rst doc/source/configuration/index.rst doc/source/contributor/api.rst doc/source/contributor/index.rst doc/source/install/index.rst releasenotes/notes/.placeholder releasenotes/notes/add-reno-73ba99b04ff2e5c8.yaml releasenotes/notes/drop-py-2-7-d9e918f5c9f3bb33.yaml releasenotes/notes/init-action-fe41bfe3e2473364.yaml releasenotes/notes/pike-9c813ecd64a1e2f2.yaml releasenotes/notes/pool-flavor-panel-acf61d32e34246f2.yaml releasenotes/notes/pool-panel-020bf94bc34b4cd8.yaml releasenotes/notes/queens-ae86cb21aebaadfd.yaml releasenotes/source/2023.1.rst releasenotes/source/2023.2.rst releasenotes/source/2024.1.rst releasenotes/source/2024.2.rst releasenotes/source/conf.py releasenotes/source/index.rst releasenotes/source/ocata.rst releasenotes/source/pike.rst releasenotes/source/queens.rst releasenotes/source/rocky.rst releasenotes/source/stein.rst releasenotes/source/train.rst releasenotes/source/unreleased.rst releasenotes/source/ussuri.rst releasenotes/source/victoria.rst releasenotes/source/wallaby.rst releasenotes/source/xena.rst releasenotes/source/yoga.rst releasenotes/source/zed.rst releasenotes/source/locale/de/LC_MESSAGES/releasenotes.po releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po releasenotes/source/locale/id/LC_MESSAGES/releasenotes.po releasenotes/source/locale/ja/LC_MESSAGES/releasenotes.po releasenotes/source/locale/ko_KR/LC_MESSAGES/releasenotes.po releasenotes/source/locale/zh_CN/LC_MESSAGES/releasenotes.po tools/install_venv.py tools/install_venv_common.py tools/with_venv.sh zaqar_ui/__init__.py zaqar_ui/karma.conf.js zaqar_ui/version.py zaqar_ui.egg-info/PKG-INFO zaqar_ui.egg-info/SOURCES.txt zaqar_ui.egg-info/dependency_links.txt zaqar_ui.egg-info/not-zip-safe zaqar_ui.egg-info/pbr.json zaqar_ui.egg-info/requires.txt zaqar_ui.egg-info/top_level.txt zaqar_ui/api/__init__.py zaqar_ui/api/zaqar.py zaqar_ui/api/rest/__init__.py zaqar_ui/api/rest/zaqar.py zaqar_ui/content/__init__.py zaqar_ui/content/pool_flavors/__init__.py zaqar_ui/content/pool_flavors/panel.py zaqar_ui/content/pool_flavors/urls.py zaqar_ui/content/pools/__init__.py zaqar_ui/content/pools/panel.py zaqar_ui/content/pools/urls.py zaqar_ui/content/queues/__init__.py zaqar_ui/content/queues/panel.py zaqar_ui/content/queues/urls.py zaqar_ui/enabled/_1510_project_messaging_group.py zaqar_ui/enabled/_1520_project_queues.py zaqar_ui/enabled/_2510_admin_messaging_group.py zaqar_ui/enabled/_2520_admin_pools.py zaqar_ui/enabled/_2530_admin_pool_flavors.py zaqar_ui/enabled/__init__.py zaqar_ui/locale/de/LC_MESSAGES/django.po zaqar_ui/locale/de/LC_MESSAGES/djangojs.po zaqar_ui/locale/en_GB/LC_MESSAGES/django.po zaqar_ui/locale/en_GB/LC_MESSAGES/djangojs.po zaqar_ui/locale/fr/LC_MESSAGES/django.po zaqar_ui/locale/id/LC_MESSAGES/django.po zaqar_ui/locale/id/LC_MESSAGES/djangojs.po zaqar_ui/locale/ja/LC_MESSAGES/django.po zaqar_ui/locale/ja/LC_MESSAGES/djangojs.po zaqar_ui/locale/ko_KR/LC_MESSAGES/django.po zaqar_ui/locale/ko_KR/LC_MESSAGES/djangojs.po zaqar_ui/locale/pt_BR/LC_MESSAGES/django.po zaqar_ui/locale/pt_BR/LC_MESSAGES/djangojs.po zaqar_ui/locale/ru/LC_MESSAGES/django.po zaqar_ui/locale/ru/LC_MESSAGES/djangojs.po zaqar_ui/locale/tr_TR/LC_MESSAGES/django.po zaqar_ui/locale/tr_TR/LC_MESSAGES/djangojs.po zaqar_ui/locale/zh_Hans/LC_MESSAGES/django.po zaqar_ui/locale/zh_Hans/LC_MESSAGES/djangojs.po zaqar_ui/static/app/core/openstack-service-api/zaqar.service.js zaqar_ui/static/dashboard/admin/pool-flavors/drawer.html zaqar_ui/static/dashboard/admin/pool-flavors/panel.html zaqar_ui/static/dashboard/admin/pool-flavors/pool-flavors.module.js zaqar_ui/static/dashboard/admin/pool-flavors/pool-flavors.scss zaqar_ui/static/dashboard/admin/pool-flavors/pool-flavors.service.js zaqar_ui/static/dashboard/admin/pool-flavors/actions/actions.module.js zaqar_ui/static/dashboard/admin/pool-flavors/actions/create.service.js zaqar_ui/static/dashboard/admin/pool-flavors/actions/delete.service.js zaqar_ui/static/dashboard/admin/pool-flavors/actions/update.service.js zaqar_ui/static/dashboard/admin/pool-flavors/actions/workflow.service.js zaqar_ui/static/dashboard/admin/pools/drawer.html zaqar_ui/static/dashboard/admin/pools/panel.html zaqar_ui/static/dashboard/admin/pools/pools.module.js zaqar_ui/static/dashboard/admin/pools/pools.service.js zaqar_ui/static/dashboard/admin/pools/actions/actions.module.js zaqar_ui/static/dashboard/admin/pools/actions/create.service.js zaqar_ui/static/dashboard/admin/pools/actions/delete.service.js zaqar_ui/static/dashboard/admin/pools/actions/update.service.js zaqar_ui/static/dashboard/admin/pools/actions/workflow.service.js zaqar_ui/static/dashboard/project/queues/queues.module.js zaqar_ui/static/dashboard/project/queues/queues.module.spec.js zaqar_ui/static/dashboard/project/queues/queues.scss zaqar_ui/static/dashboard/project/queues/actions/actions.module.js zaqar_ui/static/dashboard/project/queues/actions/create-queue.service.js zaqar_ui/static/dashboard/project/queues/actions/create-queue.workflow.js zaqar_ui/static/dashboard/project/queues/actions/create-subscription.service.js zaqar_ui/static/dashboard/project/queues/actions/create-subscription.workflow.js zaqar_ui/static/dashboard/project/queues/actions/delete-queue.service.js zaqar_ui/static/dashboard/project/queues/actions/list-message.controller.js zaqar_ui/static/dashboard/project/queues/actions/list-message.controller.spec.js zaqar_ui/static/dashboard/project/queues/actions/list-message.html zaqar_ui/static/dashboard/project/queues/actions/list-message.service.js zaqar_ui/static/dashboard/project/queues/actions/post-message.help.html zaqar_ui/static/dashboard/project/queues/actions/post-message.service.js zaqar_ui/static/dashboard/project/queues/actions/purge-queue.service.js zaqar_ui/static/dashboard/project/queues/actions/signed-url.service.js zaqar_ui/static/dashboard/project/queues/actions/update-queue.service.js zaqar_ui/static/dashboard/project/queues/actions/update-queue.workflow.js zaqar_ui/static/dashboard/project/queues/steps/queue-details/queue-details.controller.js zaqar_ui/static/dashboard/project/queues/steps/queue-details/queue-details.html zaqar_ui/static/dashboard/project/queues/steps/queue-metadata/queue-metadata.controller.js zaqar_ui/static/dashboard/project/queues/steps/queue-metadata/queue-metadata.html zaqar_ui/static/dashboard/project/queues/steps/subscription/subscription.controller.js zaqar_ui/static/dashboard/project/queues/steps/subscription/subscription.html zaqar_ui/static/dashboard/project/queues/table/queue.controller.js zaqar_ui/static/dashboard/project/queues/table/queue.html zaqar_ui/static/dashboard/project/queues/table/subscription.controller.js zaqar_ui/static/dashboard/project/queues/table/subscription.html zaqar_ui/static/framework/util/validators/validateSubscriber.js zaqar_ui/test/__init__.py zaqar_ui/test/helpers.py zaqar_ui/test/settings.py zaqar_ui/test/test_data.py zaqar_ui/test/api_tests/__init__.py zaqar_ui/test/api_tests/test_rest_api.py zaqar_ui/test/integration_tests/__init__.py././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591596.0 zaqar_ui-18.0.0/zaqar_ui.egg-info/dependency_links.txt0000664000175000017500000000000100000000000023011 0ustar00zuulzuul00000000000000 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591596.0 zaqar_ui-18.0.0/zaqar_ui.egg-info/not-zip-safe0000664000175000017500000000000100000000000021171 0ustar00zuulzuul00000000000000 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591596.0 zaqar_ui-18.0.0/zaqar_ui.egg-info/pbr.json0000664000175000017500000000005600000000000020422 0ustar00zuulzuul00000000000000{"git_version": "1a1800f", "is_release": true}././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591596.0 zaqar_ui-18.0.0/zaqar_ui.egg-info/requires.txt0000664000175000017500000000007500000000000021345 0ustar00zuulzuul00000000000000pbr!=2.1.0,>=2.0.0 python-zaqarclient>=1.0.0 horizon>=17.1.0 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1743591596.0 zaqar_ui-18.0.0/zaqar_ui.egg-info/top_level.txt0000664000175000017500000000001100000000000021465 0ustar00zuulzuul00000000000000zaqar_ui